Pytest介绍
Pytest是python2自带的自动化测试框架,python3的版本的话pytest框架独立出来,需要pip进行安装
- Pytest的下载安装
1、Python3使用pip install -U pytest安装
2、查看pytest版本信息 pytest --version
3、pytest 用例的执行规则:
①测试文件以test_xx.py命名需要以test_开头(或_test结尾)
②测试类以Test_开头,并且不能带有init方法
③测试函数或方法以test_xx开头
总体上分为三个阶段:
- 编写测试用例
- 执行测试用例
- 输出测试报告
第一步、编写测试用例:
pytest执行时默认是执行指定路径下以test_开头或者以_test结尾的文件里的测试类或者方法,默认是执行以Test_开头的类和test_开头的方法
- 首先创建py文件命名以test_开始或者以_test结尾
- 若是新建类,测试类需要以Test_开头
- 测试用例(方法)需要以test_开头
im
1.1测试用例的优化
1.1.1 assert断言(判断执行结果是否满足预期):
Pytest最常用的断言一般有以下五种:
assert xx:判断xx为真
assert not xx:判断xx不为真
assert a in b:判断b包含a
assert a == b:判断a等于b
assert a !=b:判断a不等于b
添加断言在对应的方法里面,做判断测试用例结果是否满足预期,示例如下:
imp
执行结果如下:断言失败的结果会显示出来
1.1.2 断言优化
如果想要在失败的时候看到更详细的信息,可以在断言上添加说明,示例如下:
执行结果如下图,可以看到失败时断言的说明信息
第二步、测试用例的执行
2.1 使用命令行执行
cmd窗口,然后执行pytest 文件路径/测试文件名
例如 pytest ./test_tt.py
如果当前路径已经是放测试用例文件的文件夹下,想要测试文件,则直接可以输入 pytest测试文件名 即可:
如果只输入pytest,则会默认执行当前文件夹下所有以test_开头(或_test结尾)的文件。
2.2 IDE(PyChram)执行
写法如截图所示,pytest.main()(参数以列表的形式给出,如截图)
执行当前文件所在路径下的文件,指定文件名则执行指定的文件,若没指定,执行所有test_开头或者_test结尾的文件。
2.3 执行指定文件指定方法
2.3.1 命令行编写方式
pytest 路径/文件名::类名::方法名
例如
2.3.2 pycharm编写方式
如果是用pycharm写法如图,与上面的命令行等价:
2.4带参数执行
常用的pytest带参数执行:列举几种,其余扩展可以自行百度
2.4.1 pytest -q 简化控制台的输出
不带参数执行结果:
带参数执行结果:
2.4.2 Pytest -v 输出用例更加详细的执行信息,比如用例所在文件和用例名称
添加参数前执行结果:
添加参数后执行结果:
2.4.3 pytest -k 执行用例中包含‘关键字’的用例
待执行用例如截图所示:
执行代码和结果如图:(关键字需要用双引号)
2.4.4 pytest -s 输出用例中的调试信息,比如print打印信息,如果不加参数则不输出
待执行的用例:
添加参数前执行结果:
添加参数后执行结果:
2.4.5 pytest -m 执行‘标记’的内容,执行特定的测试用例,执行有相同标记的测试用例,添加标记的方法如下:
需执行测试用例:
执行代码和结果如下:
执行有相同标记的用例,可以用于指定需执行的测试用例。
2.4.6 pytest -x 执行失败则停止执行,后面的用例不会被执行
待执行用例:
带参数执行结果:
2.4.7 pytest --maxfail=n 执行失败n次之后停止执行,n是执行失败的次数
假设n = 2 执行上面的用例:由于失败只有一次所以用例会继续执行完,直到两次失败才停止执行
2.4.8 pytest --count=n 执行用例n次,n=2就是执行两次
如下执行test_01两次:
2.4.9 pytest --lf (last failed)重新运行上次失败的用例,若没有失败的会全部跑
2.4.10 pytest --ff (failed first)重新运行所有用例,但首先运行上次失败的用例
2.5 优质功能介绍
2.5.1 跳过用例的执行
根据特定的条件,不执行标识的测试函数.
方法:
skipif(condition, reason=None)
参数:
condition:跳过的条件,必传参数
reason:标注原因,必传参数
使用方法:
@pytest.mark.skipif(condition, reason="xxx") condition条件为真时跳过
@pytest.mark.skip()
示例如下:
2.5.2 标记为预期失败的用例
标记测试函数为失败函数
方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用参数:
condition:预期失败的条件,必传参数
reason:失败的原因,必传参数
使用方法:
@pytest.mark.xfail(condition, reason="xx")condition 为真则标记失败
在某种条件不满足的时候,预期它是失败的,就将它标记为预期失败,若condition条件不满足则正常执行
示例:
不带参数
condition条件满足的时候:
condition条件不满足的时候:
2.5.3 参数化
方法:
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用参数:
argnames:参数名
argvalues:参数对应值,类型必须为list
当参数为一个时格式:[value]
当参数个数大于一个时,格式为:
[(param_value1,param_value2.....),(param_value1,param_value2.....)]
使用方法:
@pytest.mark.parametrize(argnames,argvalues) 参数名,参数值
@pytest.mark.parametrize("a",[3,6])单参数
@pytest.mark.parametrize("a,b",[(1,2),(0,3)])多参数
参数值为N个,测试方法就会运行N次
示例:
单参数:
多参数:
2.5.4 执行标记的用例多次
首先安装repeat:
pip install pytest-repeat
@pytest.mark.repeat(n) 执行当前用例n次 然后再往下执行其他用例
示例:
2.5.5 调整用例的执行顺序
使用:
安装 pip install pytest-ordering
在测试方法上加装饰器
@pytest.mark.last --最后一个执行
@pytest.mark.run(order=1)---第几个执行
示例:
最后一个执行
指定执行顺序
2.5.6 自定义测试用例预置条件--pytest精髓fixture
@pytest.fixture()(scope="function",params=None,autouse=False, ids=None, name=None)
调用时被优先执行 预处理或者重复操作
scope:被标记方法的作用域
function" (default):作用于每个测试方法,每个test都运行一次
"class":作用于整个类,每个class的所有test只运行一次
"module":作用于整个模块,每个module的所有test只运行一次
"session:作用于整个session(慎用),每个session只运行一次
params:(list类型)提供参数数据,供调用标记方法的函数使用
autouse:是否自动运行,默认为False不运行,设置为True自动运行
若不为True 则需要调用才会优先执行。
2.5.6.1 fixture用法一
定义fixture与定义普通函数差不多,命名不要以test开头与用例区分开,fixture有返回值,没有返回值默认为None。用例调用fixture返回值,直接就是把fixture的函数名称当做变量名称。
示例:
会优先于测试用例test_01执行
2.5.6.2 fixture用法二
fixture标记的函数可以应用于测试类外部,每次都会优先执行
2.5.6.3 fixture用法三
传参数作为标识
2.5.6.4 使用多个fixture
如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。
也可以分成多个fixture在用例中传值多个fixture参数
2.5.6.5 fixture作用范围
2.5.6.5.1、function 每个方法执行之前执行一次
2.5.6.5.2 class 类执行开始时执行一次
2.5.6.5.3 module在当前.py脚本里面所有用例开始前只执行一次
2.5.6.5.4 session级别是可以跨.py模块调用的
也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope="session"。
2.5.6.5.5 conftest.py文件
新建conftest.py文件,名称固定,与运行的用例在同一个package下面,不用导入pytest会自动查找,文件里面可以单独管理一些预置的操作场景,在执行用例的时候就会预置执行。
示例:
第三步、 生成测试报告
想要生成测试报告,需要先安装pytest-html
安装命令
pip install pytest-html
3.1 使用命令行生成报告
--html=路径/文件名.html 不写路径就默认为当前路径
3.2 使用PyCharm生成报告
生成的报告大概是这样的:
3.3 高大上的测试报告
想要生成高大上的测试报告自行百度 Pytest+Allure,可以集成到Jenkins,自动生成高大上的自动化测试报告,效果图大概是这样的:
3.4 生成xml报告
--junit-xml=路径/文件名.xml
效果大概是这样的:
扩展
输出覆盖率报告
pytest可以输出覆盖率的html报告
使用命令如下:
pytest -vv --cov=./ --cov-report=html
有可能遇到报错:
pytest: error: unrecognized arguments: --cov-report=html
? inifile: None
? rootdir: /Users/joe/workspace/platform/mgap-mendel/mgap-mendel
原因:
缺少pytest cov的包
解决方法
pip install pytest-cov
大概是这样的:
设置重复执行的执行范围
--repeat-scope
--repeat-scope类似于pytest fixture的scope参数,--repeat-scope也可以设置参数: session , module,class或者function
function范围针对每个用例重复执行,再执行下一个用例
class 以class为用例集合单位,重复执行class里面的用例,再执行下一个
module 以模块为单位,重复执行模块里面的用例,再执行下一个
session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等
示例:如下scope=function --count=2以用例为单位执行
执行每个用例两次,如果是class则以类为单位执行,是执行类里面的用例重复执行
重复测试直到失败
将pytest的-x选项与pytest-repeat结合使用,以强制测试运行器在第一次失败时停止。例如:
pytest --count=1000 -x test_tt.py
这样将执行1000次用例,直到失败就停止,执行时可以带多个参数,更多的东西需自己去探索。
配置文件
配置文件可以改变pytest框架的运行规则,比如可以改变pytest收集用例的规则,添加命令参数。
如下配置addopts = -s --html=./report.html 执行pytest时就能自动生成报告
修改
python_files = test_*.py
python_classes = Test_*
python_functions = test_*
内容就可以改变pytest收集用例的规则,比如修改python_files = test_*.py check_*.py则执行pytest时以check_*.py开头的文件也可以自动执行。
使用配置文件的方法,在项目根目录下新建pytest.ini文件,然后自行配置参数,常用的如下:
[pytest]
# 命令行参数
addopts = -s
# 搜索文件名
python_files = test_*.py
# 搜索的类名
python_classes = Test_*
#搜索的函数名
python_functions = test_*
setup与teardown函数
Pytest是unittest的扩展,也可以实现setup(开始时执行一次)和teardown(结束时执行一次)简单提及,详细内容可自行百度。
Pytest支持setup/teardown,但是更推荐使用pytest.fixture