Java 建议为程序中的每个类编写一个测试用例吗?

Java 建议为程序中的每个类编写一个测试用例吗?,java,unit-testing,junit,Java,Unit Testing,Junit,我刚刚开始介绍单元测试和测试驱动开发。到目前为止,我只使用Junit作为测试框架。出现了一个我还没有找到明确答案的问题:我需要写多少测试用例?我必须为程序中的每个类编写一个测试用例吗?或者这是一个愚蠢的问题,因为单元测试意味着在最低级别(即类)进行测试 我认为为每个类编写一个测试用例可能是更安全的方法(毕竟测试越多,不可预见的bug就越少)。但是我想知道,对于要编写的测试用例的数量,是否有任何广泛认可的策略?如果您正在尝试TDD,那么您不应该在没有失败的测试的情况下编写任何代码。因此,您将永远不

我刚刚开始介绍单元测试和测试驱动开发。到目前为止,我只使用Junit作为测试框架。出现了一个我还没有找到明确答案的问题:我需要写多少测试用例?我必须为程序中的每个类编写一个测试用例吗?或者这是一个愚蠢的问题,因为单元测试意味着在最低级别(即类)进行测试


我认为为每个类编写一个测试用例可能是更安全的方法(毕竟测试越多,不可预见的bug就越少)。但是我想知道,对于要编写的测试用例的数量,是否有任何广泛认可的策略?

如果您正在尝试TDD,那么您不应该在没有失败的测试的情况下编写任何代码。因此,您将永远不会有一个类没有一个或多个测试。一条经常被引用的经验法则是,最终的测试源应该是主源的2.5倍。

我不建议严格映射每个类的一个测试。有些类本身可能没有太多值得测试的内容。某些类可能需要多个测试,因为您希望为不同的情况指定不同的设置。您应该使用Cobertura之类的代码覆盖工具,并尝试覆盖尽可能多的代码。此外,您还应该查看正在测试的代码,看看哪种不同的数据会破坏它,并尝试使用不同的样本数据组合对其进行测试(因此,100%的代码覆盖率当然不是测试的终点)。

如果您正在进行TDD和极限编程(我认为这有助于解释),您可以成对编程。第一个人为尚不存在的特性编写测试。该测试应证明该特性是100%功能性的,并能处理所有需要的情况。然后,第二个程序员编写代码,使测试完全通过。它必须重写,直到完全满足测试。通常,您为TDD维护一个测试套件,它可以不断地重新运行,检测任何故障并生成报告——尽管这对于个人用途来说是雄心勃勃的


在任何情况下,对于TDD来说,如果不先进行新的测试,就不可能存在新的特性-测试驱动开发。因此,如果你做得正确,默认情况下,你的测试是针对每个特性的。

在这方面没有严格的规则,只有指导原则。通常每个类有一个测试用例,但有不同的策略:

例如,您可以对相对较小且遵循的类使用“每类”方法。但是,如果您有一个巨大的*Manager类的遗留代码,那么可以使用“每个方法”,并且只为其中一个方法提供专用测试用例。我认为为测试选择命名策略至少和测试代码组织一样重要


使用该工具可以帮助您找到未经测试的代码点。它不如公制那么有用。拥有高代码覆盖率并不一定意味着你有好的测试。一天结束时,重要的是你有

尽管优于1:1的比率或超过100%的覆盖率是理想的,但总的来说,我倾向于遵守“可能破坏的测试”

这意味着只测试带有“工作部件”的代码。这不包括POJO、DTO、瘦包装器/适配器类以及仅为适应框架而存在的类,等等


另外,“只测试您控制的代码”。这通常意味着不为生成的代码(如从WSDL生成的Web服务客户端)编写显式测试(但将它们作为为自己的类编写的测试的一部分来涵盖仍然是有意义的)。

对于编写测试和之后的代码,我不像其他评论者那样严格。你应该这么做,但实际上没有多少人这么做。重要的是最好在编写代码之前或编写代码之后编写测试。但不是几天/几周/几个月/几年之后,因为你不会这么做,测试会很糟糕

我通常将应用程序分为几个部分:应用程序逻辑、业务逻辑、数据访问层、域对象和助手类。最重要的是完全测试业务逻辑和助手类。应用程序的其他部分不那么重要,但您可以测试某些部分。还要做一些集成测试


最重要的是不要想得太多。只要试着做一些小项目,你会看到自己

除此之外,测试诸如getter和setter之类的东西真的不需要。因此,并非所有东西都需要(尽管getter和setter将由代码的其他部分进行测试)。@getn_outchea这是否也有助于代码覆盖率?假设您的getter和setter是纯粹的getter和setter,它们应该被程序的其他部分使用,卡尔:我知道,我在一次演讲中听到过这一点。我不记得我是否以书面形式见过它。如果在任何地方,我都希望在上的某个地方找到它。虽然像getter和setter这样的普通方法可能不需要显式测试,但它们的创建仍然应该由测试驱动,没有测试覆盖的任何此类方法都应该被删除或覆盖。另请参阅