pytest(三十一)--断言失败后还能继续执行pytest-assume

前言

pytest的断言失败后,后面的代码就不会执行了,通常一个用例我们会写多个断言,有时候我们希望第一个断言失败后,后面能继续断言。

pytest-assume插件可以解决断言失败后继续断言的问题。github地址:https://github.com/astraw38/pytest-assume

环境准备

先安装pytest-assume依赖包

pip install pytest-assume  

遇到问题

一下是一个简单案例,输入的测试数据有3种,我们需要断言同时满足三种情况

x==y , x+y>1 ,x>0

import pytest
@pytest.mark.parametrize(('x','y'),[(1,1),(1,0),(0,1)])
def test_simple(x,y):
    print("测试数据x:{},y:{}".format(x,y))
    assert x==y
    assert x+y>1
    assert x>0  

运行结果

================================== FAILURES ===================================
______________________________ test_simple[1-0] _______________________________

x = 1, y = 0

    @pytest.mark.parametrize(('x','y'),[(1,1),(1,0),(0,1)])
    def test_simple(x,y):
        print("测试数据x:{},y:{}".format(x,y))
>       assert x==y
E       assert 1 == 0

test_a.py:6: AssertionError
---------------------------- Captured stdout call -----------------------------
测试数据x:1,y:0
______________________________ test_simple[0-1] _______________________________

x = 0, y = 1

    @pytest.mark.parametrize(('x','y'),[(1,1),(1,0),(0,1)])
    def test_simple(x,y):
        print("测试数据x:{},y:{}".format(x,y))
>       assert x==y
E       assert 0 == 1

test_a.py:6: AssertionError
---------------------------- Captured stdout call -----------------------------
测试数据x:0,y:1
=========================== short test summary info ===========================
FAILED test_a.py::test_simple[1-0] - assert 1 == 0
FAILED test_a.py::test_simple[0-1] - assert 0 == 1
========================= 2 failed, 1 passed in 0.16s =========================

 如果第一个断言就失败了,后面的2个断言都不会执行了。

pytest-assume使用案例

使用pytest.assume断言

#test_a.py
import pytest
@pytest.mark.parametrize(('x','y'),[(1,1),(1,0),(0,1)])
def test_simple(x,y):
    print("测试数据x:{},y:{}".format(x,y))
    pytest.assume(x==y)
    pytest.assume(x+y>1)
    pytest.assume(x>0)
    print("测试完成!")

  运行结果

================================== FAILURES ===================================
______________________________ test_simple[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_a.py:6: AssumptionFailure
E               >>	pytest.assume(x==y)
E               AssertionError: assert False
E               
E               test_a.py:7: AssumptionFailure
E               >>	pytest.assume(x+y>1)
E               AssertionError: assert False

C:UsersAdministratorAppDataLocalProgramsPythonPython37libsite-packagessix.py:695: FailedAssumption
---------------------------- Captured stdout call -----------------------------
测试数据x:1,y:0
测试完成!
______________________________ test_simple[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               3 Failed Assumptions:
E               
E               test_a.py:6: AssumptionFailure
E               >>	pytest.assume(x==y)
E               AssertionError: assert False
E               
E               test_a.py:7: AssumptionFailure
E               >>	pytest.assume(x+y>1)
E               AssertionError: assert False
E               
E               test_a.py:8: AssumptionFailure
E               >>	pytest.assume(x>0)
E               AssertionError: assert False

C:UsersAdministratorAppDataLocalProgramsPythonPython37libsite-packagessix.py:695: FailedAssumption
---------------------------- Captured stdout call -----------------------------
测试数据x:0,y:1
测试完成!
=========================== short test summary info ===========================
FAILED test_a.py::test_simple[1-0] - pytest_assume.plugin.FailedAssumption: 
FAILED test_a.py::test_simple[0-1] - pytest_assume.plugin.FailedAssumption: 
========================= 2 failed, 1 passed in 0.25s =========================

 从运行结果可以看出,三个断言都会执行。

上下文管理器

pytest.assume也可以使用上下文管理器去断言

#test_a.py
import pytest
from pytest import assume
@pytest.mark.parametrize(('x','y'),[(1,1),(1,0),(0,1)])
def test_simple(x,y):
    print("测试数据x:{},y:{}".format(x,y))
    with assume:assert x==y
    with assume:assert x+y>1
    with assume:assert x>0
    print("测试完成")

 这样看起来会更优雅一点,对之前写的代码改起来也方便一些

需要注意的是每个with块只能有一个断言,如果一个with下有多个断言,当第一个断言失败的时候,后面的断言就不会起作用的。

#test_a.py
import pytest
from pytest import assume
@pytest.mark.parametrize(('x','y'),[(1,1),(1,0),(0,1)])
def test_simple(x,y):
    print("测试数据x:{},y:{}".format(x,y))
    with assume:
        assert x==y
        assert x+y>1
        assert x>0
    print("测试完成")

 

越努力,越幸运!!! good good study,day day up!!!
原文地址:https://www.cnblogs.com/canglongdao/p/13415152.html