- Pytest的特点与执行方式
pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效。灵活性比较好。使用python的原生断言,更易于我们理解。可以运行unittest和nose的测试用例,有很好的兼容性。插件丰富,比如flask插件,可以用于出错重跑。还有xdist插件,可以用于设备并行执行。
执行原理:
首先在所在目录下运行执行命令(比如pytest或者pytest –q下文介绍了其他特殊运行命令),
则会执行当前目录及其子目录下以test开头或者以test结尾的py文件中test开头的函数。
也就是说pytest会递归查找当前文件以及子文件夹下面所有的test_开头的py文件或_test结尾的py文件,把其当作测试文件。pytest会收集文件中的函数和方法,当作测试用例。
- 关于pytest命令简介
在命令行中运行以下命令
pip install -U pytest
检查是否安装了正确的版本
$ pytest –version
显示可用的内置函数参数
pytest --fixtures # show available builtin function arguments
帮助
pytest -h | --help # show help on command line and config file options
停止第一次失败后的测试
pytest -x # stop after first failure
停止第二次失败后的测试(参数可以更改)
pytest --maxfail=2 # stop after two failures
运行
运行在模块
pytest test_mod.py
在目录下运行
pytest testing/
用关键字表达式运行测试
pytest -k "MyClass and not method"
在模块中运行特殊用例(指定模块)
pytest test_mod.py::test_func
指定方法
pytest test_mod.py::TestClass::test_method
三.pytest的几个常用的函数
1.pytest.approx:断言两个数字(或两组数字)在某个容差范围内彼此相等。
approx(expected, rel=None, abs=None, nan_ok=False)
2.pytest.fail:用明确的给定消息显示执行失败的测试。
fail(msg='', pytrace=True)
3.pytest.skip:使用给定消息跳过执行测试。
skip(msg[, allow_module_level=False])
4. pytest.xfail:测试用例预计是会失败的,在测试的时候会跳过该用例,显示原因。
xfail(reason='')
5. pytest.main:执行进程内测试运行后返回退出代码。
main(args=None, plugins=None)
四.Marks常见用法
Marks:用于测试功能,可以通过fixture或插件来访问。
举个例子:
@pytest.mark.red
def some_test_method(self):
我们通过fixture对一个函数做了标记,但是如果我们想对这个函数做多个标记如下:
@pytest.mark.red
@pytest.mark.green
@pytest.mark.blue
@pytest.mark.black
@pytest.mark.orange
@pytest.mark.pink
def some_test_method(self):
这里我们可以安装pytest-marks实现简化
安装方法:
* pip install pytest-marks
* python setup.py install
我们就可以在一个装饰器中应用它们
@pytest.marks('red', 'green', 'blue', 'black', 'orange', 'pink')
def some_test_method(self):
下面我们再了解一下常见的mark用法:
1.pytest.mark.skip
无条件跳过
pytest.mark.skip
(*, reason=None)
参数: | reason (str) –跳过测试功能的原因。 |
2.pytest.mark.skipif
条件为真,则跳过。
pytest.mark.skipif
(condition, *, reason=None)
参数: |
|
举个例子:
显示我的python版本为3.6.6 大于3.3,所以跳过了。
3.pytest.mark.usefixtures:将测试函数标记为使用给定的fixture名称。
pytest.mark.usefixtures
(*names)
参数: | args –要使用的fixture的名称,字符串 |
4.pytest.mark.xfail:标记预计失败的测试函数。
pytest.mark.xfail
(condition=None, *, reason=None, raises=None, run=True, strict=False)
Xfail的含义是我们预计这个测试用例是失败的,在执行测试用例的时候就跳过它,在最后失败的用例中不包括这个用例。
xfail 用法只需要在测试用例前加上@pytest.mark.xfail
使用命令py.test –runxfail强制运行标记xfail的测试用例。
也可以对预计失败进行条件限制,比如python版本3.3以上的话标记为xfail如下
@pytest.mark.xfail(sys.version_info>=(3,3),reason="python3.3 api changes")
五. fixture的常见用法
测试函数或其他fixture通过将它们声明为参数名称来请求fixture。可以把fixture当做一种资源,被定义为fixture的函数是测试用例的资源,将资源传到测试用例后运行;比如测试的环境需要打开浏览器去测试页面然后再关闭浏览器。那么每一条用例执行前都需要打开浏览器,执行完又都需要关闭浏览器,可以使用fixture设置为只在运行用例前打开一次浏览器,在用例结束后关闭一次浏览器。
1.作用:将函数定义成为参数形式,可以将其传入到其他函数中当参数去使用;
2.调用方式:
1)在测试用例中直接调用。
2)用fixture decorator调用,就是利用我们上文提到的pytest.mark.usefixtures.
结果也是一样的.
3)用autos调用fixture
结果也是一样的,这里运用到了参数scope.
fixture作用域scope有4个参数
function:每个函数都会调用一次;
class:每一个类调用一次;
module:一个module是指一个文件,是一个文件调用一次;
session:范围最大,是多个文件调用一次;
3.Fixture返回值
fixture返回值默认为None,上面例子返回值也都为None,我们可以选择让fixture返回我们需要的东西。如果你的测试需要配置一些返回数据,比如读文件,连接数据库,那么你可以让fixture返回这些数据或资源。
params默认为None,我们可以把参数值赋值给params。Param中的每个数据,fixture都会遍历一遍,类似for循环。
通过参数request,得到被fixture标记的函数信息。