好的,我们采用unittest和ddt数据驱动思想搭建测试框架,(对数据excel读取、yaml配置、Requests接口请求、Re参数化、Pymysql数据库效验、日志等模块实现封装),其中,用
1.Openpyxl来处理excel,存储测试数据(用例数据)
2.pyyaml来配置文件(configparse,pyyaml)
4.Requests请求库,来向接口发起请求
5.使用logging模块来创建日志器,记录项目中的日志信息
6.使用HttpTestRunner来生成HTML测试报告
7.使用re模块来实现参数化(正则匹配)
8.使用动态创建属性(类属性)的机制来实现接口之间的依赖 (setattr getattr)
比如:我们项目中客服指派订单的时候,需要上一个接口订单ID,首先要对上一个接口发送请求,获取订单id,通过实例化对象,创建属性名,获取属性值,从而实现指派订单接口的成功请求。
分层设计
为了提升接口自动化测试框架的拓展性、稳定性、完整性,进而提升测试效率,往往会将测试框架工程化,
整个流程会分为不同的层级,每个层级之间保持相对独立
cases
测试执行逻辑层,用于存放所有的测试用例类
configs
配置层,用于存放当前框架中的所有配置信息(使用不频繁,修改不频繁的数据)
datas
测试数据层,用于存放所有的测试数据,测试参数(可以使用excel,json,yaml,数据库来存储)
libs
自定义库文件层,用于存放自定义或者二次开发的库文件
logs
日志层,用于保存运行框架过程中产生的所有有效日志信息
reports
报告层,用于保存所有的测试报告文件(一般为html报告)
scripts
脚本封装层,用于保存所有的操作封装模块(yaml,excel,log.mysql,requests,参数化等)
run.py
用例启动文件,使用套件加载用例,批量执行并生成报告
数据驱动就是通过excel,yaml或者xml,数据库等数据结构来维护测试数据,通过相应的技术去处理,拿到测试数据用于测试,从而实现测试数据与代码的解耦,数据驱动测试的本质是高级的参数化。常用的ddt数据驱动
1 一个模块对应一个Excel表
2 一条接口对应一张sheet表
3 表中一行对应一条测试用例
4 在开始要注明测试时需要的sql
5.多参数传递可以用json解决
通过第三方库openpyxl来完成,项目只需要引入openpyxl库,通过它提供的api即可完成对于excel的操作,甚至于我们自己也可以做一些二次封装,使得操作更方便。一行数据就是一个用例。
一.Excel中的三大对象
WorkBook:工作簿对象
Sheet:表单对象
Cell:表格对象
二、openpyxl对Excel的操作
创建一个工作薄:wb = openpyxl.Workbook()
新增一个sheet表单:wb.create_sheet(‘test_case’)
保存case.xlsx文件:wb.save(‘cases.xlsx’)
打开工作簿:wb = openpyxl.load_workbook(‘cases.xlsx’)
选取表单:sh = wb[‘Sheet1’
读取第一行、第一列的数据:ce = sh.cell(row = 1,column = 1)
按行读取数据:row_data = list(sh.rows)
关闭工作薄:wb.close()
按列读取数据:columns_data = list(sh.columns)
https://www.cnblogs.com/wanglle/p/11455758.html
首先需要明确接口是通过什么机制来实现的鉴权
场景:b接口在调用的时候参数依赖于a接口的返回数据。
处理方案:
a接口调用完–》从响应中取出b依赖的这个参数–》保存起来–》b调用的时候,取出这个信息–》当做参数传过去即可。
保存方案:
参考问题5中的数据保存方式
可以自己准备单独的环境(独立的数据库),这样接口调用产生的数据可以在整个套件执行完后(@AfterSuite)通过执行sql脚本来完成数据删除。
Mysql,可以通过jdbc来实现数据库的增删查改等操作。
https://blog.csdn.net/kongsuhongbaby/article/details/84948205
数据验证主要包括两个方面:
接口响应报文的验证
利用jsonpath取出响应数据(大多数情况是json)中的关键字段的值,通过Assert断言这些关键字段的值是否符合预期。预期值和jsonpath取值表达式可以配置在excel中。
数据库表数据的验证
做表数据验证要先明白两点:
a. 表数据验证首先得明白这个接口的基本业务,会影响到哪些表,哪些字段的数据,然后才能准备查询sql去有针对性的查数据。
b. 并不是所有用例的执行都会操作数据库,影响到表数据,因此只有影响到了表数据的用例,才准备查询脚本。
具体做法:
Excel用例准备aa,bb,cc三列,aa传脚本,bb,cc两列分别用来回写用例执行前的sql查询结果和用例执行后的sql查询结果,两个数据对比即可知道数据变化是否满足预期。
1.减少excel读写,减少不必要的io操作
2.excel数据读取测试数据,全部存储到静态变量中)。
3.excel数据回写,尽量通过批量方式去写。
用过,unittest,pytest,这些测试框架都支持我们去定义测试套件,达到管理我们测试用例代码的作用,同时这些测试框架提供的一些丰富注解不仅能很方便的控制测试用例的执行顺序来控制整个测试流程,还能为各种测试场景的实现提供支撑。
常用操作:
seutp,teardown,适合单个测试用例的初始化、环境清理。
seutpClass,teardownClass:适合测试类的全局初始化、环境清理。
assertXXXX: 各种断言方式
testLoader的discover: 用来发现测试用例
testSuite的addTests: 用来装载测试用例
@ddt 数据驱动
htmlTestRunner:用来生成html测试报告
https://www.cnblogs.com/liudinglong/p/12846986.html
https://www.cnblogs.com/hp1991/p/11238559.html
一、用例编写规则
pytest可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。 pytest插件丰富,比如flask插件,可用于用例出错重跑;还有xdist插件,可用于设备并行执行。
二、用例前置和后置
1.unittest提供了setUp/tearDown,每个用例运行前、结束后运行一次。setUpClass和tearDownClass,用例执行前、结束后,只运行一次。
2.pytest提供了模块级、函数级、类级、方法级的setup/teardown,比unittest的setUp/tearDown更灵活。
pytest还可以在函数前加@pytest.fixture()装饰器,在测试用例中装在fixture函数。fixture的使用范围可以是function,module,class,session。
firture相对于setup和teardown来说有以下几点优势:
命名方式灵活,不局限于setup和teardown这几个命名
conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置,可供多个py文件调用。
scope=“module” 可以实现多个.py跨文件共享前置
scope=“session” 以实现多个.py跨文件使用一个session来完成多个用例
用yield来唤醒teardown的执行
三、断言
1.unittest提供了assertEqual、assertIn、assertTrue、assertFalse。
2.pytest直接使用assert 表达式。
四、报告
1.unittest使用HTMLTestRunnerNew库。
2.pytest有pytest-HTML、allure插件。
五、失败重跑
1、unittest无此功能。
2、pytest支持用例执行失败重跑,pytest-rerunfailures插件。
六、参数化
1、unittest需依赖ddt库,
2、pytest直接使用@pytest.mark.parametrize装饰器。
结合实例说一下自动化怎么做的
比如说平台端上架课程的接口自动化实现吧,首先需要登陆,使用requests的post请求登录获取登陆接口的token,将token带入到课程上架的接口中,根据写好的用例将用例代码化实现
由于get请求无请求体,post请求有请求体
使用params参数时,默认会把参数附加到url后面,所以发送get请求时应使用params参数
使用data参数时,参数会存放到请求体中,所以发送post请求时不能使用params,应使用data,除非接口及支持get又支持post,同样get请求也不能使用data参数