在单元测试中使用assertTrue(==)与assertEqual的区别

17
在Python的unittest模块中,在以下情况下使用assertTrue()和assertEqual()是否有优缺点?

在Python的unittest模块中,针对以下情况,使用assertTrue()assertEqual()有何优劣之处?

self.assertTrue(a == b)
self.assertEqual(a, b)
2个回答

26

始终使用 assertEqual(),因为它可以自定义失败输出

该方法将委托给各种辅助方法来显示您如何处理例如当断言失败时两个字符串或两个列表的差异,前提是两个参数的类型匹配并且已注册具有特定类型的辅助方法。

assertTrue() 只能告诉您有关断言失败的信息,无法显示原因。

assertEqual()文档中得知:

此外,如果 firstsecond 是完全相同的类型,其中一个是listtupledictsetfrozensetstr 或任何子类在 addTypeEqualityFunc() 中注册的类型,则将调用类型特定的等式函数以生成更有用的默认错误消息(请参见类型特定方法列表)。

只有在没有更具体的断言可用时才使用 assertTrue()


如果你有一个返回布尔值的方法,我不认为使用assertEqual是有必要的。 - Ed_
@Ed_: 这并不是问题所询问的内容。答案只回答了所提出的问题,并没有进一步解释“何时应该使用assertTrue”的上下文。 - Martijn Pieters

2
如果你想检查除True以外的值,请选择assertEqual以获取有意义的错误消息。我认为,它也更易读,因为你定义了期望部分与要检查的值进行比较。
如果你想检查True布尔结果(例如assertTrue(user.hasAdminRole())),请选择assertTrue而非assertEqual

2
这不是被问到的问题。是的,assertTrue() 的目的是对一个表达式的真值做出断言。这个问题特别适用于 == 相等性测试。 - Martijn Pieters
你可能想在 hasAdminRole 的例子中使用 assertIs(True, xxx) 而不是 assertTrue。否则,user.hasAdminRole 可能会返回 37 并通过测试,这可能不是你想要的结果。请参考 https://stackoverflow.com/questions/62117162/what-is-the-difference-between-assertis-and-asserttrue-in-unittest-module-when。 - ThoughtfulHacking

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