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

标签 python pytest assert

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

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

最佳答案

如果您希望当且仅当抛出 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 False没有任何问题。或assert 0当你想明确失败时。我(以及与我一起工作的其他专业Python开发人员)一直这样做。

编辑:更好地使用 pytest.fail使用特定消息而不是 assert False ,特别是在有多个 assert False 的情况下漂浮在周围。这样,您就会知道哪个 assert如果您添加有用的错误消息,则失败以及原因。

关于python - 发生异常时测试失败的正确断言是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51431308/

相关文章:

python - Pyramid - 我必须在更改注册之前运行 python setup.py install

python - 在 Docker 容器中运行图形进程,分离并重新连接到正在运行的 GUI

django - 如何从 python manage.py test 调用 pytest-django?

python - Django 测试 VS pytest

python - python 3.1 unittest 中不可用的断言方法

python - 如何制作一个显示简单加载屏幕的程序?请参阅下面的更多细节

python - 如何减少 if/elif 语句中的重复代码

python - pytest 断言列在另一个已排序的组中是升序还是降序

Swift assert() 无法与 nil 进行简单比较

nunit - nUnit 中的assert.GreaterOrEqual 和Assert.IsTrue 有什么区别吗?