Answers:
与完全进行测试的重要性相比,测试的组织方式并不重要。
一个好的测试套件最重要的是它涵盖了所有功能。这样可以确保每当引入回归缺陷时,您都会立即注意到。为每种方法编写一个测试,为一个方法的每个输入值组合编写一个测试,还是为该方法中的每个可能的代码路径编写一个测试,都没有那么重要。将这些测试分为几个或几个测试类甚至没有那么重要:一个测试套件应始终完全成功,因此,它是否通过了17项测试中的3项或2项都不重要-两者都是错误的,必须是固定。
当然,测试代码也是代码,因此它应遵循正常的最佳实践以实现可维护性,模块化等。但这必须取决于测试套件本身的可维护性,而不是取决于测试类与测试套件之间的关系。他们测试的课程。您提到的两个策略都可以帮助您记住在一致地遵循条件的情况下从哪里查找内容,但是对于此,一致性比选择策略更为重要。
我认为“每个方法一个测试类”和“每个类一个测试类”通常都太极端了。
通常,您希望对每个测试方法/单元测试进行一次检查。例如,这些可以是多个断言来检查list.isEmpty = true
和list.Length = 0
,因此每个行为一个测试方法/单元测试。
这样就很容易拿出描述行为的测试方法名称。您希望将测试方法分组到一个测试类中,因此,当您阅读时test classname.test method
,这很有意义。通常,它们具有一些共享的设置代码,然后可以轻松地将它们放入测试设置/装置中。根据要测试的类,这可以是整个类的一个测试类,也可以是一个方法的一个测试类。但通常,它会介于两者之间。
与普通代码一样,您希望测试尽可能可读。对我来说有帮助的是按照给定的BDD(何时,然后是行为声明)的方式组织测试代码。一个测试类可以给定它,它是设置程序。然后,该类中的每个测试方法都使用该给定的(或部分)测试方法,并且在某时有一个。
还可以将单元测试视为有关如何使用被测类功能的文档。使用良好的单元测试,您可以阅读测试以了解如何使用您要使用的类的功能以及效果将是什么。
当某件事坏了并且单元测试失败时,您希望它尽可能容易地了解什么坏了,每个测试一个断言在这里很有帮助。当一个测试中有多个断言时,只有第一个断言失败,然后该方法退出,因此,在解决导致第一个断言失败的问题之前,您不知道在随后的测试中测试的其他行为是否也被破坏。有了一个断言,您所有其他测试方法仍然可以执行,并且了解失败的深度要快得多。
当然,我同意Kilian Foth的观点:实际上,您可以幸运地为正在处理的代码进行了一些单元测试。而且,任何小型的本地化测试总比没有测试要好,或者仅在构建服务器上运行的大型集成测试会花费很多时间,而且通常不是非常本地化(它们不会告诉您错误的位置-您将需要做一些工作)。
我认为每个课程都有其测试课程是正确的。这个想法是将与目标类相关的所有单元测试集中在一个测试类中。然后,例如,MyClass.java
将其测试类称为MyClassTest.java
。