发生异常时正确的断言失败测试是什么?

时间:2018-07-19 20:35:59

标签: python pytest assert

我希望在引发特殊异常时通过测试用例,并在发生ValueError时使测试用例仅 失败。从另一篇文章中获取一些信息,感觉也许有比try / except更好的方法 How to properly assert that an exception gets raised in pytest?

def test_exception():
    try:
        call some function:
    except ValueError:
        assert False

2 个答案:

答案 0 :(得分:3)

如果仅在抛出ValueError时失败(并且传递所有其他异常,并且在根本没有异常的情况下传递),则您希望这样做:

def test_exception():
    try:
        call_some_function()
    except ValueError:
        assert False
    except:
        pass

如果要使确定引发异常,但不引发ValueError异常,则您需要这样做:

def test_exception():
    try:
        call_some_function()
        assert False
    except ValueError:
        assert False
    except:
        pass

作为警告,这与大多数人想要测试的结果相反。不说您在做什么是错误的,但是通常您想测试是否抛出了某种异常:不是说没有抛出某种异常。如果那是您想要的,您会想要的:

def test_exception():
    try:
        call_some_function()
        assert False
    except ValueError:
        pass
    except:
        assert False

或者您可以摆脱最后一个except块,然后使其冒泡。区别仅在于“错误”和“失败”之间。无论哪种方式,您的测试套件都不会通过。

在样式方面,当您想显式失败时,assert Falseassert 0没什么问题。我(和我合作的其他专业python开发人员)做到了一直。

编辑:最好将pytest.fail与特定消息一起使用,而不要使用assert False,特别是在有多个assert False浮动的情况下。这样,您将知道哪个 assert失败以及为什么添加有用的错误消息。

答案 1 :(得分:-1)

TestCase类具有用于此情况的上下文管理器:

class TestSomething(TestCase):
    def test_something(*args, **kwargs):
        with self.assertRaises(ValueError) as e:
            raise ValueError
        # you can check status of e here for information

[编辑]

我意识到我回答了你的问题的反面。就个人而言,我只是让异常传播,并让pytest那样失败,但是我认为您上面的方法也很好。