python 之 pytest框架
一、pytest 单元测试框架
1、什么是单元测试,针对软件的最小单位(函数,方法,接口)进行正确性的检查测试。
2、单元测试框架(按语言分)
java : junit 和testing
python : unittest 和 pytest
3、单元测试主要是做什么呢?
(1)、测试发现:从多个文件里面去找到测试用例
(2)、测试执行:按照一定的顺序和规则去执行。并生成结果
(3)、测试判断:通过断言判断预期结果和实际结果的差异
(4)、测试报告:测试统计进度,耗时,通过率,生成测试报告
二、pytest简介
1、pytest是一个非常成熟的python的单元框架,比unittest更灵活,容易上手。
2、pytest可以和selenium,requests,applum结合实现web自动化,接口自动化,app自动化
3、pytest可以实现测试用例的跳过以及reruns失败用例重试
4、pytest可以和allure生成非常美观的测试报告
5、pytest可以和Jenkins持续集成
6、pytest有很多强大的插件,并且这些插件能够实现很多的使用的操作
例如:
pytest
pytest-xdist -- 测试用例分布式执行,多CPU分发
pytest-ordering -- 用于改变测试用例的执行顺序
pytest-rerunfailures -- 用例失败后重跑
pytest-html -- 生成html格式的自动化测试报告
allure-pytest -- 用于生成美观的测试报告
三、使用pytest,默认的测试用例的规则以及基础应用
1、模块名必须以test_开头或者_test结尾
2、测试类必须以Test开头,并且不能用init方法
3、测试方法必须以test开头
四、pytest 测试用例的运行方式
1、主函数模式
(1)运行所有:pytest.main()
(2)指定模块:pytest.main(['-vs','test_login.py'])
(3)指定目录:pytest.main(['-vs','/interface'])
(4)通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest.main(['-vs','/interface/test_login.py:test_01'])
2、命令行模式
(1)运行所有:pytest
(2)指定模块:pytest -vs test_login.py
(3)指定目录:pytest -vs /interface
参数详解:
-s:表示输出调试信息,包含print打印的信息
-v:显示更多的信息
-vs:上面两个参数一起用
-n:支持多线程或者分布式运行测试用例
例:pytest -vs /interface/test_login.py -n 2 (分两个线程)
--reruns num:失败用例重跑(num重跑次数)
-x:表示只要一个用例报错,测试停止
--maxfail=2 出现两个用例失败停止
-k:根据测试用例的部分字符串指定测试用例
例:pytest -vs 。/interface -k "ao"
--html ./interface/interface.html:在interface目录下生成html的测试报告
3、通过读取pytest.ini配置文件运行
pytest.ini文件是pytest单元测试框架的核心配置文件
(1)、位置:一般在项目的根目录
(2)、编码:必须是ANSI,可以使用notpad++修改编码格式
(3)、作用:改变pytest默认的行为
(4)、运行的规则:不管是主函数模式运行,命令行模式也能行,都会去读取这个配置文件
例:
[pytest]
addopts = -vs --html ./report.html -- 参数
testpaths = ./web -- 测试用例路径
python_files = test_*.py -- 模块名的规则
python_classes = Test* -- 类名的规则
pythonn_functions = test -- 方法名规则
markers = -- 标记用例
smoke:冒烟测试
五、pytest 用例的执行顺序是怎么样的?
unittest 以ASCLL的大小来执行
pytest默认从上到下
改变默认执行顺序,就用mark标记
例:@pytest.mark.run(order = 3)
六、如何分组执行(冒烟,分模块执行,分接口和web执行)
smoke:猫眼用力,分布在各个模块
pytest -m "smoke" -- 就会执行带有smoke标记的模块
pytest -m "smlke or smoke ir smoke2" -- 执行多个
七、pytest跳过测试用例
1、无条件跳过
@pytest.mark.skip(reason = "单纯想跳过")
2、有条件跳过
@pytest.mark.skip(age>18,reason = "跳过年纪大于18的")