Python 对于pytest,为什么继承的测试方法不能给出正确的断言输出?

Python 对于pytest,为什么继承的测试方法不能给出正确的断言输出?,python,inheritance,pytest,Python,Inheritance,Pytest,我正在开发一个具有命令行界面的应用程序,我希望使用pytest对其进行测试。我的想法是定义测试类,比如 class TestEchoCmd(Scenario): commands = [ "echo foo" ] stdout = "foo\n" 然后使用带有测试方法的类进行实际测试。换句话说,这些类不是在描述场景的每个类中定义测试方法(总是相同的),而是从场景类继承测试方法: class Scenario: commands = []

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

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")
这必须在导入相关模块之前完成