pytest常用插件
一、pytest-sugar
安装pytest-sugar
后,执行测试用例时,可以改变pytest执行的默认外观,让测试用例执行显示进度条等信息。如图:
- 安装
pytest-sugar
pip install pytest-sugar
- 一般执行方法
pytest demo.py
- 显示更多信息
pytest -s demo.py --verbose
- 无pytest-sugar情况下,运行测试
pytest -s demo.py -p no:sugar
二、pytest-rerunfailures
pytest-rerunfailures是py.test的插件,它可以重新运行失败的测试用例。
- 安装方法
pip install pytest-rerunfailures
- 重新运行所有测试失败,请使用--reruns命令行选项,并指定要运行测试的最大次数
pytest --reruns 5
- 要在两次重试之间增加延迟时间,请使用--reruns-delay命令行选项,其中包含您希望在下一次测试重试开始之前等待的秒数
pytest --reruns 5 --reruns-delay 1
- 以装饰器的形式标记测试用例失败重试次数
@pytest.mark.flaky(reruns=5) def test_example(): import random assert random.choice([True, False])
- 以装饰器的形式标记测试用例失败重试次数,并指定重新运行延迟时间
@pytest.mark.flaky(reruns=5, reruns_delay=2) def test_example(): import random assert random.choice([True, False])
三、pytest-xdist
pytest-xdist
的优点:
测试运行并行化:如果您有多个CPU或主机,则可以将它们用于组合的测试运行。这样可以加快开发速度或使用远程计算机的特殊资源。
--looponfail:在子进程中重复运行测试。每次运行之后,pytest都会等到项目中的文件更改后再运行之前失败的测试。重复此过程,直到所有测试通过,然后再次执行完整运行。
跨平台覆盖:您可以指定不同的Python解释程序或不同的平台,并在所有这些平台上并行运行测试。
- 安装方法:
pip install pytest-xdist
- 并发执行测试用例。将测试发送到多个CPU,请键入数字:
pytest -n NUM
注意:
如果测试使解释器崩溃,则pytest-xdist
将自动重新启动该工作器并照常报告失败。
此时,可以使用
--max-worker-restart
选项来限制可以重新启动的工作程序数量,或者使用--max-worker-restart = 0
完全禁用重新启动。
在默认情况下,-n选项会将挂起的测试发送到任何可用的工作程序,而没有任何保证的顺序,但是您可以使用以下选项来控制它:
--dist=loadscope
:测试将按测试功能的模块和测试方法的类进行分组,然后将每个组发送给可用的工作程序,以确保组中的所有测试在同一过程中运行。
--dist=loadfile
:测试将按文件名分组,然后发送到可用的工作程序,以确保组中的所有测试都在同一工作程序中运行。
四、pytest-assume
pytest插件,每个测试允许多次断言。第一个断言失败,后续的断言第仍会执行。
- 安装方法
pip install pytest-assume
- 基本使用方法
import pytest @pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)]) def test_simple_assume(x, y): pytest.assume(x == y) pytest.assume(True) pytest.assume(False)
结果
================================== FAILURES =================================== ___________________________ test_simple_assume[1-1] ___________________________ tp = <class 'pytest_assume.plugin.FailedAssumption'>, value = None, tb = None def reraise(tp, value, tb=None): try: if value is None: value = tp() if value.__traceback__ is not tb: > raise value.with_traceback(tb) E pytest_assume.plugin.FailedAssumption: E 1 Failed Assumptions: E E test_simple_fail.py:7: AssumptionFailure E >> pytest.assume(False) E AssertionError: assert False C:\Users\astraw\Projects\pytest-assume\venv\lib\site-packages\six.py:692: FailedAssumption ___________________________ test_simple_assume[1-0] ___________________________ tp = <class 'pytest_assume.plugin.FailedAssumption'>, value = None, tb = None def reraise(tp, value, tb=None): try: if value is None: value = tp() if value.__traceback__ is not tb: > raise value.with_traceback(tb) E pytest_assume.plugin.FailedAssumption: E 2 Failed Assumptions: E E test_simple_fail.py:5: AssumptionFailure E >> pytest.assume(x == y) E AssertionError: assert False E E test_simple_fail.py:7: AssumptionFailure E >> pytest.assume(False) E AssertionError: assert False C:\Users\astraw\Projects\pytest-assume\venv\lib\site-packages\six.py:692: FailedAssumption ___________________________ test_simple_assume[0-1] ___________________________ tp = <class 'pytest_assume.plugin.FailedAssumption'>, value = None, tb = None def reraise(tp, value, tb=None): try: if value is None: value = tp() if value.__traceback__ is not tb: > raise value.with_traceback(tb) E pytest_assume.plugin.FailedAssumption: E 2 Failed Assumptions: E E test_simple_fail.py:5: AssumptionFailure E >> pytest.assume(x == y) E AssertionError: assert False E E test_simple_fail.py:7: AssumptionFailure E >> pytest.assume(False) E AssertionError: assert False C:\Users\astraw\Projects\pytest-assume\venv\lib\site-packages\six.py:692: FailedAssumption ========================== 3 failed in 0.25 seconds ===========================
- pytest.assume也可以用作围绕普通断言的上下文管理器
import pytest from pytest import assume @pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)]) def test_simple_assume(x, y): with assume: assert x == y with assume: assert True with assume: assert False
- 注意,每个with块只能有一个断言。例如,这将不起作用,因为如果第一个和第二个断言失败,则第二个和第三个断言将永远不会执行
import pytest @pytest.mark.parametrize(('x', 'y'), [(1, 1), (1, 0), (0, 1)]) def test_simple_assume(x, y): with pytest.assume: assert x == y assert True assert False
结果
@pytest.mark.parametrize(('x', 'y'), [(1, 0), (1, 1), (0, 1)]) def test_simple_assume_001(x, y): with pytest.assume: > assert x == y E pytest_assume.plugin.FailedAssumption: E 1 Failed Assumptions: E E test_assume.py:11: AssumptionFailure E >> assert False E AssertionError: assert 0 == 1
五、pytest-html
生成html格式报告,本地调试推荐使用
- 安装方法
pip install pytest-html
- 执行方法
pytest --html=report.html
比如
pytest -s test_assume.py --html=report.html
注意,此方法会在本地生成css文件,需要分享报告时需要带css文件一起,所以此方法适合在本地调用并查看,并不适合分享报告。
- 生成独立报告
可以创建一个独立的报告,在共享结果时会更加方便
pytest -s test_assume.py --html=report.html --self-contained-html
六、pytest-ordering
pytest-ordering
是pytest
的插件,它可以以特定的顺序运行测试用例。
- 安装方法
pip install pytest-ordering
- 使用方法及示例
import pytest @pytest.mark.run(order=2) def test_foo(): assert True @pytest.mark.run(order=1) def test_bar(): assert True
结果:
$ py.test test_foo.py -vv ============================= test session starts ============================== platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- env/bin/python plugins: ordering collected 2 items test_foo.py:7: test_bar PASSED test_foo.py:3: test_foo PASSED =========================== 2 passed in 0.01 seconds ===========================