防止pytest中长字符串被截断

15

我使用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的版本。


还可以查看这个相关问题相关答案,通过向pytest传递--showlocals选项,然后手动检查上面分配的s本地变量的值来解决此问题。 - Cecil Curry
3个回答

11
一个适用于较高版本pytest(如5)的简单技巧是修改控制截断多少差异的值。
# conftest.py
from _pytest.assertion import truncate
truncate.DEFAULT_MAX_LINES = 9999
truncate.DEFAULT_MAX_CHARS = 9999  

这样可以使您把冗余度保持在0,但仍然可以看到长比较中失败的内容。只需确保在更新pytest时进行检查,以确保内部没有更改,因为这会干扰其内部。

编辑正如Cecil Curry所指出的,这种方法并不意味着完全解决问题。希望Pytest添加此功能,这样我们就可以在不破坏封装性的情况下获得所需结果。 :)


糟糕。一方面,这是暂时很棒的。另一方面,这违反了隐私封装,因此在未来的pytest版本中必定会失败。这就不那么令人激动了。 - Cecil Curry
你还可以执行 truncate.DEFAULT_MAX_CHARS = truncate.DEFAULT_MAX_LINES * (os.environ.get("COLUMNS", 80) + 1) ,以适应输出中 DEFAULT_MAX_LINES 的内容(包括行尾换行符)。 - l0b0

1

我刚使用的另一个技巧(但仅限于手动检查,没有自动化超出pytest本身)是将输出作为第二个“参数”传递给assert(即作为“assert消息”)。 Pytest显示完整的断言消息而不截断。 所以我有:

assert shortString in veryLongString

我想看到完整的长字符串,所以我将其改为:

assert shortString in veryLongString, veryLongString

输出结果难看且格式混乱,但我能够看到它,这已足以让我解决问题。


-4

你可以使用tb标志来获取pytest的回溯输出。 有几个选项可供选择: --tb=style traceback print mode (auto/long/short/line/native/no)

你需要选择最适合你的选项。


1
--tb=选项对断言长度没有影响。 - sorin
是的!正如我所说,tb标志,这是pytest的回溯输出。 仅用于输出而不是断言¯_(ツ)_/¯ - Ederson Badeca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接