【问题标题】:What's the correct way using pytest to assert that the expression raises an Exception? [duplicate]使用 pytest 断言表达式引发异常的正确方法是什么? [复制]
【发布时间】:2020-10-15 07:05:30
【问题描述】:

我正在尝试添加一些单元测试以确保抛出正确的错误(我的函数抛出 KeyErrorRuntimeError)。

我已经尝试过assert func(bad_param) == KeyErrorassert isinstance(func(bad_param), KeyError),但这些都不正确,我应该如何为此编写单元测试/断言该函数在传递错误参数时会引发的正确方法是什么正确的异常?

编辑:我没有使用 unittest 库,我只是在询问 Python std lib (https://docs.python.org/3/reference/simple_stmts.html) 附带的 assert 函数

【问题讨论】:

标签: python pytest


【解决方案1】:

编辑:参考@plamut 写的帖子

我找到了一个可能更符合pytest 打算检查它的答案!

def foo():
    raise KeyError

def test_foo_error():
    with pytest.raise(KeyError)
        foo()

【讨论】:

    【解决方案2】:

    我已经做过类似的事情,我使用了try ... except 声明:

    try:
        # Code to test
    except KeyError:
        assert True
    assert False
    

    这是一个最小的工作示例(用于类似 pytest 的单一测试):

    def fun():
        raise KeyError
    
    def test():
        try:
            fun()
        except KeyError:
            assert True
            return
        assert False
    

    【讨论】:

      【解决方案3】:

      您可以使用pytest.raises 上下文管理器:

      with pytest.raises(ExpectedErrorType):
          unit_under_test()
      

      更多详情请见pytest docs

      我在文档中没有找到任何可以解释如何预期多种异常类型的示例,但您可以通过检查异常信息对象手动完成:

      with pytest.raises(Exception) as exc_info:
          unit_under_test()
      
      assert issubclass(exc_info.type, (KeyError, RuntimeError))
      
      # alternative more strict assertion
      assert exc_info.type in (KeyError, RuntimeError)
      

      【讨论】:

        【解决方案4】:

        您可以使用try except 来捕获异常

        def foo():
            raise ValueError
            
        rightExceptionRaised = False
        try:
            foo()
        except ValueError:
            rightExceptionRaised = True
        except:
            pass
        
        assert rightExceptionRaised
        

        【讨论】:

          猜你喜欢
          • 2014-06-13
          • 2010-09-15
          • 2013-08-31
          • 1970-01-01
          • 2018-08-14
          • 1970-01-01
          • 2020-06-28
          • 2018-07-19
          相关资源
          最近更新 更多