Python+pytest+requests+openpyxl+pymysql+logure+allure+jenkins
分为common层 testcases层 testdatas层 conf层 outPuts层
common层:工具类,读取Excel,存放文件的路径,连接数据库并进行查询,接口请求,存放数据,数据替换,结果断言,装饰器
testcases层:测试案例,conftest.py中夹具共享
testdatas层:管理测试用例数据
conf层:配置文件,存放全局数据和一些容易变动的数据
outPuts层 :日志输出
main.py:案例执行入口(收集用例,执行用例,生成报告)
requests、pytest、openpyxl、pymysql、logger、jsonpath、re、allure
接口中的返回值利用jsonpath提取动态存储到类属性中,当其他接口需要用到时,再提取出放到请求参数中
相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,利用第三方库pytest的装饰器实现数据驱动@pytest.mark.parametrize(“case”, cases)
字典是python语言的一种数据类型, json是一种轻量级的数据交换格式,在网络中传输的通用数据。json本质上还是字符串,只是按key:value这种键值对的格式来的字符串
一般是利用第三方插件pytest-xdist,前提是用例之间没有依赖关系且执行是没有顺序的,所以不适合接口自动化
有利于提高自动化用例的稳定性,可以通过pytest的pytest-rerunfailures插件来实现用例重跑,具体有两种形式,一种是全局通过命令行: Pytest --reruns 2 --reruns-delay 5,一种是局部在案例方法上打标记@pytest.mark.flaky(reruns=2, reruns_delay=1)
(1) 用例的入参过多时不小心有了空格,会报参数错误, 解决:case_str=case_str.replace(“\n”, “”).replace(“\r”, “”)#Enter = 回车+换行(\r\n)
(2)读取excel案例时,excel中整个空行有的也被读取了,导致读取执行时多执行了一条案例且这条案例报错.
解决:根据行获取列,循环列获取单元格中的值,如果有一个单元格有值,就代表这一行可取,如果都是空则不可取
(3)删除刚刚新增的数据时发现新增的接口返回值没有特定的标记,导致删除接口时入参不能确定就是刚新增的数据
解决:
获取数据库表中最新的一条数据,进行删除(弊端,有可能把别人的数据删掉);
找开发把新增接口返回值标记加下
短信群发功能,新建群发-短信类型选择直播短信时,直播时间前端合代码覆盖了,所以点击确定,没有请求接口,无反应
1.数据库断言会把一条案例断言结果Ture或False放在一个字典里,为了不影响下条案例的断言结果,每条用例执行完后,需要清空对比结果,这时需要利用pytest的confest.py中装饰器@pytest.fixture的后置函数yield把字典置空
2.数据库脏数据一般都是新增接口导致的,所以新增成功后可以执行删除接口把新增的数据删除,(注意:如果新增接口返回值没有具体的内容,这时要利用数据库获取最新的一条数据,有个弊端就是有可能把别人的数据删掉,所以尽量跟开发沟通新增接口返回值里有个标记)
3.专门有一个自动化数据库,定期清除数据
1.用例设计规则
unittest:
(1)试类必须继承unittest.TestCase
(2)测试函数必须以”test_”开头
pytest:
(1)测试文件的文件名必须以”test_”开头,或者以”_test”结尾
(2)测试类命名必须以”Test”开头
(3)测试函数名必须以”test”开头
2.断言
unittest:
assertXXX
pytest:
直接使用assert进行断言
3.用例前置和后置
unittest:
(1)通过setup每个用例执行前执行,teardown每个用例执行后执行
(2)通过setupclass类里面所有用例执行前执行,teardownclass类里面所有用例执行后执行
每个测试文件必须单独设置前后置
pytest:
通过fixture夹具可以自定义pytest的前置和后置,yield之前是为前置,yield之后为后置,格式@pytest.fixture(scope=“XXX”),scope:有四个级别,function(默认),class,module,session
创建conftest.py文件,当前目录下所有的测试文件都能自动调用该夹具
4.参数化
unittest:参数化需要依赖第三方库,使用ddt去做参数化
pytest:通过装饰器@pytest.mark.parametrize来实现
5.报告展示
unittest:通过HTMLTestRunner生成
pytest:可以集成allure插件生成
6.失败重运行
unittest:不支持
pytest:pytest --reruns=2(2表示重运行2次)
7.挑选用例执行
unittest:不支持
pytest:
(1)创建一个pytest.ini文件,
[pytest]
markers = demo(标记名) : just for display(备注名,如果不写 可以不加冒号)
(2) 在要执行的测试用例/测试类前面加上: @pytest.mark.标记名
(3)main.py文件中添加[-m ,‘要执行用例的标签名’] 根据标签名筛选用例并执行
8.安装需求不同
pytest为第三方单元测试库,需额外安装;unittest为标准库,无需额外安装
1.无条件跳过[email protected]()
在测试方法或类前面加上装饰器@pytest.mark.skip(reason=None),表示该条测试用例不执行,参数reason代表跳过的原因,reason可省略
2.有条件跳过[email protected]()
@pytest.mark.skipif(condition, reason=“xxx”)
说明:condition—跳过的条件,如果为True则跳过该函数,如果为False则不跳过
全局:测试报告清除处理,测试账号准备-》打开Excel,读取对应的接口测试数据 -》 定义一个测试类:写接口的测试用例,使用pytest的数据驱动 -》 处理请求数据,若有替换就替换 -》发起请求,有token就传token -》得到响应结果 -》如果有提取字段,那么需要从响应结果当中,提取对应的数据 -》响应结果断言 -》数据库断言