给出以下简单示例:
class MathObject(object):
""" A completely superfluous class. """
def add(self, a, b):
return a + b
def multiply(self, a, b):
result = 0
for _ in range(b):
result = self.add(result, a)
return result
显然,multiply()
在内部调用add()
。如果add
失败,multiply()
也会失败。在一个足够复杂的类中,找出为什么确切地说单元测试失败可能真的很复杂。
一个单元如何测试具有依赖关系的方法/对象/部件?
答案 0 :(得分:2)
我通常只是让他们失败 - 课程应该足够简单,以便快速发现不良测试
但是,在复杂的情况下,我们使用简单的命名约定进行测试,以确保保留某个订单(def test_00_add
,def test_01_multiply
)。
同样,如果你的课程变得很大,这将更难管理,所以只是不要把它们变大:)
答案 1 :(得分:1)
multiply
内部使用add
这一事实是multiply
的实施细节。因此,请勿在测试中明确考虑这些因素,并“仅”编写测试以测试add
和multiply
的功能。
如果您使用TDD来获取代码,那么您的课程不应该变得如此复杂,以至于您似乎遇到的问题都是真正的问题。
所以从本质上讲,我同意abyx。 ; - )
答案 2 :(得分:0)
作为一般规则,如果一个类足够复杂以至于难以对其进行单元测试,那么您可能应该将它拆分为更简单的相关类。
此外,最佳做法是在接口上设计类依赖项,而不是在具体类中,以便能够使用mocks进行单元测试。
答案 3 :(得分:0)
这取决于子方法/对象/无论是内部实现细节还是协作者。
如果最终结果只有一个正确的结果,并且它永远不会改变,那么它可能值得一起测试它们。但是,如果“内部”对象的行为实际上是单独的行为,那么最好将它放在接口后面。
我不确定答案是否清楚......
答案 4 :(得分:0)
理想的测试跑步者会对此进行排序。
Kent Beck developed a intelligent test runner根据失败统计和执行时间执行测试。
一个复杂的基于流分析的测试运行器可以构建测试执行的优先级,以测试其他代码所依赖的测试功能。