可以避免测试基类吗?


15

我有一个带有大量“元编程”的基类,以使其具有相当通用的灵活性/抽象性。

在基类中,我确实有很多使用通用方法的子类,并且有面向行为的单元测试,涵盖了每个子类中的所有情况。

可以跳过基类测试吗?


1
当我开始问自己这个问题时,有时候我要做的一件事就是尝试破坏代码。对其输入无效的输入,指定错误的配置值,等等
。– Zymus

Answers:


31

为了验证您是否有足够的测试,您可以检查代码覆盖率以及由测试引起的分支覆盖率(可以使用覆盖率工具,也可以通过查看代码路径或调试器来手动进行)。

如果得出结论,则子类的测试为您的基类代码提供了足够高的覆盖率,那么添加更多的测试显然不会给您带来太大的好处。另一方面,如果存在代码路径,则只能通过直接使用基类添加特定的测试来进行测试,那么您应该走这条路线。

“直接测试您的基类”的另一个可能原因是您要“单独”测试该类的特定功能。有时,直接为特定方法设计测试用例会更容易,而不是仅通过调用使用该方法的子类的方法来间接测试该方法,而不是仅间接测试该方法。

请注意,如果您有一个通用基类,其典型用法为其派生一个子类,则您的基类可能是抽象的。因此,为了测试此类,您无论如何都需要进行派生。对于这种情况,当然,直接测试“基类”可能意味着要添加一个特殊的派生类,仅用于测试目的。


是的,我同意在基类上进行更明确定义的方法的直接单元测试。我不想做的是测试所有元编程,因为对子类的单元测试隐式地测试了这些东西。
弥敦道

4
设计一个类来扩展仅存在于测试目录中的基类/抽象类,并且仅用于公开/实例化基类,这是获得适当覆盖基类并确保基础方法正确的完全合法和合理的方法。在隔离使用的那些更复杂的类的情况下可以正常工作。

@MichaelT:是的。我的回答听起来像是我对此有不同的看法吗?
布朗

@DocBrown根本没有-您清楚地指出了这一点。我只是添加了一些其他解释,这些解释将在我自己的答案中写(如果您尚未声明的话)。我不想写一个开始的答案“我同意Doc所说的一切,但想专门喊出来并写更多关于...的信息”

2

创建自动化测试是为了给程序员带来好处,而并不是为程序员提供服务。

我们进行了测试,以提高我们的生产力,并减少客户抱怨的“问题”数量。

因此,假设您具有面向行为的单元测试,涵盖了每个子类中的所有情况,那么直接测试基类对您的客户没有好处。这可以被确认通过在基类中改变了一些代码,如果测试失败看到,如常见的了一行代码,或添加一个“不”到“if语句”。(仅检查测试所覆盖的每一行代码还不够好。)

然后,我们要问测试是否会使您的工作效率更高。这可以通过几种方式发生。

  • 让您更清晰地思考代码-在这种情况下,编写代码是不太可能的。
  • 让您单独测试基类中的某些代码,因此可以更快地对其进行调试,在这种情况下,由于代码已经在工作,因此再次调试的可能性很小。
  • 让您可以在基类中更改代码,而不必了解子类中逻辑的详细信息–也许是在重构代码?

因此,鉴于子类正在工作,我看不出为基类编写直接测试有任何意义。 到今天为止,在早期阶段编写这些测试不会有任何好处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.