如何将单元测试用例应用于一个大方法或例程的一个部分?

时间:2016-08-25 00:44:03

标签: unit-testing tdd

我正在尝试在我的代码中为一个小的更改请求应用TDD。因为它是一个现有的代码,它周围绝对没有单元测试用例。我需要以下方案的帮助。

考虑示例(C#代码示例):

private void main()
{
//some existing code logic
existinglogicA();
existinglogicB<some_inlinecode>;
existinglogicC<some_inlinecode>;

//Say, I am going to add new code logic here to follow the upward code workflow
newlogicX();

existinglogicD<some_inlinecode>;
existinglogicE();
}

问题: 1.我应该将“newlogicX()”作为公共方法暴露给单元测试吗? 2.我是否应该为整个例程“main()”添加单元测试?

3 个答案:

答案 0 :(得分:1)

这里有几种可能的方法。有关更广泛的讨论,您应该查看Michael Feather的“有效使用遗留代码”一书。

您可以轻松地将该方法设为公开,是的。缺点是您的类的公共接口增长,您可能不希望在其接口上公开此特定方法。决定因素通常是该方法是否有意义作为类的责任,即使它在生产中的唯一用途是在类中。如果确实如此,那么通过公开它就会失去任何东西,并且你在可测试性方面获益。

如果没有,那么你最好的办法是将方法提取到一个新的类中,该方法作为API成员有意义。然后,您可以独立于其使用的类来测试新类的功能。这样做的好处是新类中的逻辑可以更容易地进行测试,旧类可以使用某种模拟或伪注入,为您提供一个可能有用的测试接口,用于控制旧类测试中的行为。

提取到一个新类的缺点是,正如你所建议的那样,你会发现新类对旧类中的事情发生了某种时间依赖 - 即你最终在方法调用之间紧密耦合关于新类的旧类和方法。然而,实际上,存在设计缺陷并且新的类结构仅仅突出了缺陷。然而,你所获得的是新的类结构更容易测试,因此,更容易重构为更好的设计没有表现出这种问题。

tl; dr - 无论是在这个类还是在另一个类上,你都应该将这个方法公之于众。

答案 1 :(得分:0)

如果可以的话 - 更好地为newlogicX方法编写测试。在这种情况下,如果你错过了测试中的某些内容 - 稍后处理它会更容易。

答案 2 :(得分:0)

如果这是您的结构,那么将其公之于众。鉴于该代码的结构是公共还是私有,这有什么区别?