Python中测试类的正确方式是什么?

5
有一个名为State的类,它有几个属性,我需要编写单元测试。测试将需要执行某些操作来更改State实例的属性值。期望参数位于字典内。单元测试将比较State实例的属性与字典中的值是否相等。
问题是最佳比较逻辑存放位置在哪里?我考虑了两个选项:
  1. State类添加__eq__方法,其中包含比较逻辑。
  2. 在测试模块内添加包含比较逻辑的帮助函数。
哪个选项更好,为什么?

我认为,如果你认为按值实现__eq__是你想要的代码实现方式,那么就这样做。否则,最好避免将仅用于测试的内容添加到生产代码中。在测试文件中添加一个帮助函数来进行所需的比较。不过,我有一点困惑,不太清楚你想要做什么,也许一个代码示例可以帮助澄清问题。 - QuinnFreedman
2个回答

3
在大多数情况下,__eq__ 不应该用于将一个特定对象与 dict 进行比较并给出相等性。预期的行为是允许在同一(或继承)类型的对象之间进行比较。如果您正在寻找一种比较 State 对象的方法,那么它可能很有用 - 但根据您的描述,这似乎不是这种情况。
如果这些测试没有明确地测试相等性,而是测试某些属性,请小心使用 __eq__ 进行特定测试。未来对于同一类对象之间的比较需求的更改可能不具有与您在测试中实际测试的语义意义相同。例如;对 __eq__ 的未来更改可能会引入比您的测试要求更多的相似性要求(例如;它们是否实际上是相同的对象而不仅仅是相似的)。由于 __eq__ 的预期行为是“这代表完全相同的事物”,因此可能与您正在测试的内容不同。
将比较保持在类外面 - 如果您希望在不同的上下文中重复使用它,则可以将其添加为项目中的实用程序函数或将其作为特定函数添加到您的对象中。现在我只会在测试中保留它,然后在必要时将其移动到项目中。
这一切都假定比较是简单的。如果涉及实际逻辑和计算 - 那不属于测试。相反,将逻辑添加到您的类中,以直接以适当可测试的格式公开值。
测试只需检查返回的值是否与预期值匹配即可。但是,将返回的 dict 与该 dict 的预期值进行比较是完全有效的。

0
你应该采用__eq__方法。这样,如果有必要,在实际代码中也可以测试相等性,同时还能避免在未来使用类型注释时导入帮助函数可能会出现的混乱情况。
通常情况下,你不希望测试代码包含太多逻辑,因为测试旨在测试代码而不是实现更多需要被测试的逻辑。除了实际的测试函数之外,测试套件应该非常简单。
我能想到的唯一不采用这种方法的原因是,如果你正在测试的类具有某些独特的用例,其中__eq__不适用,你想避免实现一个并且可能会在以后困扰你自己或未来的开发人员。

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