【问题标题】:How to implement #ifdef in python specifically towards checking for testrunner如何在python中实现#ifdef,专门用于检查testrunner
【发布时间】:2020-12-24 07:32:42
【问题描述】:

我有一些代码似乎与 py.test 冲突,因为它会在 sys.stdout 中产生一些错误。它没有使我的测试失败,但它确实抱怨单元测试正在尝试写入已关闭的文件。当我删除流向标准输出的日志配置部分时,错误消失了。此外,如果我使用 unittest(这是实现原始代码的目的),则代码可以按预期工作,而不会过早关闭 stdout 流。暂时,我想根据测试运行器控制通过哪个日志记录配置。有没有办法让我检查运行时哪个测试运行程序正在运行测试以控制日志记录配置?在 C 语言中,我可以拥有可以被#ifdef 等宏禁用的代码部分。使用#ifdef 预处理器指令可以完全禁用这些语句,如下所示:

 #ifdef MACRO

 controlled text

 #endif /* MACRO */

在 python 中执行类似操作的最佳方法是什么,特别是在运行 testrunner 时?

【问题讨论】:

  • 这是否偶然干扰了pytest 的输出捕获 - 您可以在运行pytest -p no:capture -p no:logging 时重现该问题吗?也许您可以尝试添加minimal reproducible example 屏蔽该问题?除此之外,还有PYTEST_CURRENT_TEST env var,但正如您已经提到的,在生产代码中交付特定于测试的东西并不整洁。您也可以删除 autouse 夹具中的 stdout 处理程序,但 IMO 这也不是好的解决方案。
  • 我注意到在 pytest 命令中使用 -s 选项可以解决问题!

标签: python unit-testing macros runtime pytest


【解决方案1】:

我能够做到这一点的一种方法是定义一个环境变量并在运行时对其进行测试。这种方法的缺点是需要两件事:

  1. 在执行脚本之前定义环境变量
  2. 在生产代码中添加胶水代码(非常不受欢迎)

这是一个例子:

import os
# ...
# removed for sake of brevity
# ...
'handlers': ['file'] if "pytest" in os.environ else ['console', 'file'],
# ...

【讨论】:

    最近更新 更多