python-3.x 如何比较两个文件作为unittest的一部分,同时在不匹配的情况下获得有用的输出?

t40tm48m  于 2023-08-08  发布在  Python
关注(0)|答案(5)|浏览(96)

作为使用unittest框架的一些Python测试的一部分,我需要比较两个相对较短的文本文件,其中一个是测试输出文件,另一个是引用文件。
直接的方法是:

import filecmp
...
self.assertTrue(filecmp.cmp(tst_path, ref_path, shallow=False))

字符串
如果测试通过,它可以正常工作,但是在失败的情况下,输出中没有太大的帮助:
Assert错误:假的不是真的
作为unittest框架的一部分,是否有更好的方法来比较两个文件,以便在不匹配的情况下生成一些有用的输出?

p5fdfcr1

p5fdfcr11#

要获得哪一行有差异的报告以及该行的打印输出,请对内容使用assertListEqual,例如

import io

self.assertListEqual(
    list(io.open(tst_path)),
    list(io.open(ref_path)))

字符串

vwoqyblh

vwoqyblh2#

您需要做的就是为错误条件添加自己的消息。多克
第一个月

8ehkhllq

8ehkhllq3#

以数组的形式比较文件会产生有意义的Assert错误:

assert [row for row in open(actual_path)] == [row for row in open(expected_path)]

字符串
你可以在每次需要比较文件时使用它,或者把它放在一个函数中。你也可以把文件的形式文本字符串而不是数组。

w3nuxt5m

w3nuxt5m4#

比较一下这两个文件的内容不是更好吗?例如,如果它们是文本文件,比较两个文件的文本,这将输出一些更有意义的错误消息。

ac1kyiln

ac1kyiln5#

您可以使用内置的difflib模块来完成此操作。
使用unified_diff,该格式为纯文本,如果文件内容匹配,则为空。首先需要将文件内容读入列表中,unified_diff的返回是一个生成器,所以我们将其 Package 在list中,以便我们可以检查它。这里有一个你可以使用的模板:

from difflib import unified_diff
with open("my/expected/file.txt, "r") as f:
  expected_lines = f.readlines()
with open("my/actual/file.txt, "r") as f:
  actual_lines = f.readlines()

diff = list(unified_diff(expected_lines, actual_lines))
assert diff == [], "Unexpected file contents:\n" + "".join(diff)

字符串
我在这里唯一的抱怨是我希望我有颜色。如果你真的很想要它们,你可以根据来自同一个模块的get_grouped_opcodes的输出实现你自己的diff格式。

相关问题