gpt4 book ai didi

python - 使用 pytest,为什么继承的测试方法不能给出正确的断言输出?

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:12 24 4
gpt4 key购买 nike

我正在开发一个具有命令行界面的应用程序,我想使用 pytest 对其进行测试。我的想法是定义像这样的测试类

class TestEchoCmd(Scenario):
commands = [
"echo foo"
]
stdout = "foo\n"

然后使用一个带有测试方法的类来进行实际测试。换句话说,不是在每个描述场景的类中定义测试方法——它总是相同的(这会非常乏味),而是这些类从 Scenario 类继承测试方法:

class Scenario:
commands = []
stdout = ""

def test_scenario(self, capsys):
for cmd in self.commands:
ret = my_app.execute_command(shlex.split(cmd))
assert ret == 0
stdout, stderr = capsys.readouterr()
assert stdout == self.stdout

只要测试通过,它就可以正常工作。如果测试失败,则 pytest 只是输出一个没有附加信息的 AssertionError,这与未继承测试方法的情况不同,它很好地描述了 asserted 表达式细节。这适得其反,因为无法准确说明断言失败的原因。

有没有办法让它工作?我真的很想让场景描述尽可能简洁。 (我知道 @pytest.mark.parametrize 但我认为在这种情况下它不会产生非常可读的代码。)

(哦,顺便说一下,这是 Debian GNU/Linux 提供的 pytest 3.0.2。)

最佳答案

我自己找到了答案:Pytest 喜欢重写 Python AST 中的 assert 语句以添加更明确的输出。这种重写(以及其他地方)发生在它认为包含测试方法的类中,即名称以 Test 开头的类。如果测试方法是从另一个模块中的类继承的,否则不会被视为测试,则 assert 不会被重写,因此不会出现奇怪的错误消息。

根据 pytest 文档,解决方案是让 pytest 也重写该其他模块中的 assert 语句,使用

pytest.register_assert_rewrite("module.name.goes.here")

这必须在导入相关模块之前完成。

关于python - 使用 pytest,为什么继承的测试方法不能给出正确的断言输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39620910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com