14

我已经使用 pytest 为我们的代码的系统测试编写了一个测试工具。这些测试在我们的持续集成系统中使用,所以我使用 junit xml 输出选项。pytest 截断长字符串给我带来了问题。我知道我可以使用 -vv 选项来阻止它,但是这会为每个难以阅读的测试结果提供详细的输出。本质上,我想要一种不同的方法来防止至少在 junit xml 文件中截断长字符串。如果它也适用于控制台输出,那会更好但不是必需的。

我们的代码生成具有大量值的报告,我将输出与一组已知正确的输出进行比较。我报告了所有错误的字段,而不仅仅是第一个错误。所以我正在生成一个字符串列表,每个字符串都有一个错误。然后我用换行符连接字符串以创建一个长字符串和包含所有错误的长字符串。如果断言失败,我需要查看可能有几百行的字符串的全部内容。

errors = []
error.extend(get_report_errors())
s = '\n'.join(errors)
assert (s == '')

有什么建议么

我正在使用 python 2.6 和 2.7 以及 pytest 2.3.5。我可以升级需要的pytest版本。

4

3 回答 3

6

一个适用于更高版本 pytest(例如 5)的简单技巧是修改控制差异被截断多少的值。

# conftest.py
from _pytest.assertion import truncate
truncate.DEFAULT_MAX_LINES = 9999
truncate.DEFAULT_MAX_CHARS = 9999  

这允许您将详细程度保留为 0,但仍然可以看到长时间比较失败的原因。只要确保在更新 pytest 时检查以确保内部没有改变,因为这在里面乱七八糟。

编辑 正如 Cecil Curry 指出的那样,这个 hack 并不是一个完整的解决方案。希望这个特性被添加到 Pytest 中,这样我们就可以在不破坏封装的情况下得到我们想要的东西。:)

于 2020-02-20T14:09:28.623 回答
0

You can use the tb flag this is the traceback output for pytest. There is a few options for that: --tb=style traceback print mode (auto/long/short/line/native/no)

You need to chooise what is the best for you.

于 2018-01-31T16:13:34.140 回答
0

我刚刚用于此的另一个技巧(但对于手动检查,除了 pytest 本身之外没有任何自动化)是使用输出作为断言的第二个“参数”(即,作为“断言​​消息”)。Pytest 显示完整的断言消息,没有截断。所以我有:

assert shortString in veryLongString

我想看到没有截断的veryLongString,所以我将其更改为:

assert shortString in veryLongString, veryLongString

输出很难看,格式也很差,但我可以看到它足以让我解决我的问题。

于 2022-02-19T01:19:24.180 回答