返回

在 Pytest 运行中显示标准输出:调试打印输出的技巧

python

在 Pytest 运行期间查看标准输出

问题

在 Pytest 中运行测试时,你可能希望查看代码中打印的标准输出。但是,默认情况下,Pytest 会捕获和处理这些输出,防止它们干扰测试结果。这会导致无法在 PyCharm 中运行测试时看到打印的输出。

解决方案

有几种方法可以查看 Pytest 运行期间的标准输出:

1. 使用 --capture=no 选项

在命令行中运行 Pytest 时,可以使用 --capture=no 选项来禁用标准输出捕获。这将允许在终端中看到打印的输出。

pytest --capture=no

2. 使用 sys.stdout

在代码中,可以使用 sys.stdout 对象将打印输出重定向到标准输出。这将使打印的输出出现在控制台中。

import sys

# 将打印输出重定向到标准输出
sys.stdout = sys.__stdout__

# ...

3. 使用 pytest-capturelog 插件

Pytest-capturelog 插件可以提供对打印输出的更精细控制。使用该插件,可以捕获、过滤和显示打印的输出。

4. 避免使用 print 语句

为了避免与 Pytest 的标准输出捕获机制发生冲突,建议在测试代码中使用替代方法,例如记录或断言。

使用替代方法的示例:

# 使用记录
import logging

logging.info("这是打印的信息")

# 使用断言
assert 1 == 1, "这是断言信息"

结论

通过使用这些技术,你可以在 Pytest 运行期间轻松查看标准输出,以便在测试代码时对打印的输出进行调试。

常见问题解答

1. 为什么 Pytest 默认捕获标准输出?

Pytest 旨在捕获和处理测试中的标准输出,以防止其干扰测试结果。这有助于确保测试的可靠性和可重复性。

2. 使用 sys.stdout 有什么缺点?

使用 sys.stdout 重定向打印输出可能会破坏测试代码中其他使用 sys.stdout 的功能。

3. 什么时候应该使用 pytest-capturelog 插件?

当需要对打印的输出进行更精细的控制时,例如过滤或只捕获特定消息时,应该使用 pytest-capturelog 插件。

4. 除了打印输出之外,Pytest 还捕获哪些其他输出类型?

Pytest 还捕获标准错误输出和警告。

5. 如何查看捕获的标准输出?

可以通过使用 pytest --show-capture=all 命令行选项或使用 pytest-capturelog 插件的 pytest_capturelog.LOG_INFO 变量来查看捕获的标准输出。