Javaunit testing,目录布局
当为Java代码构build一套unit testing时,是否有一个关于源代码放置testing代码的约定?
例如,如果我有一个包含一堆.java
源文件的目录/java
,将testing用例放在/java
本身还是使用类似/java/test
东西更好。
如果后者是首选的,那么当一个类的private
/ protected
成员不在包之外时,如何testing代码的内部?
即使源代码位于其自己的目录根目录下,也可以将testing放在与原始类相同的包中:
PROJECT_ROOT +--- src/ +----test/
你可以在src
下声明一个类com.foo.MyClass
,并且在test下test
com.foo.MyClassTest
。
至于访问私有成员,你可以使用reflection来调用方法(通过Class.getDeclaredMethod.setAccessible
来改变它的可访问性),或者你可以使用像testng / junit5这样的东西来对源代码本身进行一些注解驱动的testing个人认为这是一个坏主意)。
为什么不检查java.net
上的一些项目来查看他们是如何组织的东西,例如swinglabs (SVN仓库很恐怖 )?
我build议遵循Apache软件基金会的标准目录结构 ,这产生了这样的结果:
module/ src/ main/ java/ test/ java/
这样可以使testing与源代码分离,但是在目录结构中处于同一级别。 如果您阅读了Apache定义其结构的方式,您会发现它也可以帮助划分其他问题,包括资源,configuration文件和其他语言等。
假设您将testing用例放置在与testing相同的包中,此结构还允许unit testingtesting被测单元的包和受保护级别的方法。 关于testing私人方法 – 我不会打扰。 其他的东西,无论是公共的,软件包还是保护的,都会打电话给他们,你应该能够得到全面的testing覆盖testing这些东西。
顺便说一下,上面的链接是Apache的标准构build工具Maven。 每个Java项目都符合这个标准,以及我用Maven构build的每一个项目。
大部分时间都是这样完成的:
<SOME_DIR>/project/src/com/foo/Application.java <SOME_DIR>/project/test/com/foo/ApplicationTest.java
所以,你把它们分开,你仍然可以testing包/保护function,因为testing是在同一个包中。
你不能testing私人东西,除非它是在课堂上自我声明的。
交付时,您只需打包由src生成的.class
,而不是testing
实际上,把生产和testing项目分成两个独立的实体是很有意义的,但是在两个项目中都有相同的包装结构。
所以如果我有一个项目“我的项目”,我也创build“我的项目testing”,所以我有以下的目录结构:
my-project +--- src/com/foo my-project-test +---test/com/foo
这种方法可以确保testing代码依赖性不会污染生产代码。
我个人认为,应该testing一揽子私人和受保护的方法以及公共方法。 因此,我希望我的testing类与生产类在同一个包中。
这是我们如何build立,我们喜欢它。
build/ src/ test/build/ test/src/
所有testing代码都编译到自己的构build目录中。 这是因为我们不希望产品错误地包含testing类。
在Android Studio中创buildJava库模块时,将在以下位置创build一个默认类:
[module] + src/main/java/[com/foo/bar]
如果你查看[module].iml
文件,你会发现这个path以及你可以使用的testingpath。 以下是一个总结:
<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>
你可以做什么特别是创build一个testing目录有以下结构:
[module] + src/main/java/[com/foo/bar] + src/test/java/[com/foo/bar]
上述结构将被Android Studio识别,您的文件将包含在模块中。
我假设这个结构是代码和testing的推荐布局。