pytest常用插件

一、pytest-sugar

安装pytest-sugar后,执行测试用例时,可以改变pytest执行的默认外观,让测试用例执行显示进度条等信息。如图:

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

image-20200303141752949

六、pytest-ordering

pytest-orderingpytest的插件,它可以以特定的顺序运行测试用例。

  • 安装方法
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 ===========================
posted @ 2020-03-04 18:03  xyztank  阅读(616)  评论(0编辑  收藏  举报