在为Java代码构建一套单元测试时,是否有一个关于在何处放置与源代码相关的测试代码的约定?
例如,如果我有一个包含大量/java
源文件的目录.java
,最好将测试用例放在/java
本身或使用类似{{{ 1}}。
如果首选后者,那么当一个类的/java/test
/ private
成员在包外不可用时,如何测试代码的内部?
答案 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识别,您下面的文件将包含在模块中。
我认为该结构是代码和测试的推荐布局。