Python,py.test和stderr-从Cement日志记录扩展捕获日志记录处理程序输出

时间:2018-06-19 19:48:16

标签: python logging pytest stderr cement

我已经用Python开发了一个应用程序,并且正在使用Cement CLI库。我将py.test与CementTestCase一起使用。我可以使用以下方法在测试用例中毫无问题地从stdout捕获输出:

    with EZOTestApp(argv=['view', 'deploys']) as app:
        old_stdout = sys.stdout
        app.ezo = EZO(app.config["ezo"])
        result = StringIO()
        sys.stdout = result
        app.run()
        output = sys.stdout.getvalue()
        sys.stdout = old_stdout
        assert 'deploy' in output

但是,尝试使用相同的机制捕获来自Cement日志记录扩展程序的stderr输出时,不会捕获任何内容(例如:在上述代码中将'stdout'替换为'stderr')。我看到了一种用于遍历标准Python日志处理程序以查找输出的方法,并且我怀疑将使用Cement日志记录扩展名来捕获stderr,但我无法确定它。有人有见识吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

使用capsys固定装置可以捕获stdoutstderr的输出。

然后,您可以像这样进行检查(根据文档改编的示例):

def test_myoutput(capsys):
    print("hello")
    sys.stderr.write("world\n")
    captured = capsys.readouterr()
    assert captured.out == "hello\n"
    assert captured.err == "world\n"

要获得更高的粒度,可以使用caplog固定装置。这将使您可以访问日志级别,记录器等,而不仅仅是文本行。不过,这取决于您提到的依赖标准库的logging模块的扩展,因此它可能不可用。

您可以使用该固定装置进行操作的示例(同样,功劳归于pytest文档):

def test_baz(caplog):
    func_under_test()
    for record in caplog.records:
        assert record.levelname != 'CRITICAL'
    assert 'wally' not in caplog.text