Java单元测试,目录布局

时间:2009-10-08 20:43:34

标签: java unit-testing

在为Java代码构建一套单元测试时,是否有一个关于在何处放置与源代码相关的测试代码的约定?

例如,如果我有一个包含大量/java源文件的目录.java,最好将测试用例放在/java本身或使用类似{{{ 1}}。

如果首选后者,那么当一个类的/java/test / private成员在包外不可用时,如何测试代码的内部?

6 个答案:

答案 0 :(得分:93)

我建议关注Apache Software Foundation's standard directory structure,结果如下:

module/
  src/
    main/
      java/
    test/
      java/

这使测试与源分开,但在目录结构中处于同一级别。如果你仔细阅读Apache如何定义它们的结构,你会发现它也有助于分解其他问题,包括资源,配置文件,其他语言等。

此结构还允许单元测试测试被测单元的封装和受保护级别方法,假设您将测试用例放在与测试单元相同的包中。关于测试私人方法 - 我不会打扰。其他东西,无论是公共的,打包的还是受保护的,都可以调用它们,你应该可以获得完整的测试覆盖率测试。

顺便说一下,上面的链接是Apache的标准构建工具Maven。他们所拥有的每个Java项目都符合这个标准,以及我遇到的每个使用Maven构建的项目。

答案 1 :(得分:66)

您可以将测试放在与原始类相同的包中,即使源代码位于其自己的目录根目录下:

PROJECT_ROOT
    +--- src/
    +----test/

您可以在com.foo.MyClass下声明一个类src,在com.foo.MyClassTest下声明其test

对于访问私有成员,您可以使用反射来调用方法(通过Class.getDeclaredMethod.setAccessible更改其可访问性),或者您可以使用类似于testng / junit5的内容来放置一些注释源代码本身的驱动测试(我个人认为这是一个坏主意)。

为什么不查看java.net上的一些项目,看看他们是如何组织的,例如swinglabs(我担心SVN存储库很慢)?

答案 2 :(得分:8)

大部分时间都是这样完成的:

<SOME_DIR>/project/src/com/foo/Application.java
<SOME_DIR>/project/test/com/foo/ApplicationTest.java

因此,您将它们分开,您仍然可以测试包/受保护的功能,因为测试位于同一个包中。

你不能测试私有东西,除非它在类中自己声明。

交付后,您只需打包由src生成的.class,而不是测试

答案 3 :(得分:5)

实际上,将生产和测试项目分成两个独立的实体是很有意义的,但在两个项目中都有相同的包结构。

所以,如果我有一个'my-project'项目,我也会创建'my-project-test',所以我有以下目录结构:

my-project
  +--- src/com/foo
my-project-test
  +---test/com/foo

此方法可确保测试代码依赖性不会污染生产代码。

在我个人看来,应该测试包私有和受保护的方法以及公共方法。因此,我希望我的测试类与生产类在同一个包中。

答案 4 :(得分:2)

这就是我们设置的方式,我们喜欢它。

build/
src/
test/build/
test/src/

所有测试代码都编译到自己的构建目录中。这是因为我们不希望生产错误地包含测试类。

答案 5 :(得分:1)

Android Studio中创建 Java库模块时,它会在以下位置创建默认类:

[module]
   + src/main/java/[com/foo/bar]

如果您查看[module].iml文件,您将找到可以使用的路径以及测试路径。以下是摘要:

<module>
  <component>
    <content>
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
    </content>
  </component>
</module>

您可以做的特别是为测试创建一个具有以下结构的目录:

[module]
   + src/main/java/[com/foo/bar]
   + src/test/java/[com/foo/bar]

上述结构将被Android Studio识别,您下面的文件将包含在模块中。

我认为该结构是代码和测试的推荐布局。