当为Java代码构建一套单元测试时,是否存在与源代码相关的测试代码放置位置的约定?Java单元测试,目录布局
举例来说,如果我有一个目录/java
包含了一堆.java
源文件,是它更好地把测试用例/java
本身或使用类似/java/test
。
如果后者是首选,那么当包的外部成员不可用时,如何测试代码的内部代码?
当为Java代码构建一套单元测试时,是否存在与源代码相关的测试代码放置位置的约定?Java单元测试,目录布局
举例来说,如果我有一个目录/java
包含了一堆.java
源文件,是它更好地把测试用例/java
本身或使用类似/java/test
。
如果后者是首选,那么当包的外部成员不可用时,如何测试代码的内部代码?
你可以把测试在同一个包的原始类,即使源代码是它自己的根目录下:
PROJECT_ROOT
+--- src/
+----test/
可以src
下声明一个类com.foo.MyClass
及其测试com.foo.MyClassTest
test
。
至于访问私有成员,可以使用反射调用方法(通过Class.getDeclaredMethod.setAccessible
改变其可访问),或者你可以使用类似TestNG的/ junit5把一些注解驱动测试的源代码本身(我个人认为这是一个坏主意)。
为什么不看看java.net
上的一些项目,看他们是如何组织东西的,比如swinglabs(SVN仓库恐怕很慢)?
大部分的时候是这样完成的:
<SOME_DIR>/project/src/com/foo/Application.java
<SOME_DIR>/project/test/com/foo/ApplicationTest.java
所以,你让他们分开,你仍然可以测试包/保护功能,因为测试是在同一个包。
你不能测试私人东西,除非它是在它自己的类中声明的。
交付时,你只是包装.class
由src产生的,而不是测试
为什么不简单地使用'source'?为什么'src'有'resources'时...... –
测试应该在src文件夹中。 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html –
我建议您按照Apache Software Foundation's standard directory structure,这将产生这样的:
module/
src/
main/
java/
test/
java/
这使得测试从源头分离出来,但在目录结构中的同一级别。如果你读通过Apache如何定义它们的结构,你会看到它有助于分区的其他问题出来为好,包括资源,配置文件,其他语言等
这种结构还允许单元测试,测试包和保护水平假设您将测试用例放置在与测试相同的包中。关于测试私人方法 - 我不会打扰。别的东西,无论是公众,包装,或保护的称呼和你应该能够得到充分的测试覆盖率测试这些东西。
顺便说一句,上面的链接是Maven的,Apache的标准构建工具。他们每个Java项目符合这个标准,以及我曾经遇到过一个内建Maven的每一个项目。
+1即使你不使用maven,按照这种布局是一个好主意(一种基于行业最佳实践的事实标准)。 –
这里提到Maven的唯一原因是因为它的网站是Apache标准目录布局的一个地方。你喜欢或不喜欢它与所讨论的目录结构是否是好的无关。也许你可以评论一个与你的观点相一致的答案,以表明为什么这个目录结构更好。 – SingleShot
我不想遵循这个建议,因为你不能只是将“src”造型输出到jar/war。您必须明确排除测试包,并且会重新构建测试包下的整个包结构。 – guerda
实际上,将生产和测试项目分为两个独立的实体很有意义,但在两个项目中都具有相同的包结构。
所以,如果我有一个项目,“我的项目”,我也创建“我的项目测试”,所以我有以下目录结构:
my-project
+--- src/com/foo
my-project-test
+---test/com/foo
这种方法可以确保测试代码的依赖性不污染生产代码。
我个人认为,应该测试包私有和受保护方法以及公共方法。因此,我希望我的测试类与生产类在同一个包中。
这就是我们如何设置的,我们喜欢它。
build/
src/
test/build/
test/src/
所有测试代码都编译到它自己的构建目录中。这是因为我们不希望产品错误地包含测试类。
我会使用'output /'而不是'build /' –
当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和您的文件被识别下面将包含到模块中。
我假设那个结构是代码和测试的推荐布局。
'测试'也包含源代码...也是'src'来自Maven世界 –