我已经用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,但我无法确定它。有人有见识吗?非常感谢。
答案 0 :(得分:1)
使用capsys
固定装置可以捕获stdout
或stderr
的输出。
然后,您可以像这样进行检查(根据文档改编的示例):
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