如何构建具有依赖关系的单元测试?

时间:2009-12-03 07:30:17

标签: unit-testing

给出以下简单示例:

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()也会失败。在一个足够复杂的类中,找出为什么确切地说单元测试失败可能真的很复杂。

一个单元如何测试具有依赖关系的方法/对象/部件?

5 个答案:

答案 0 :(得分:2)

我通常只是让他们失败 - 课程应该足够简单,以便快速发现不良测试 但是,在复杂的情况下,我们使用简单的命名约定进行测试,以确保保留某个订单(def test_00_adddef test_01_multiply)。

同样,如果你的课程变得很大,这将更难管理,所以只是不要把它们变大:)

答案 1 :(得分:1)

multiply内部使用add这一事实是multiply的实施细节。因此,请勿在测试中明确考虑这些因素,并“仅”编写测试以测试addmultiply的功能。

如果您使用TDD来获取代码,那么您的课程不应该变得如此复杂,以至于您似乎遇到的问题都是真正的问题。

所以从本质上讲,我同意abyx。 ; - )

答案 2 :(得分:0)

作为一般规则,如果一个类足够复杂以至于难以对其进行单元测试,那么您可能应该将它拆分为更简单的相关类。

此外,最佳做法是在接口上设计类依赖项,而不是在具体类中,以便能够使用mocks进行单元测试。

答案 3 :(得分:0)

这取决于子方法/对象/无论是内部实现细节还是协作者。

如果最终结果只有一个正确的结果,并且它永远不会改变,那么它可能值得一起测试它们。但是,如果“内部”对象的行为实际上是单独的行为,那么最好将它放在接口后面。

我不确定答案是否清楚......

答案 4 :(得分:0)

理想的测试跑步者会对此进行排序。

Kent Beck developed a intelligent test runner根据失败统计和执行时间执行测试。

一个复杂的基于流分析的测试运行器可以构建测试执行的优先级,以测试其他代码所依赖的测试功能。