我应该为所有嵌套方法编写单元测试,还是为调用者编写一个测试就足够了?
例如:
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()方法编写测试?我应该深入到多深?
提前谢谢。
发布于 2011-10-14 03:11:25
单元测试应该在单元上工作,在OOP的情况下,单元是类和类的方法。这意味着您应该为考虑中的每个类编写单独的测试类,并为类中提供的每个方法至少编写一个测试方法。更重要的是,尽可能地隔离类,这样类B中的bug就不会导致类A失败。这就是控制反转(依赖注入)如此有用的原因,因为如果可以将类B的实例注入到类A的实例中,就可以将B更改为Mock对象。
我们编写单元测试的原因之一是用代码准确地解释每个类的方法在所有条件下的预期行为,包括尤其是边缘情况。很难通过在main方法上编写测试来详细说明B类的预期行为。
我建议在线阅读一些材料,解释测试驱动开发以及如何模拟对象,也许还可以使用一些优秀的模拟库,比如JMock。有关更多链接,请参阅此question。
发布于 2011-10-14 03:01:28
测试纯粹主义者会说,您需要为类A和B创建单元测试。
每个类都应该测试所有的方法。如果一个方法可以做多件事(例如,如果您有一条If语句),那么您应该对每条路径进行测试。如果测试变得太复杂,重构代码以使测试更简单可能是一个好主意。
请注意,现在很难单独测试A,因为它依赖于B。如果B是简单的,就像现在一样,它可能是可以的。您可能希望将您的测试命名为A集成测试,因为从技术上讲,它们同时测试A和B。另一种选择是让方法AFoo接受它所操作的B实例作为参数。这样,您就可以模拟B的实例并进行真正的单元测试。
发布于 2011-10-14 03:08:09
单元测试应该可以帮助您减少调试工作。因此,当您只为AFoo编写单元测试而不为BFoo编写单元测试时,如果您的一个测试失败了,您可能不知道问题是属于A类还是B类。为BFoo编写测试也将帮助您在较短的时间内隔离错误。
https://stackoverflow.com/questions/7759067
复制相似问题