一、pytest简介
-
pytest是一个非常成熟的python单元框架,比unittest更灵活,更容易上手。
-
pytest可以和selenium、requests、appium结合实现web自动化,接口自动化,app自动化测试
-
pytest可以实现测试用例的跳过以及reruns失败用例重试。
-
pytest可以和allure生成美观的测试报告。
-
pytest可以和jenkins持续集成。
-
pytest强大的插件:
-
pytest-html:生成html格式的自动化测试报告
-
pytest-xdist:测试用例分布式执行,多CPU分发。
-
pytest-ordering:用于改变测试用例的执行顺序
-
pytest-rerunfailures:用例失败后重跑
-
allure-pytest:生成美观的测试报告
-
批量添加插件方法:新建一个文件:requirements.txt,通过pip install -r requirements.txt
二、pytest使用规范以及基础应用
-
模块名必须以test_ 开头或者 _test结尾
-
测试类必须以Test开头,且不能有init方法
-
测试方法必须以test开头
三、pytest测试用例的运行方式
-
主函数模式:
-
运行所有:pytest.main()
-
指定模块:pytest.main(['-vs', '模块名'])
-
指定目录:pytest.main(['-vs', './目录名'])
-
通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成。
-
-
命令行模式
-
运行所有
-
指定模块
-
指定目录
-
-
通过读取pytest.ini配置文件运行。
-
pytest.ini这个文件他是pytest单元测试框架的核心配置文件
-
位置:一般放在根目录
-
编码:必须是ANSI格式
-
作用:改变pytest默认的行为
-
运行规则:不管事主函数模式,还是命令行模式都要读取这个配置文件
[pytest] addopts = -vs #命令行参数,用空格分隔 testpaths = ./<u>文件名</u> #测试用例路径,可自行配置。 python_files = test_*.py #模块名称开头 python_classes = test* #类名称开头 python_functions = test #方法名称开头
【需要使用notpad++修改编码格式】
3.2参数详解
-s:表示输出调试信息,包括print打印信息
-v:显示详细信息
-vs:这两个参数一起用
-n:支持多线程或者分布式运行测试用例,as:-n 2 、pytest.main(['-vs', './目录名','-n=2'])则为两个线程
--reruns 2:失败用例重跑 pytest.main(['-vs', './目录名','--reruns=2'])
-x:只要失败了一个就停止测试
--maxfail=2:失败两个用例就停止测试
-k:根据用例的部分字符测试指定用例 as:pytest.main(['-vs', './目录名','-k “xx”'])
-m:添加标记 @pytest.mark.自定义() 执行方法as:pytest.main(['-vs', '-m "smoke"'])
--html ./report/report.html:生成测试报告,在pytest.ini addopts中添加
3.3 pytest执行顺序
pytest:从上到下执行
unittest:通过asull码大小执行
改变顺序方法:通过mark加标记 as:@pytest.mark.run(order=1)则为第一个执行
-
四、如何分组执行(冒烟测试,分模块执行,分接口和web执行)
-
冒烟用例:
-
在用例上加标记 as:@pytest.mark.smoke
-
在pytest.ini中加上
markers = smoke:冒烟用例
-
运行程序:pytest -m 'smoke'
-
4.1pytest跳过测试用例
-
无条件跳过:@pytest.mark.skip(reason="原因")
-
有条件跳过:@pytest.mark.skipif(age>=18,reason="原因")
五、pytest框架实现一些前后置(固件,夹具)的处理
5.1 setup/teardown,setup_class/teardown_class
-
在每个类执行前的初始化工作:def setup_class(self):print('xxxx') 场景:创建日志对象,创建数据库的连接,创建接口的请求对象
-
在每个用例前的初始化工作:def setup(self):print('xxxx') 场景:web端时,打开浏览器,加载网页
-
在执行用例后的扫尾工作:def teardown(self):print('xxxx') 场景:web端时,关闭浏览器
-
在每个类执行后的扫尾工作:def teardown_class(self):print('xxxx') 场景:销毁日志对象,断开数据库的连接,销毁接口的请求对象
5.2 使用@pytest.fixture()装饰器来实现部分用例的前后置。
@pytest.fixture(scope="", params="", autouse="", ids="", name="")
-
scope:表示被@pytest.fixture标记的方法的作用域。function(默认),class,module,package/session。
-
params:参数化,支持列表[],元祖(),字典列表[{},{}],字典元祖({},{})
@pytest.fixture(scope='function', params=['茶π', '杯子']) def my_fixture(request): print('前置') yield request.param print('后置') class TestLogin: def test_01_gyj(self): print('测试一下') def test_02_ggg(self, my_fixture): print('啦啦啦') print('--------------'+str(my_fixture))
-
autouse=true:自动执行,全部实现前后置。默认为false
-
ids:当使用params参数化时,给每一个值设置一个变量名。意义不大
-
name:给表示的是别@pytest.fixture标记的方法去一个别名,使用别名后就得使用别名
@pytest.fixture(scope='function', params=['茶π', '杯子'], ids=['chapai', 'beizi'], name='aaaa') def my_fixture(request): print('前置') yield request.param print('后置') class TestLogin: def test_01_gyj(self): print('测试一下') def test_02_ggg(self, aaaa): print('啦啦啦') print('--------------' + str(my_fixture))
5.3通过conftest.py和@pytest.fixture()结合使用实现全局的前置应用(as:项目的全局登录,模块的全局登录)
-
conftest.py文件是单独存放的一个夹具配置文件,名称不能更改。
-
用处可以在不同的的py文件中使用同一个fixture函数。
-
原则上conftest.py需要和运行的用例放到同一层,并且不需要做任何的import导入操作
5.4 总结
-
setup/teardown,setup_class/teardown_class是作用于所有用例或者所有的类。
-
@pytest.fixture() 他的作用是既可以部分也可以全部前后置。
-
conftest.py和@pytest.fixture()结合使用,作用于全局的前后置。
六、allure-pytest报告
-
将bin路径配置到path中
-
验证是否安装:allure --version。重启pycham
-
在pytest.ini中添加--alluredir ./temp 生成json格式的临时文件
-
在all.py中添加os.system('allure generate ./temp -o ./report --clean')
-
allure generate 固定语法
-
./temp临时json格式报告的路径
-
-o 表示输出 output
-
./report 生成allure报告的路径
-
--clean 清空./report路径下原来的报告
-