pytest使用简介pytest是基于py unittest的一个单元测试框架,用起来比unittest简单不少,不过和unittest使用不太一样,总结如下:格式:case的py文件名必须是test开头
def用例必须是test开头
class名必须是Test开头,注意大写
class中的def用例必须是test开头pytest会找当前文件夹以及递查找子文件夹下面所有的test_*.py或*_test.py的文件,把其当作测试文件
在这些文件里,pytest会收集下面的一些函数或方法,当作测试用例
不在类定义中的以test_开头的函数或方法
在以Test开头的类中(不能包含__init__方法),以test_开头的方法
pytest也支持unittest模式的用例定义pytest提供了很多运行参数,比较常用的有:-k:只执行指定的用例
-s:命令行显示测试代码的输出,如果需要输出html结果最好不要-s
-v:显示详细信息
-q:不显示详细信息
--html=path:输出测试结果到html
安装Pytest
cmd运行
pip install -U pytestpip3 install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
查看版本
pytest --version知识点
如果只执行 pytest ,会查找当前目录及其子目录下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以 test 开头函数并执行
如果只想执行某个文件,可以 pytest start.py
加上-q,就是显示简单的结果: pytest -q start.py Pytest用例的设计原则
用Pytest写用例时候,一定要按照下面的规则去写,否则不符合规则的测试用例是不会执行的文件名以 test_*.py 文件和*_test.py
以 test_ 开头的函数
以 Test 开头的类,不能包含 __init__ 方法
以 test_ 开头的类里面的方法
所有的包 pakege 必项要有__init__.py 文件Pytest执行用例规则
注意,下面讲的都是在cmd中执行pytest命令1、当前目录下所有的用例
pytest先进入根目录,然后执行某个目录下的所有用例
pytest 文件夹名/
pytest d:/pyse/pytest/ # 指定测试目录2、执行某一个 py 文件下用例
pytest 脚本名称.py3、运行start.py 模块里面的某个函数,或者某个类,某个类里面的方法
加v和不加-v都可以,加-v的话,打印的信息更详细pytest -v 08_mark.py::TestClass::test_methodpytest 08_mark.py::TestClass::test_methodpytest start.py::test_answer4、运行start.py 模块里面,测试类里面的某个方法
pytest start.py::TestClass::test_two5、-m 标记表达式(后续讲解)pytest -m login
将运行用 @pytest.mark.login 装饰器修饰的所有测试,后面再展开讲标记哦6、-q 简单打印,只打印测试用例的执行结果pytest -q start.py7、-s 详细打印pytest -s start.py8、-x 遇到错误时停止测试
pytest start.py -x9、—maxfail=num,当用例错误个数达到指定数量时,停止测试
pytest start.py --maxfail=110、-k 匹配用例名称
执行测试用例名称包含http的所有用例pytest -s -k http start.py11、-k 根据用例名称排除某些用例
1 pytest -s -k "not http" start.py12、-k 同时匹配不同的用例名称
pytest -s -k "method or weibo" start.py
pytest.main()运行测试用例pytest.main():main中传入不同的指令用以执行指定测试用例
-s: 显示程序中的print/logging输出
-v: 丰富信息模式, 输出更详细的用例执行信息
-q: 安静模式, 不输出环境信息
-k :运行包含某个字符串的测试用例。如:pytest -k add XX.py 表示运行XX.py中包含add的测试用例。关键字匹配,用and区分:匹配范围(文件名、类名、函数名),# 运行当前目录下所有(test_*.py 和 *_test.py)pytest.main()1、在命令行运行带上 -s 参数: pytest -s 那么在 pytest.main() 里面等价于:import pytest# 带上-s参数
pytest.main(["-s"])
2、在命令行运行带上多个参数时: pytest -s -x 那么在 pytest.main() 里面等价于:import pytest# 带上-s -x参数
pytest.main(["-s", "-x"])运行指定路径下的用例
pytest.main(["d:/pyse/pytest/"]) # 指定测试目录pytest.main(['./']) # 运行./当前目录下所有(test_*.py 和 *_test.py)pytest.main (['./subpath1']) # 运行./subpath1 目录下用例pytest.main (['./subpath1/test_module1.py']) # 运行指定模块pytest.main (['./subpath1/test_module1.py::test_m1_1']) # 运行模块中的指定用例pytest.main (['./subpath2/test_module2.py::TestM2::test_m2_02']) # 运行类中的指定用例pytest.main (['-k','pp']) # 匹配包含pp的用例(匹配目录名、模块名、类名、用例名)pytest.main(['-k','spec','./subpath1/test_module1.py']) # 匹配test_module1.py模块下包含spec的用例pytest.main(['-k','pp','./subpath2/test_module2.py::TestM2']) # 匹配TestM2类中包含pp的用例指定运行某个用例
指定运行 cases/module1 文件夹下的全部用例, 在命令行运行时, 先 cd 到项目的根目录>pytest cases/module1
那么在 pytest.main() 里面等价于import pytest# 运行指定文件夹目录
pytest.main(["cases/module1"])
运行指定的 cases/module1/test_x1.py 下的全部用例,在命令行运行时, 先cd到项目的根目录>pytest cases/module1/test_x1.py
那么在 pytest.main() 里面等价于import pytest# 运行指定py文件
pytest.main(["cases/module1/test_x1.py"])
运行指定的 cases/module1/test_x1.py 下的某一个用例 test_x, 在命令行运行时, 先cd到项目的根目录>pytest cases/module1/test_x1.py::test_x
那么在 pytest.main() 里面等价于import pytest# 运行指定py文件下的test_x
pytest.main(["cases/module1/test_x1.py::test_x"])
通过上面跟命令行运行的对比,对 pytest.main() 的使用也就基本掌握了
import pytest
import allure
import os# pytest运行脚本生成测试报告原始数据,reports/allure是原始报告目录,生成的是json数据
# --clean-alluredir每次运行会清空上次生成的数据
pytest.main(['-s','../testcase/', '--alluredir=reports/allure', '--clean-alluredir'])
# 使用os模块执行allure命令把原始json数据生成html测试报告,使用generate命令生成HTML报告到新的./reports/allure_report目录
# --clean清除上次生成的报告
os.system("allure generate ./reports/allure -o ./reports/allure_report --clean")# os.system("allure generate /Users/shimo/Downloads/test/lovetest/pytestcase/reports/allure -o /Users/shimo/Downloads/test/lovetest/pytestcase/reports/allure_report --clean")
# 打开浏览器展示html报告
os.system('allure open ./reports/allure_report')
pytest装饰器@pytest.mark.自定义名称,如@pytest.mark.smoke 运行pytest -m 'smoke' A文件名 ,执行A文件中用smoke标记的测试;不指定A文件,运行pytest -m smoke ,执行当前目录下以及子目录中所有用smoke标记的测试函数。@pytest.mark.skip(reason='跳过的原因') ,执行测试时,被标记的测试函数或方法跳过不执行@pytest.mark.xfail() 被标记的测试函数或方法预期失败