pytest是python自带的单元测试框架,是unitest的升级版本。使用框架的目的是“提高效率”,可以实现:
环境初始化和数据清除
定制化执行测试用例
配置--分布式执行
自带html报告(可根据需要使用allure报告)
安装:
pip install pytest
pip install pytest-html 原生态报告模版
查看安装结果:pip show pytest
注意事项:
使用pytest框架,默认识别“test”,所以:
1.测试用例必须以test开头,例如:test_A
2.测试类必须以Test开头(第一个字母大写)
3.对应的py文件必须以test_开头,或者_test结尾的;
4.断言必须使用assert
5.方法必须使用test开头
import pytest def test_A(): print('开始执行测试用例A') assert 1+2==3 if __name__=='__main__': pytest.main(['test_func.py',‘-s’]) #test_func.py是当前的文件,-s为输出信息,否则不会打印出print信息
pytest参数化
数据驱动,即pytest有自带的装饰器可以实现参数化,参数化有两种
1. 单个参数写法:@pytest.mark.parametrize('inData',[10,20]) #第一个参数为变量名称,第二个为参数值。不需要设置循环读取参数值,因为pytest的装饰器会自动循环读取
2. 多个参数写法:(参数值以元组形式写)@pytest.mark.parametrize('第一个参数名称,第二个参数名称'),[(参数1值,参数2值),(参数1值,参数2值)]
import pytest @pytest.mark.parametrize('a,b',[(1,2),(4,5)]) def test_a(a,b): print("开始执行测试用例") assert a+b==3 print(“测试用例执行结束”) if __name__=="__main__" pytest.main(['test.py','-v','-s'])
pytest运行指定测试用例
1.运行当前文件夹内的所有测试用例:pytest.main([文件夹名称/])
2.运行当前文件内的测试用例:pytest.main(['test.py'])
3.运行当前文件内的指定测试用例:pytest.main(['test.py::test_case'])
4.运行当前文件内指定类下的所有测试用例:pytest.main(['test.py::Test_class'])
5.运行当前文件内指定类下的指定测试用例:pytest.main(['test.py::Test_class::test_case'])
问题:pycharm运行脚本时,python自动识别pytest框架,此时运行时会出现“run pytest in xxx.py",此时默认执行当前文件内的所有test用例。pytest.maini()设置不生效
解决办法:
设置pytest.main([])后,点击pycharm的顶部菜单栏run-选择run xxx.py。这个时候就是按照pytest.main设置的模式执行指定测试用例
扩展:
在代码页面选中其中一条测试用例-就会出现:run pytest xxx.testcaseA,此时仅运行选中的测试用例(xxx为py文件名称)
pytest运行命令的常用参数说明
-v:说明:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等
-S:说明:输入我们用例中的调式信息,比如print的打印信息等
-m :说明:执行特定的测试用例,”标记“
-k: 说明:执行用例包含“关键字”的用例 ,"关键字"
-q: 说明:简化控制台的输出
--lf:当一次用例执行完成后,如果其中存在失败的测试用例,那么我们可以使用此命令重新运行失败的测试用例
--ff:如果上次测试用例出现失败的用例,当使用--ff后,失败的测试用例会首先执行,剩余的用例也会再次执行一次
--html:生成原生态的测试报告
练习:
执行测试用例时,同步打印出脚本内的print信息:pytest.main(['-s test.py::test_caseA','--html=../report/xt.html'])
接口实战
测试用例一般来自:excel、yaml文件
1.从excel读取body,并形成一个列表list_data=[{第一个用例内容},{第二个用例内容}]
2.使用pytest装饰器,自动循环读取用例@pytest.mark.parametrize('data',list_data)
3.通过bat文件一件执行
4.allure展示报告