2009-10-08 37 views
58

当为Java代码构建一套单元测试时,是否存在与源代码相关的测试代码放置位置的约定?Java单元测试,目录布局

举例来说,如果我有一个目录/java包含了一堆.java源文件,是它更好地把测试用例/java本身或使用类似/java/test

如果后者是首选,那么当包的外部成员不可用时,如何测试代码的内部代码?

回答

56

你可以把测试在同一个包的原始类,即使源代码是它自己的根目录下:

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

可以src下声明一个类com.foo.MyClass及其测试com.foo.MyClassTesttest

至于访问私有成员,可以使用反射调用方法(通过Class.getDeclaredMethod.setAccessible改变其可访问),或者你可以使用类似TestNG的/ junit5把一些注解驱动测试的源代码本身(我个人认为这是一个坏主意)。

为什么不看看java.net上的一些项目,看他们是如何组织东西的,比如swinglabs(SVN仓库恐怕很慢)?

+0

'测试'也包含源代码...也是'src'来自Maven世界 –

9

大部分的时候是这样完成的:

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

所以,你让他们分开,你仍然可以测试包/保护功能,因为测试是在同一个包。

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

交付时,你只是包装.class由src产生的,而不是测试

+0

为什么不简单地使用'source'?为什么'src'有'resources'时...... –

+0

测试应该在src文件夹中。 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html –

79

我建议您按照Apache Software Foundation's standard directory structure,这将产生这样的:

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

这使得测试从源头分离出来,但在目录结构中的同一级别。如果你读通过Apache如何定义它们的结构,你会看到它有助于分区的其他问题出来为好,包括资源,配置文件,其他语言等

这种结构还允许单元测试,测试包和保护水平假设您将测试用例放置在与测试相同的包中。关于测试私人方法 - 我不会打扰。别的东西,无论是公众,包装,或保护的称呼和你应该能够得到充分的测试覆盖率测试这些东西。

顺便说一句,上面的链接是Maven的,Apache的标准构建工具。他们每个Java项目符合这个标准,以及我曾经遇到过一个内建Maven的每一个项目。

+5

+1即使你不使用maven,按照这种布局是一个好主意(一种基于行业最佳实践的事实标准)。 –

+6

这里提到Maven的唯一原因是因为它的网站是Apache标准目录布局的一个地方。你喜欢或不喜欢它与所讨论的目录结构是否是好的无关。也许你可以评论一个与你的观点相一致的答案,以表明为什么这个目录结构更好。 – SingleShot

+0

我不想遵循这个建议,因为你不能只是将“src”造型输出到jar/war。您必须明确排除测试包,并且会重新构建测试包下的整个包结构。 – guerda

5

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

所以,如果我有一个项目,“我的项目”,我也创建“我的项目测试”,所以我有以下目录结构:

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

这种方法可以确保测试代码的依赖性不污染生产代码。

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

2

这就是我们如何设置的,我们喜欢它。

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

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

+0

我会使用'output /'而不是'build /' –

0

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和您的文件被识别下面将包含到模块中。

我假设那个结构是代码和测试的推荐布局。