gpt4 book ai didi

Python单元测试: How to temporarily redirect stdout messages to a buffer and to test its content?

转载 作者:行者123 更新时间:2023-12-01 06:46:29 24 4
gpt4 key购买 nike

我想在测试期间暂时捕获发送到 stdout (我们的 stderr)的消息,并断言这些消息中是否出现某些字符串模式:

import unittest
class SomeTest(unittest.TestCase):
def test_stdout(self):
output = ""
function_that_writes_to_stdout()
# How to capture stdout in output temporarily?
self.assertIn("some message", output)

我找到了 similar question ,但接受的答案建议捕获发送到所有测试用例的 stdout 的消息。

是的,我知道对发送到标准输出的消息进行单元测试并不是很明智。是的,我也知道最好将 loggingassertLogs 结合使用。我们假设这两个选项现阶段都不可用。

最佳答案

解决方案 1。以下方法对我有用:

import io
import unittest
from contextlib import redirect_stdout

class Test(unittest.TestCase):
def test_stdout(self):
buf = io.StringIO()
with redirect_stdout(buf):
print("foo!")
self.assertIn("foo", buf.getvalue())

buf.getvalue() 将包含整个输出,包括 \n 字符。

解决方案 2。 模仿 assertLogs 的行为,可以通过方法 assertStdout 扩展 unittest.TestCase,如下所示。

class StdoutRedirectionContext():
class ListIO():
def __init__(self):
# Container for messages sent to stdout.
self.output = []
def write(self, s):
# Filter empty strings or naked newline characters.
if s in ("\n", ""): return
self.output.append(s)

def __enter__(self):
self._buf = self.ListIO()
self._ctx = redirect_stdout(self._buf)
self._ctx.__enter__()
return self._buf

def __exit__(self, exc_type, exc_value, exc_traceback):
self._ctx.__exit__(exc_type, exc_value, exc_traceback)

class TestCase(unittest.TestCase):
def assertStdout(self):
return StdoutRedirectionContext()

这里,StdoutRedirectionContext 充当上下文管理器,单个消息将收集在output 列表中。扩展的 TestCase 可以按如下方式使用来在 stdout 上断言消息:

class AnotherTest(TestCase):
def test_stdout(self):
with self.assertStdout() as cm:
print("foo!")
print("bar!")
self.assertIn("foo!", cm.output)
self.assertIn("baz!", cm.output)

以上产生以下输出:

======================================================================
FAIL: test_stdout (__main__.AnotherTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "executor_test.py", line 440, in test_stdout
self.assertIn("baz!", cm.output)
AssertionError: 'baz!' not found in ['foo!', 'bar!']

关于Python单元测试: How to temporarily redirect stdout messages to a buffer and to test its content?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59201313/

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