所以我有一个看起来如下的类:
public class MyClass
{
DatabaseDependency _depend;
public MyClass(DatabaseDependency depend)
{
_depend = depend;
}
public string DoSomething(DBParameter database)
{
var result = _depend.GetResults(database, ...);
string response = String.Empty;
// some logic to process the result
return response;
}
}
其中DBParameter是一个包含Server,DBName,DBType等属性的简单值类。
现在,我想为DoSomething添加一个重载,以便它接受连接字符串而不是DBParameter参数(假设DatabaseDependency已经有一个接受连接字符串的GetResults重载)。
我的问题:我有几个单元测试,用于描述用于处理DatabaseDependency.GetResults结果的各种逻辑路径。当我向DoSomething添加重载时,我基本上会重构代码,以便这两个重载都重用这个逻辑(即可能将它移动到私有方法)。进行单元测试的正确方法是什么?我是否需要进行尽可能多的单元测试来验证我添加的新重载的所有逻辑路径?
答案 0 :(得分:7)
如果您的代码保持当前的样式,那么是:您还需要对该方法进行单元测试,基本上重复您的测试工作。
但是,如果实现功能以便一个方法只调用另一个方法是有意义的,那么可以将其他方法设为虚拟方法。这将允许您创建一个特定于测试的子类,您只需使用正确的值验证另一个方法正在调用虚方法。
一旦通过一个或多个单元测试验证了这一点,您就不需要再进一步测试该方法了,因为现在您已经证明了该方法正确地调用了另一种方法,并且您可以将测试工作集中在该方法上。
答案 1 :(得分:6)
如果您确信使用字符串的重载方法只是转换为连接对象然后委托给原始对象,则应该再添加一个测试方法。
但是,如果重构底层重载方法,则不会发生委派,这会破坏。在这种情况下,我会更有信心复制这两种方法的所有测试。
我认为第一条路线是最实用的。但是,偶尔运行代码覆盖率分析是个好主意,这将在以后表明是否需要更多测试。
答案 2 :(得分:1)
是的,将常规处理重构为私有方法 - 我认为无论测试考虑因素如何,您都会这样做,重复代码很糟糕。有趣的是,考虑测试会让我们做正确的事情。
然后,您可以为每个重叠的启动路径进行几个简单的测试。
答案 3 :(得分:0)
取决于您是否正在进行黑盒测试或白盒测试,以及您是否正在使用该方法的两种版本。
如果您假设您只是测试实现,那么只需测试'main'版本即可。如果您正在考虑只知道所提供的API(javadocs或类似)的测试编写者,那么您需要仅基于API进行测试,这意味着完全测试这两种方法。
如果您的应用程序仅使用一种方法,则弃用另一种方法并创建一个版本条件测试,当某个预定版本的已弃用方法仍然存在时,该测试失败。 IE:强制在某个时候删除已弃用的方法。