1、pytest简介
pytest是Python的一种单元框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。
- 执行测试过程中可以将某些测试跳过,或者对某些预期失败的case标记成失败
- 能够支持简单的单元测试和复杂的功能测试
- 支持重复执行失败的case
- 支持运行由nose, unittest编写的测试case
- 具有很多第三方插件,并且可以自定义扩展
- 方便的和持续集成工具集成
- 支持参数化
2、安装pytest
pip install pytest
3、举例
(1)单测试case
执行测试的时候,我们只需要在测试文件test_sample所在的目录下,运行py.test即可。pytest会在当前目录及其子目录下寻找以test开头的py文件或者以test结尾的py文件(即测试文件),找到测试文件之后,进入到测试文件中寻找test_开头的测试函数并执行。
在当前目录下新建文件 test_champ.py
def func(x): return x + 1 def test_answer(): assert func(3)==5
在命令行输入py.test [-q],加上-q(quiet)输出结果会省去pytest版本信息,便可以看到执行的成功与失败的原因了
(2)多测试case
当需要编写多个测试样例的时候,我们可以将其放到一个测试类当中,如:
class TestClass: def test_one(self): assert "h" in "this" def test_two(self): x = "hello" assert hasattr(x,"check")
我们可以通过执行测试文件的方法,执行上面的测试:py.test -q test_class.py
4、pytest测试样例编写规则
- 测试文件以test_开头(以_test结尾也可以)
- 测试函数以test_开头
- 断言使用基本的assert即可
5、如何执行pytest测试样例
py.test # run all tests below current dir py.test test_mod.py # run tests in module py.test somepath # run all tests below somepath py.test -k stringexpr # only run tests with names that match the # the "string expression", e.g. "MyClass and not method" # will select TestMyClass.test_something # but not TestMyClass.test_method_simple py.test test_mod.py::test_func # only run tests that match the "node ID", # e.g "test_mod.py::test_func" will select # only test_func in test_mod.py
6、测试报告
pytest可以方便的生成测试报告,即可以生成HTML的测试报告,也可以生成XML格式的测试报告用来与持续集成工具集成。
生成txt格式报告:
py.test --resultlog=path/log.txt
生成XML格式的报告:
py.test --junitxml=path/log.xml
将测试报告发送到pastebin服务器,执行下面的命令会生成报告的网址
py.test test_report.py --pastebin=all
只发送失败的报告
py.test test_report.py --pastebin=failed
生成Html格式报告
这个需要安装pytest的第三方插件pytest-html:pip install pytest-html py.test test_report.py --html=path/log.html
7、如何获取帮助信息
py.test --version # shows where pytest was imported from py.test --fixtures # show available builtin function arguments py.test -h | --help # show help on command line and config file options
与Python自带的unitest框架中的setup、teardown类似,pytest提供了fixture函数用以在测试执行前和执行后进行必要的准备和清理工作。但是fixture函数对setup和teardown进行了很大的改进。
- fixture函数可以使用在测试函数中,测试类中,测试文件中以及整个测试工程中。
- fixture支持模块化,fixture可以相互嵌套
- fixture支持参数化
- fixture支持unittest类型的setup和teardown
8、最佳实践
virtualenv . # create a virtualenv directory in the current directory source bin/activate # on unix
2、在虚拟环境中安装pytest:
pip install pytest
9、断言的使用
①正常断言
# 子签名类,忽略中间打印的过程,直接表示出错的原因 # assert value == 0, "value was odd, should be even" # 等于、不等、小于、大于 assert func(2)==3
②异常断言
使用pytest.raise方法(需import pytest)
断言1除以0,将产生一个ZeroDivisionError类型的异常。
import pytest def test_zero_division(): with pytest.raises(ZeroDivisionError): 1 / 0
有的时候,我们可能需要在测试中用到产生的异常中的某些信息,比如异常的类型type,异常的值value等等。下面我们修改下上面的测试
import pytest def test_recursion_depth(): with pytest.raises(ZeroDivisionError) as excinfo: 1/0 assert excinfo.type == ‘RuntimeError‘
因为该测试断言产生的异常类型是RuntimeError,而实际上产生的异常类型是ZeroDivisionError,所以测试失败了。在测试结果中,可以看到assert子表达式excinfo.type的值。
原文:https://www.cnblogs.com/zongfa/p/9245038.html