pytest用例编写和执行
一、pytest的优点
- 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
- 可以自动识别测试模块和测试函数,支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数
- 支持参数化
- 执行测试过程中可以将某些测试跳过(skip),或者xfail处理对某些预期失败的case标记成失败
- 支持重复执行(rerun)失败的 case
- 支持运行由 nose, unittest 编写的测试 case
- 可生成 html 报告
- 方便的和持续集成工具 jenkins 集成
- 可支持执行部分用例
- 具有很多第三方插件,,例如报告插件pytest-html、allure-pytest、失败重试插件pytest-rerunfailures,并且可以自定义扩展
二、安装和测试用例编写规则
1.安装
# 安装 pip install -U pytest # 换源安装 pip3 install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com # 查看版本 pytest --version
2.测试用例编写规则
pytest的测试用例不用像unittest一样还要测试类先继承,只需要满足测试用例条件,函数还是类的方法都可以作为测试用例
1.测试模块(py文件)名称必须是 test_*.py 或 *_test.py
2.目录下所有的包 package 必须要有__init__.py 文件,包内的模块(py文件)才能识别为测试模块
3.测试类的类名必须以Test开头,且不能包含 __init__ 方法,不然就算类中有以test开头的方法也不会执行
4.测试用例名称必须是test_开头,无论是单独的一个函数还是测试类下的方法,否则不会识别为测试用例
三、命令行执行测试用例
应用场景:自动化测试需要自动执行命令来运行脚本
1.基础命令
运行方式:cd切换目录到目标目录,执行以下命令可以执行不同的测试用例:
pytest # 【所有】 先cd到某个目录下,执行目录下所有合规模块和包中所有测试用例 pytest test_01.py # 【模块】 执行test_01.py模块下所有测试用例 pytest -v test_01.py::test_3 # 【函数】 运行test_01.py模块里面的test_3用例 pytest test_01.py::TestClass # 【类】 运行test_01.py模块里面TestClass类下所有用例 pytest test_01.py::TestClass::test_4 # 【方法】 运行test_01.py模块里面某个类,某个类里面的方法
2.命令可用参数
除了基础命令,我们可以增加各种参数来达到不同的执行和打印效果,常用参数见下:
-x # 遇到错误时停止测试=============================================================================================== pytest start.py -x --maxfail=num,当用例错误个数达到指定数量时,停止测试===================================================================== pytest start.py --maxfail=1 -k # 根据用例名称筛选某些用例执行或者不执行============================================================================== pytest -v -k test_4 test_01.py # -k 匹配用例名称,执行测试用例名称包含test_4的所有用例 pytest -v -k "test_4 or test_5" test_01.py # 多个条件去匹配用例名称,符合一个即可执行 pytest -v -k "not test_4" test_01.py # 根据用例名称排除某些名称包含test_4的用例 -m [标记表达式] # 仅运行与给定标记表达式标记的用例(用例需要提前被自定义mark标记),更详细使用点这里=============================== eg: @pytest.mark.mark1 def test_01(): pass pytest -m 'mark1' 01_test.py # 01_test.py中其他case都被取消执行,相当于给case打了一个标签,对用例进行了分类,执行一类用例 pytest -m 'mark1 and not mark2' 01_test.py # 打印报告相关 -v, --verbose # 详细打印,比默认默认的报告多了session部分的执行结果和进度信息=============================================== pytest -v start.py -q, --quiet # 简单打印,没有session那一整块(平台版本、python和pytest等版本信息、执行结果)=============================== pytest -q start.py # 简单打印 -r [chars] # 显示字符指定的额外测试摘要信息,可以是多个(默认 "fE" 只显示错误和失败用例)====================================== # chars可选项:(f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll pytest -rfEp -v 01_test.py # 详细打印,结果显示 失败+错误+常规通过 三种,运行效果见下图
-s # 用例中print打印信息相关,用例默认失败会输出,通过是不会输出打印信息的,加上这个就会关闭Captured staout call 输出信息功能(用例成功或者失败都不再输出),但是会显示在 test session start部分,更好看,相当于 --capture=no # 其他 --markers #显示标记(内置、插件和每个项目的标记) -x, --exitfirst # 在第一个错误或测试失败时立即退出 --runxfail # 报告xfail测试的结果,就好像它们没有被标记一样 --lf, --last-failed # 仅重新运行上次运行失败的测试(如果没有失败,则全部重新运行)
附图一:-rfEp执行效果
附图二:默认、-v、-q三种模式报告对比
附图三:-s 效果
四、pytest用例执行顺序
unittest中用例按照根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行
pytest中同一py文件中用例默认是按照该文件从上到下的顺序执行的,但是有个插件,支持我们自定义执行顺序,更加随心所欲,详见:>>安静的博客<<
五、pycharm执行测试用例
第一步:编写用例都是用的编辑器,使用cmd执行的话很麻烦,pycharm中可以直接按照下图设置,之后就会以pytest运行代码
第二步:右键执行测试用例:
1)执行整个目录:鼠标先点中最左侧目录,右键执行,会执行该目录下所有用例
2)执行某个模块:鼠标点点中最左侧该模块,或者点到该py文件中空白的地方,右键执行
3)执行整个测试类:鼠标点中类名,右键执行
4)执行某个函数或类的方法:鼠标点中函数,右键执行