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

Python 发生异常时,什么是正确断言失败测试?,python,pytest,assert,Python,Pytest,Assert,我希望在出现特定异常时通过testcase,并在ValueError发生时使testcase仅失败。从另一个帖子中获取一些信息感觉可能有比尝试/除外更好的方法 TestCase类有一个上下文管理器用于这种情况: class TestSomething(TestCase): def test_something(*args, **kwargs): with self.assertRaises(ValueError) as e: raise Valu

我希望在出现特定异常时通过testcase,并在ValueError发生时使testcase仅失败。从另一个帖子中获取一些信息感觉可能有比尝试/除外更好的方法


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以这种方式失败,但我认为您的上述方法也很好。

如果您希望在抛出ValueError(并传递所有其他异常,如果根本没有异常,也传递)时失败,您会希望这样:

如果要确保引发异常,但不是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
作为一个警告,这与大多数人想要测试的是背道而驰的。不说你在做什么是错误的,但通常你想测试某个异常是否被抛出:而不是某个异常是否没有被抛出。如果这是你想要的,你会想要这个:

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
或者你可以去掉最后一个
块,让它冒泡起来。区别只是“错误”和“失败”之间的区别。不管怎样,您的测试套件都不会通过

就风格而言,当您希望显式失败时,
assert False
assert 0
没有什么错。我(和其他与我一起工作的专业python开发人员)一直在做这件事


编辑:最好对特定消息使用
pytest.fail
,而不是
assert False
,尤其是在多个
assert False
浮动的情况下。这样,如果您添加了一条有用的错误消息,您将知道哪个
断言
失败以及为什么失败。

那么,当出现与ValueError不同的期望值时,应该怎么办?我的意思是测试只能通过或失败,没有第三种状态,不是吗?我对此很困惑,你是说如果某个函数
引发了一个索引器
,你想让测试通过吗?如果某个函数引发的异常与ValueError不同..我想testcase会自动失败,但有例外一些testcase没有异常通过,testcase没有异常,testcase没有异常ValueError失败testcase有异常当ValueError以外的异常发生时可能出现的重复我不确定你在问什么。如果您想处理异常,或者断言某个特定异常,那么是的,您必须以某种方式使用
try
except
。我会使用
pytest.fail('关于失败上下文的一些有意义的消息')
而不是
assert False
@hoefling我同意
pytest.fail
是好的…但是我们努力让测试名s.t.非常具有描述性。当它们失败时,原因并不神秘。例如,
测试某个函数在用\u 2调用\u时抛出\u值\u错误。如果失败了,那么我们就很清楚出了什么问题。由于这个原因,我们习惯于从不使用
pytest.fail
(感觉我们只是在复制我们的测试函数名)。它可能适用于大多数简单的测试,但在一个测试中已经有多个断言(如您给出的示例中)必须读取堆栈跟踪,以了解哪些特定的
断言False
失败以及原因。简短的解释总比没有好。是的,你知道。我以前曾被这个问题困扰过。我将在这里补充我的答案