pytest 在断言失败时提供了详细的错误报告机制,能够针对不同类型的差异提供易读的错误信息。根据提供的资料示例,当断言失败时,pytest 会自动分析失败的原因,并生成相应的报告。

**针对不同数据类型的差异报告:**

1. **文本(字符串)比较差异:** 当比较两个字符串时,pytest 的报告会清晰地展示出差异。例如,在 `test_eq_text` 和 `test_eq_similar_text` 的示例中,报告会使用 `E` 标记,并用 `+` 和 `-` 符号分别指出预期值和实际值,甚至会用 `?` 标记指出差异发生的位置,这使得用户可以直观地看到哪些字符或部分内容不匹配。

2. **多行文本比较差异:** 对于多行字符串的比较,报告会保留分行结构,并逐行展示差异,例如在 `test_eq_multiline_text` 中,报告会列出每一行,并用 `+` 和 `-` 标记出不同之处。

3. **列表(List)比较差异:** 当比较列表时,报告会指出差异发生的索引位置。例如,在 `test_eq_list` 中,报告会明确指出“At index 2 diff: 2 != 3”,并提示用户使用 `-v` 选项获取更多差异信息。

4. **字典(Dict)比较差异:** 字典的比较差异报告非常详细,它会列出:
* **差异的键值对:** 使用 `Differing items:` 明确指出哪些键的值不匹配,例如 `{'b': 1} != {'b': 2}`。
* **缺失或多余的项:** 报告会分别列出“Left contains 1 more item:”和“Right contains 1 more item:”,指明了左右两个字典中各自多出的键值对。

5. **集合(Set)比较差异:** 集合的差异报告会分别列出“Extra items in the left set:”和“Extra items in the right set:”,清晰地展示了两个集合中各自独有的元素。

6. **数据类(Dataclass)和属性(Attribute)比较差异:** 当比较自定义对象(如使用 `@dataclass` 或 `attr.s` 定义的类实例)时,pytest 的报告会深入到对象的属性层面。它会指出“Differing attributes:”,然后“Drill down into differing attribute b:”,并用 `-` 和 `+` 标记出具体属性值的不匹配,例如 `b: 'b' != 'c'`。

**总结而言,pytest 通过在失败报告中提供结构化的差异展示(如 `+`/`-` 标记、索引定位、属性级差异报告等),极大地增强了错误信息的易读性和可追溯性,使用户能够快速定位到数据结构(列表、字典、文本等)中具体发生不匹配的位置和内容。

信息来源