我开始了一个项目,第一次使用JUnit。
放置测试用例的最佳实践是什么?
每个“真实”类都有1个测试类。
每个软件包甚至整个项目都有1个测试类。
没有测试类的“真实”类中的测试方法。
据我所知,我可以从技术上每三种方式进行操作,但是我对此没有经验,因此我希望从一开始就寻求一些指导。
编辑
我正在谈论代码单元测试。我也在使用Maven,但我认为这对我的问题并不重要。
答案 0 :(得分:3)
每个“真实”课程都有1个测试课程。
我通常采用这种模式。当然,对接口的测试没有多大意义,并且有时仅具有getter和setter方法的小型“实体”类(即无逻辑)不需要相应的测试类。
也就是说,即使在很小的类上,我也对在单元测试中找到的实用程序感到惊讶。例如,即使某些仅具有get / set方法的实体类(通过DAO方法存储在数据库中)也应进行测试,以防某些数据库连接不正确。您永远都不知道何时使用的get / set方法不匹配,或者toString()
,非对称hashcode()
或equals()
还是其他问题。
“单元”测试的全部要点是(IMHO),以隔离地测试代码的最小单元-这就是该类。因此,当我有一个ContainerUtil
类时,我会在测试目录中寻找相应的ContainerUtilTest
类。我经常运行覆盖率测试,并且期望所有类的几乎所有逻辑部分都将被覆盖。
每个软件包甚至整个项目都有1个测试类。
我可能也有这个 ,但后来我认为它们是“集成”测试。测试在类之间或项目的各个部分之间桥接,以确保您的项目可以整体运行。
但是这些将是单元测试中的 。
没有测试类的“真实”类中的测试方法。
是的,不。真是个坏主意。您根本不希望生产代码包含测试代码。它会降低类的可读性,增加在尝试测试时破坏某些内容的更改,等等。只需说不。
我也使测试课程远离我的资源。我通常使用Maven,因此我的源代码位于src/main/java
中,而测试则位于src/test/java
中。您不希望测试最终出现在jar或war文件中,它们可能会使其他人感到困惑。
答案 1 :(得分:1)
这实际上取决于您的项目的大小,但是以我的经验,最好的方法是针对每个“大”功能(这可能不适用于单元测试)使用一个测试类,或者在这种情况下,针对每个“实际”功能。 ”类。
关于其他2:
每个包甚至整个项目都有1个测试类。
这可能会变得又大又杂乱,不建议您在同一测试类中混合不同的内容,就像您不会在同一文件中混合类一样
没有测试类的“真实”类中的测试方法。
我也不建议您这样做,因为您会失去对测试的位置以及实现测试与缺失的东西的了解。另外,您的代码可能还需要访问其他类,因此这又可能变得一团糟。
答案 2 :(得分:1)
到目前为止,对于单元测试,我为每个测试类都使用了一个测试类。对我来说,这似乎是最不混乱的命令。我将单元测试放在src / test / java下,与src / main / java中的测试类放在同一包树中。集成测试是不同的,并且每个都有自己的文件。
一个测试类具有不同的缺点。源代码将变得不可读。您将在@Before和@BeforeEach方法中做很多不必要的工作。
而且我不打算将测试放入已测试的班级。大量进口,“真实”和测试方法之间有何区别?而且由于其他方法,源代码将变得不可读。
答案 3 :(得分:1)
我建议您尝试第一种方法。这非常有用,因为您可以使用Sonar某种工具来跟踪单元测试的覆盖率。
此外,我强烈建议您使用TDD来开发代码:首先,编写失败的测试代码,然后编写代码以使测试通过,然后进行重构。
允许我提出两种阅读来源,以帮助您:
这些与我用来开始构建测试和使用TDD的阅读资源相同。
我不建议您使用其他方法,因为您不需要将测试代码运送到生产环境中,并且使用单个测试类会导致被称为“大类”的代码异味。