如何在(nose)测试执行期间显示Python警告?

3 投票
1 回答
758 浏览
提问于 2025-04-29 11:33

我在用 nose 作为我的 Python 单元测试工具。有一个测试是用来确认非常大的输入文件可以被处理,而不会出现 MemoryError 的错误。这个测试在我的电脑上通过了,但在 Travis(持续集成工具)上,测试运行时间太长没有任何输出,所以 Travis 就停止了这个测试。

为了改善这种情况(并给用户提供更好的提示信息),我开始使用 warnings 模块来在读取大文件时显示警告:

WARNING: file contains greater than 100000 rows
WARNING: file contains greater than 200000 rows
WARNING: file contains greater than 300000 rows
# etc.

这些警告在正常使用程序时会显示出来,但 nose 似乎会捕捉或抑制这些警告。

我该如何在测试运行时显示警告,而不改变 nose 现有的日志捕捉行为呢?

暂无标签

1 个回答

0

要测试警告信息,你可以使用 catch_warnings 这个上下文管理器。这样在测试时,你就可以检查某个函数是否产生了警告。实际上,在测试过程中输出警告并不重要。

在测试中:

with warnings.catch_warnings(record=True) as w:
    warnings.simplefilter("always")
    operate_on_25000_row_file()
    assert len(w) == 1
    assert "20000 rows" in str(w[-1].message)

你也可以尝试强制打印警告,或者把所有警告当作异常来处理,这样测试运行器就能捕捉到它们:

warnings.simplefilter('always')  # always print
# or
warnings.simplefilter('error')  # raise exceptions

Travis CI 还 提供了文档,说明如何处理他们服务上的构建超时问题。

撰写回答