TDD功能测试

时间:2011-10-13 18:58:26

标签: unit-testing testing tdd

我应该为所有嵌套方法编写单元测试,还是为调用者编写一个测试就足够了?

例如:

void Main()
{
    var x = new A().AFoo();
}

public class A
{
    public int AFoo()
    {        
        // some logic
        var x = new B().BFoo();

        // might have some logic

        return x;
    }
}

public class B
{
    public int BFoo()
    {
        // some logic
        return ???;
    }
}

是否足以为Main()方法编写单元测试,或者我需要为Main,A.AFoo(),B.BFoo()方法编写测试?我该走多远?

提前致谢。

3 个答案:

答案 0 :(得分:5)

测试纯粹主义者会说您需要为类AB创建单元测试。

每个班级都应该测试所有方法。如果方法可以执行多个操作(例如,如果您有if语句),那么您应该对每个路径进行测试。如果测试过于复杂,重构代码以使测试更简单可能是个好主意。

请注意,现在它很难单独测试A因为它取决于B。如果B很简单,就像现在一样,它可能还可以。您可能希望为A集成测试命名测试,因为从技术上讲,它们同时测试AB。另一种选择是让方法AFoo接受它运行的B实例作为参数。这样你就可以模拟B的实例并进行真正的单元测试。

答案 1 :(得分:2)

单元测试应该在单元上工作,在OOP的情况下,单元是类和类的方法。这意味着您应该为所考虑的每个类编写一个单独的测试类,并为该类中提供的每个方法至少编写一个测试方法。更重要的是,尽可能地隔离类是很重要的,这样B类中的错误不会导致A类失败。这就是为什么控制反转(依赖注入)是如此有用,因为如果你可以注入将类B的实例放入类A的实例中,可以将B更改为只是一个Mock对象。

我们编写单元测试的原因之一是在代码中准确地解释每个类的方法在所有条件下的行为,包括特别是边缘情况。通过在main方法上编写测试很难详细说明B类的预期行为。

我建议在线阅读一些材料,解释测试驱动的开发以及如何模拟对象,并且可能使用一些优秀的模拟库,例如JMock。有关更多链接,请参阅此question

答案 2 :(得分:1)

单元测试应该可以帮助您减少调试工作量。因此,当您只为AFoo编写单元测试而没有为BFoo编写单元测试时,如果您的某个测试失败,您可能无法知道问题是否属于A类或B类。 BFoo也会帮助您在较短的时间内隔离错误。