• 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!!!
  • 相关阅读:
    希尔排序-Python
    顺序表为什么要在定义时分配空间大小
    pip install -r requirements.txt安装问题
    python小白系列2—python常用工具:pycharm
    python小白系列1—python安装,初识Anaconda
    Python Traceback模块:捕获更详细的异常报错信息
    pycharm项目中的.idea文件夹是干什么用的?可以删除吗?
    python多线程使用
    《统计学习方法》自学笔记—1.概论
    JAVA项目中的常用的异常处理情况
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13415152.html
Copyright © 2020-2023  润新知