zoukankan      html  css  js  c++  java
  • 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!!!
  • 相关阅读:
    Leetcode Spiral Matrix
    Leetcode Sqrt(x)
    Leetcode Pow(x,n)
    Leetcode Rotate Image
    Leetcode Multiply Strings
    Leetcode Length of Last Word
    Topcoder SRM 626 DIV2 SumOfPower
    Topcoder SRM 626 DIV2 FixedDiceGameDiv2
    Leetcode Largest Rectangle in Histogram
    Leetcode Set Matrix Zeroes
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13415152.html
Copyright © 2011-2022 走看看