我应该把JUnit测试放在哪里?

55

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

  1. 我是否需要将测试代码放在与被测试类相同的包中,或者可以将测试代码组织到不同的包中?

    例如,如果我有有效性(validity)其他(other)测试,即使它们是为同一个类编写的,将它们分成不同的包中是否正确?

  2. 那么模拟和存根类呢?我应该将它们与仅包含测试的包分开,还是将其放在一起?

4个回答

71

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

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

显然,这个结构还有更多细节,但是它使我们能够将测试与主要代码分开构建,同时访问受保护的类等内容。关于不同类型的测试,这非常主观。当我们开始进行测试(不幸的是,在开发之后),我试图让事情保持相对独立。不幸的是,当我们达到500多个测试用例时,它很快变成了一场噩梦。此后我尝试做更多的合并,这导致了更少的代码维护量。正如我所说的,这非常主观。

至于仅用于测试的代码,我们将其保留在一个单独的com.foo.test 包中,该包位于 src/test/java 树中。


14
这里的情况类似,只是我们使用 "src/com/foo/..." 和 "test/com/foo/..."。 - Bob Cross
1
就我个人而言,我认为Bob的回答更好。即使JUnit测试确实是源代码。 - guerda
5
说实话,我之所以选择了src/main/java和src/test/java这两个文件夹,是因为我不想再进行Maven的其他配置。 - Paul Kuykendall

5
我也倾向于将我的测试放在同一个包中,但在不同的根目录下。这样可以让我测试包私有类或在测试包中测试其他内容时访问包私有类。它们被保存在一个单独的目录树中,以便从部署结果中排除它们(特别是为了确保测试代码不会意外地进入生产代码)。然而,最重要的是找到适合您情况的方法。
就每个生产类有多少个测试类而言,我看到的理论是您为每个设置结构编写一个测试类。在许多情况下,这与每个生产类编写一个测试类相同(或足够接近),但是我有时为给定的生产类编写更多的测试类(特别是相等性测试往往是分开的),偶尔为一组(相关的)生产类编写一个测试类(例如,用于测试策略模式)。
大多数情况下,我不太担心理论,而是根据需要重新制定测试,以使重复最少。

4
保持相同的包可以让你使用包私有可见性来编写仅供测试访问的代码。
关于使用单独的根目录,这是一个好的实践。对我们来说也有优势,因为我们使用IDEA,IDEA会识别生产代码不能引用测试代码。
在保持它们分开方面,每个生产类在单元级别只有一个测试类是非常强大的。当然,一些类在重构时作为生产的一部分被创建,没有任何测试类,这是可以接受的,但当你想知道哪个测试类测试某个类时,有一个约定说ClassNameTest是ClassName的测试非常有帮助。
TestNG比JUnit更适合这种范例。

3

测试类应该放在不同的包中,这样在打包发布时就容易将其与生产代码分开。我通常会在这些包中保留大量测试用例,包括各种模拟对象、配置和场景等。但是,在构建过程中,这些内容并不会被编译。在某些情况下,甚至可以将测试相关的内容放在不同的项目中,这要视具体情况而定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接