Python+requests搭建接口自动化测试框架

news2024/9/21 18:56:38

一、接口自动化的意义(为什么做这个框架)

            新版本上线时之前版本的功能需要进行回归测试,导致大量的重复性手工测试。引入自动化测试可以使用自动化技术代替部分手工的回归性测试,解放更多人力做其它更有必要的事情。但目前项目UI变动频繁,而接口一般不会做大变动所以先暂时做接口自动化。使用接口自动化可以做上线前接口功能的回归性测试,也可以定时巡检线上环境接口的运行情况,能及时发现线上环境接口问题并解决。同时此框架可以帮助不会写代码的测试同事进行接口自动化的相关工作。

二、准备工作

    开发语言:Python3

    需要安装的模块:

        Requests: python的一个HTTP客户端库,和urllib、urllib2类似。

                1、安装方法:

使用pip安装

pip install Requests

或 

python3 -m pip install Requests

                                                       

                              下载源码后安装

git clone git://github.com/kennethreitz/requests.git

cd requests

python setup.py install

                2、学习路径:

        xlsxwriter :是python用来构造xlsx文件的模块,可以完成xlsx文件的自动化构造,包括:合并单元格,制作excel图表等功能。

                1、安装方法:

使用pip安装

pip install Requests

或 

python3 -m pip install Requests

            

                2、学习路径:

三、框架流程及逻辑

    框架理念:使用json文件编写测试用例,建一个脚本循环读取测试用例并执行,然后对比返回的接口和用例中的期望结果。将测试结果写入到一个excel表格中生成测试报告,最后使用发送邮件功能将测试报告发送到指定邮箱。其中对所有公共方法进行封装并放在common公共文件目录下。        

 

四、各模块介绍

 

----interface_test                             项目文件夹目录

    ----common                                存放公共方法目录

            ----__init__.py                    初始化文件

            ----conf.py                          操作配置文件相关方法

            ----excelaction.py                Excel文件相关操作方法

            ----jsonaction.py                 Json文件相关操作方法

            ----logger.py                       记录日志的相关方法

            ----newfile.py                      获取最新文件的相关方法

            ----sendmail.py                   发送报告到指定邮箱的相关方法

            ----signture.py                    对数据进行签名的相关方法

            ----userinfo.py                    获取用户信息的相关方法

            ----config_test.conf             基本配置文件

    ----logs                                       存放日志的目录

    ----report                                    存放测试报告的目录

    ----test_data                                存放测试用例数据的目录

            ----login-1.json                    登录接口的测试用例数据

            ----logout-2.json                  退出登录接口的测试用例数据

    ----execute_test.py                       读取测试用例并执行测试用例

    ----test.bat                                    运行测试项目的批处理文件


execute_test.py 主要程序


  1 # -*- coding: utf-8 -*-                                                                
  2 #!/usr/bin/env python                                                                
  3 import os                                                                                        
  4 import json                                                                                    
  5 import requests                                                                                            
  6 import common.conf as conf                                                                                                                        
  7 import common.excelaction as excelaction                                                                                                                
  8 from common.sendemail import sendreport                                                                                                            
  9 from common.signture import sign                                                                                            
 10 import common.userinfo as userinfo                                                                                                        
 11 import common.logger as logger                                                                                                                        
 12 import sys                                                                                                                                
 13 import time                                                                                                                                
 14                                                                                                                                                                                         
 15 #data_path = os.path.dirname(__file__) + '\\test_data\\' # 测试用例数据文件所在目录                                                                            
 16 data_path = conf.testdata_path                                                                                                                    
 17                                                                                                                                                                                             
 18 test_reports = [] # 添加一个数组用来存储测试结果                                                                                                      
 19 for file in os.listdir(data_path): # 循环读取目录下的文件                                                                                                                                                 
 20     child = os.path.join('%s%s'%(data_path,file)) # 将文件名和路径拼接好                                                                                
 21     logger.info("当前打开的文件:"+child)                                                                                                                                   
 22     fl = open(child) # 打开文件                                                                                                                                             
 23     try:                                                                                                                                                                                                
 24         cases = json.load(fl)                                                                                                                    
 25         for key in cases: # 循环读取文件中的测试用例(case)                                                                                            
 26             start_time = time.clock()                                                                                                            
 27             case = cases[key]                                                                                                                
 28             url = conf.get_conf('module',case['module']) + case['url']                                                                                                        
 29             data = case['data']                                                                                                                    
 30             data['Platform'] = conf.get_conf('params','Platform')                                                                                            
 31             data['Terminal'] = conf.get_conf('params','Terminal')                                                                        
 32             data['UserIP'] = conf.get_conf('params','UserIP')                                                                                        
 33             data['Version'] = conf.get_conf('params','Version')                                                                                            
 34             if "UserToken" in data and data['UserToken'] == '':                                                                                                    
 35                 data['UserToken'] = userinfo.get_token()                                                                                                
 36             hope_result = case['assert']                                                                                                
 37             method = case['method']                                                                                                    
 38             test_report = {                                                                                                                        
 39                 "case_id":case['id'],                                                                                                                
 40                 "t_name":case['name'],                                                                                                                
 41                 "method":method,                                                                                                                    
 42                 "url":url,                                                                                                                                
 43                 "params":data,                                                                                                                
 44                 "hope_result":hope_result,                                                                                                    
 45                 "actual_result":[],                                                                                                                    
 46                 "test_result":""                                                                                                                                
 47             }                                                                                                                                                                   
 48             try:                                                                                                                                                    
 49                 if method == 'post':                                                                                                                            
 50                     addsign_data = sign(data,conf.get_conf('sign','api_key'))                                                                                    
 51                     r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)                                                                            
 52                     response = r.json()                                                                                                    
 53                     s = True                                                                                                                    
 54                     for k in hope_result:                                                                                                            
 55                         ar = str(k) + ":" + str(response[k])                                                                                                
 56                         test_report["actual_result"].append(ar)                                                                                            
 57                         if type(hope_result[k]) == type(''):                                                                                                
 58                             if hope_result[k] in response[k]:                                                                                            
 59                                 s = s&True                                                                                                            
 60                             else:                                                                                                                    
 61                                 s = s&False                                                                                                        
 62                         else:                                                                                                                                
 63                             if hope_result[k] == response[k]:                                                                                            
 64                                 s = s&True                                                                                                                                                                                            
 65                             else:                                                                                                                
 66                                 s = s&False                                                                                                                
 67                     if s:                                                                                                                                   
 68                         test_report["test_result"] = "PASS"                                                                                            
 69                     else:                                                                                                                            
 70                         test_report["test_result"] = "Fail"                                                                                        
 71                                                                                                                                                                                                     
 72                 elif method == 'get':                                                                                                        
 73                     addsign_data = sign(data,conf.get_conf('sign','api_key'))                                                                                    
 74                     r = requests.get(url,params=addsign_data,headers=conf.header)                                                                            
 75                     response = r.json()                                                                                                        
 76                     s = True                                                                                                                                
 77                     for k in hope_result:                                                                                                            
 78                         ar = str(k) + ":" + str(response[k])                                                                                        
 79                         test_report["actual_result"].append(ar)                                                                                        
 80                         if type(hope_result[k]) == type(''):                                                                                                    
 81                             if hope_result[k] in response[k]:                                                                                                    
 82                                 s = s&True                                                                                                            
 83                             else:                                                                                                                
 84                                 s = s&False                                                                                                                    
 85                         else:                                                                                                                                    
 86                             if hope_result[k] == response[k]:                                                                                                        
 87                                 s = s&True                                                                                                                            
 88                             else:                                                                                                    
 89                                 s = s&False                                                                                                                
 90                     if s:                                                                                                        
 91                         test_report["test_result"] = "PASS"                                                                                                    
 92                     else:                                                                                                                                
 93                         test_report["test_result"] = "Fail"                                                                                                        
 94                                                                                                                                                                             
 95                 else:                                                                                                                                    
 96                     print(u'暂不支持该请求方式')                                                                                                                                    
 97                 test_reports.append(test_report)                                                                                                                        
 98                 end_time = time.clock()                                                                                                                    
 99                 str_time = '当前执行的用例:' + key + '_'*4 + '用例执行所用时间:' + str(end_time-                                                                                                    start_time) + 's'                                                                                                                                    
100                 logger.info(str_time)                                                                                                        
101             except:                                                                                                                                
102                 error_msg = sys.exc_info()                                                                                                                                        
103                 logger.error(error_msg)                                                                                                                
104                 continue                                                                                                                                    
105     except:                                                                                                                                    
106         error_msg = sys.exc_info()                                                                                                                
107         logger.error(error_msg)                                                                                                                    
108         continue                                                                                                                                            
109                                                                                                                                                                                                 
110 excelaction.creat_report(test_reports) #生成测试报告                                                                                        
111 sendreport() #发送测试报告         

五、具体使用

1、在配置文件做对应项目的基础配置

[email] -- 邮箱相关配置

sender = ***@163.com -- 发件邮箱

receiver = ***@163.com -- 收件邮箱

smtpserver = smtp.163.com -- 发件邮箱服务器

username = ***@163.com -- 发件邮箱账户名

password = **** -- 发件邮箱密码(用于第三方登录的秘密)

[module] -- 模块相关接口域名配置

passport = http://passport.XXX.com/ -- 对应模块接口域名

[sign] -- 签名相关的配置

api_key = XXX-XXX -- 生成签名的key(填写项目对应的key)

[params] -- 接口参数配置(配置公共参数)

Platform = 1 -- 根据对应项目配置对应的公共参数和对应值

2、在test_data文件夹内用json文件写测试用例和对应参数 

"case1":{
    "name":"登录接口_测试正常登录",        -- 接口名称(或者接口简介)
    "module":"passport",                -- 接口所属模块
    "url":"/api/Passport/Login",            -- 接口地址(完整地址由模块对应域名+该地址拼接)
      "method":"post",                    -- 接口请求方式
      "id":"1-001",                        -- 用例ID
    "data":{                            -- 接口请求参数(请求时由该参数加公共参数)
        "UserName":"XXX",                -- 接口请求参数(根据具体接口补充,如果接口需要token则需要加token关键字(值为空就行),接口请求时会自动根据参数生成Sign,如果想自己定义则需要加Sign关键字(值填写自己定义的))
        },
    "assert":{                            -- 该条测试用例的断言条件
        "Status":200,                    -- 具体的断言条件,需要返回状态为200
        "Message":"登录成功"            -- 具体的断言条件
        }
    }

3、配置好基础配置和编写完测试用例后,运行项目中的test.bat文件。运行完成后会在report文件夹内生成测试报告文件,在logs文件夹内会生成测试运行过程中的记录日志和报错日志(如果有)。

Python接口自动化测试零基础入门到精通(2024最新版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

antv/x6_2.0学习使用(五、路由)

X6 默认提供了以下几种路由: 路由名称说明normal默认路由,原样返回路径点orth正交路由,由水平或垂直的正交线段组成oneSide受限正交路由,由受限的三段水平或垂直的正交线段组成manhattan智能正交路由,由水平或垂直的正交线段组成…

机器学习-线性回归实践

目标:使用Sklearn、numpy模块实现展现数据预处理、线性拟合、得到拟合模型,展现预测值与目标值,展现梯度下降; 一、导入模块 import numpy as np np.set_printoptions(precision2) from sklearn.linear_model import LinearRegr…

使用Pipeline和ColumnTransformer提升机器学习代码质量

机器学习项目中最冗长的步骤通常是数据清洗和预处理,Scikit-learn库中的Pipeline和 and ColumnTransformer通过一次封装替代逐步运行transformation步骤,从而减少冗余代码量。 1. Pipeline vs. ColumnTransformer 训练模型前,需要将数据集分…

windows系统如何查看扇区?

windows系统如何查看扇区? 首先,我们按WindowsR 弹出"运行"对话框,打开文本框输入"MSINFO32.EXE"命令 展开左侧"组件"节点 接下来,我们选择"组件|存储|磁盘"文件夹 在其里面即可查看硬盘…

PostGIS学习教程二十:3-D

PostGIS学习教程二十:3-D 注意:本文介绍许多PostGIS2.0及更高版本才支持的功能。 文章目录 PostGIS学习教程二十:3-D一、3-D几何图形二、3-D函数三、N-D索引 一、3-D几何图形 到目前为止,我们一直在处理2-D几何图形(…

【Redis】非关系型数据库之Redis的主从复制、哨兵和集群高可用

目录 一、主从复制、哨兵、集群的区别 二、主从复制 2.1主从复制的作用 2.2主从复制的原理 2.3主从复制的实操 步骤一:环境准备 步骤二:安装Redis以及配置文件修改 Redis的主从配置文件都一样 步骤四:验证主从复制 三、哨兵 3.1哨兵…

盘点:最适合布偶猫的三款主食冻干,K9、sc、希喂,你选对了吗?

喂养布偶猫的秘诀:如何满足其食肉天性同时呵护其肠胃?主食冻干来解答!它不仅符合猫咪天然的饮食结构,还采用新鲜生肉为原料。搭配其他营养元素,既美味又营养,还能增强抵抗力。我们将为您测评市场上热门的k9…

【Docker】Docker基础

文章目录 安装使用帮助启动命令镜像命令容器命令 安装 # 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine # 设置存储库 sudo yum install -y yum-utils …

浅析内存一致性:内存屏障

文章目录 概述内存乱序访问Store Buffer和Invalidate QueueStore BufferStore ForwardingStore Buffer与内存屏障 Invalidate QueueInvalidate Queue与内存屏障 内存屏障分类编译器屏障CPU内存屏障 相关参考 概述 内存屏障,是一类同步屏障指令,是CPU或编…

《数据结构、算法与应用C++语言描述》-红黑树的C++实现-百万级数据量测试通过

红黑树 完整可编译运行代码见仓库:GitHub - Jasmine-up/Data-Structures-Algorithms-and-Applications/_3matrix。 如有问题请在评论区指出。另外,Github仓库会根据我的学习情况持续更新,欢迎大家点star,谢谢。 基本概念 红-黑…

【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data

问题:【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data 解决方案: 1.在示例中修改showDraw()方法的data数据,实现以下环状面效果 2.示例链接: 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 export f…

Avalonia学习(二十一)-自定义界面演示

今天开始继续Avalonia练习。 本节&#xff1a;自定义界面 在网上看见一个博客&#xff0c;根据需要演示一下。 前台代码 <Window xmlns"https://github.com/avaloniaui"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:vm"using:…

python画房子

前言 今天&#xff0c;我们来用Python画房子。 一、第一种 第一种比较简单。 代码&#xff1a; import turtle as t import timedef go(x, y):t.penup()t.goto(x, y)t.pendown() def rangle(h,w):t.left(180)t.forward(h)t.right(90)t.forward(w)t.left(-90)t.forward(h) de…

解决Qt Creator中文乱码的问题

方法1 使用QStringLiteral()包裹中文字符串 QString str1"中文测试&#xff01;"; QString str2QStringLiteral("中文测试&#xff01;");方法2 #if _MSC_VER > 1600//MSVC2015>1899,MSVC_VER14.0 #pragma execution_character_set("utf-8&qu…

Java里的实用类

1.枚举 语法&#xff1a; public enum 变量名{ 值一&#xff0c;值二} 某个变量的取值范围只能是有限个数的值时&#xff0c;就可以把这个变量定义成枚举类型。 2…装箱&#xff08;boxing&#xff09; 和拆箱&#xff08;unboxing&#xff09; 装箱&#xff08;boxing&…

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…

Java经典框架之Dubbo

Dubbo Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Dubbo概述 2. Dubbo基本应用 3…

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 分段锁的好处&#xff1a; 结语 我的其他博客 前言 在Java 8中&#xff0c;ConcurrentHashMap的实现经历了重大的改进&am…

新AI图像分割方法GenSAM:一个提示实现批量图片分割

近期&#xff0c;研究人员提出了一种新型图像分割方法&#xff0c;称为Generalizable SAM&#xff08;GenSAM&#xff09;模型。该模型的设计目标是通过通用任务描述&#xff0c;实现对图像的有针对性分割&#xff0c;摆脱了对样本特定提示的依赖。在具体任务中&#xff0c;给定…

C# 强制类型转换和as区别和不同使用场景

文章目录 1.强制类型转换2. as 运算符3.实例总结&#xff1a; 在C#中&#xff0c;as 和 强制类型转换&#xff08;例如 (T)value&#xff09;的主要区别在于它们处理类型转换不成功时的行为和适用场景&#xff1a; 1.强制类型转换 使用语法&#xff1a;Type variable (Type)…