Python 对于pytest,为什么继承的测试方法不能给出正确的断言输出?
我正在开发一个具有命令行界面的应用程序,我希望使用pytest对其进行测试。我的想法是定义测试类,比如Python 对于pytest,为什么继承的测试方法不能给出正确的断言输出?,python,inheritance,pytest,Python,Inheritance,Pytest,我正在开发一个具有命令行界面的应用程序,我希望使用pytest对其进行测试。我的想法是定义测试类,比如 class TestEchoCmd(Scenario): commands = [ "echo foo" ] stdout = "foo\n" 然后使用带有测试方法的类进行实际测试。换句话说,这些类不是在描述场景的每个类中定义测试方法(总是相同的),而是从场景类继承测试方法: class Scenario: commands = []
class TestEchoCmd(Scenario):
commands = [
"echo foo"
]
stdout = "foo\n"
然后使用带有测试方法的类进行实际测试。换句话说,这些类不是在描述场景的每个类中定义测试方法(总是相同的),而是从场景
类继承测试方法:
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
,没有附加信息,这与测试方法没有继承的情况不同,它非常详细地描述了assert
ed表达式。这是适得其反的,因为不可能确切地说出断言失败的原因
有没有办法让这一切顺利进行?我真的希望场景描述尽可能简洁。(我知道@pytest.mark.parametize
,但我认为在这种情况下,它不适合编写非常可读的代码。)
(哦,顺便提一下,这是Debian GNU/Linux提供的pytest 3.0.2。)自己找到了答案:pytest喜欢重写Python AST中的
assert
语句,以添加更明确的输出。这种重写(在其他地方)发生在它认为包含测试方法的类中,即名称以test
开头的类。如果一个测试方法是从另一个模块中的一个类继承的,而这个类本来不会被视为测试,那么断言
不会被重写,因此也不会出现异常的错误消息
根据pytest文档,解决方案是让pytest使用
pytest.register_assert_rewrite("module.name.goes.here")
这必须在导入相关模块之前完成