我应该在哪里进行JUnit测试?

时间:2009-05-01 15:15:49

标签: java unit-testing junit

我有两个关于组织单元测试的问题。

  1. 我是否必须将测试放在与测试类相同的包中,还是可以在不同的包中组织测试?

    例如,如果我有有效性其他测试,将它们分成不同的包是否正确,即使它们属于同一个类?

    < / LI>
  2. 模拟和存根类怎么样?我可以将它们与仅包含测试的包分开,或者将它们放在一起吗?

4 个答案:

答案 0 :(得分:61)

我们执行JUnit测试用例的方法是将它们放在同一个包中,但是放在不同的根目录中。由于我们使用Maven,我们只使用标准位置,使结构类似于以下内容。

src/main/java/com/foo/Bar.java
src/test/java/com/foo/BarTest.java

显然,结构还有更多,但这可以让我们与主线代码分开构建测试,但仍然可以访问受保护的类等。对于不同类型的测试,这是非常主观的。当我们开始我们的测试工作(不幸的是在开发之后开始)时,我试图让事情相当孤立。不幸的是,当我们达到500+测试用例点时,它很快就变成了一场噩梦。我已经尝试过更多的整合。这导致维护的代码量减少。正如我所说,这是非常主观的。

就仅测试代码而言,我们将其保存在仅位于com.foo.test树中的单独src/test/java包中。

答案 1 :(得分:5)

我也倾向于将我的测试放在同一个包中但在不同的根目录下。这允许我在测试包中的其他内容时测试包私有类或访问包装私有类。它们保存在单独的目录树中,以允许将它们从已部署的结果中排除(特别是为了确保测试代码不会意外地进入生产代码)。然而,最重要的是适用于您的情况。

就每个生产类的测试类数而言,我所看到的理论是每个夹具编写一个测试类,即每个安装结构。在许多情况下,每个生产类与一个测试类相同(或足够接近),但我有时为一个生产类编写了更多的测试类(特别是相等测试往往是分开的),偶尔也会有一个测试类对于一组(相关的)生产类(例如,用于测试策略模式)。

大多数情况下,我并不太担心这个理论,而是根据需要重新进行测试,以便将重复保持在最低限度。

答案 2 :(得分:3)

测试类应该在不同的包中,当您将其打包发布时,更容易将它们与生产代码分开。我通常会在这些软件包,各种模拟,配置,场景中保留大量测试漏洞。但是当你构建时 - 它不会得到它。在某些情况下,将测试内容保存在不同的项目中是个好主意。取决于。

答案 3 :(得分:3)

将它保持为相同的包允许您对仅通过测试访问的代码使用包私有可见性。

关于使用单独的根目录,这是一个很好的做法。它对我们也有好处,因为我们使用IDEA,IDEA认识到生产代码不能引用测试代码。

就保持它们分开而言,在单位级别的每个生产类中拥有一个且仅有一个测试类是非常强大的。当然,有些类作为重构的一部分在生产中创建,根本没有测试类,这很好,但是当你想知道什么测试测试某个类时,有一个名为ClassNameTest的约定是ClassName的测试非常有帮助。

但是,对于这种范式,TestNG比JUnit更友好。