情况如下:
我有一个java应用程序(netbeans项目),它使用了几个java库(每个库都是一个netbeans项目)。我有一个自动构建脚本,它使用ant构建应用程序,而不使用netbeans IDE。构建应用程序的命令是
ant jar
这很好,它递归地为所有依赖库构建jar,最后构建应用程序jar。
现在,我想在自动构建中运行所有的单元测试。默认的ant目标取决于目标jar
、test
和javadoc
,因此我认为可以简单地调用
ant
作为构建命令。和以前一样,所有的jar都是为依赖库构建的,但是只执行应用程序项目的单元测试(顺便说一句,javadoc也是如此)。
那么,如何让ant递归地为每个依赖库项目运行单元测试呢?
使用的版本有:netbeans 8、junit 4。
我发现的唯一解决方案是在每个库和应用程序项目的ant使用的build.xml
中添加依赖项:
<target name="-pre-jar" depends="test" />
但是这意味着要对每个构建的jar文件执行所有测试。而且由于netbeans也使用这些build.xml
文件,每个简单的构建都会导致执行所有的单元测试。
经过一些测试,我想我已经找到了一个有效的解决方案。
我必须将以下代码添加到应该运行单元测试的每个netbeans项目的build.xml
中(供参考:build.xml
是由netbeans提供的,用于对构建过程进行个人更改)。
<target name="-pre-jar" depends="test-on-release" />
<target name="test-on-release" if="release.runtests">
<antcall target="test" />
</target>
然后,如果我在命令行上运行ant,我必须定义属性release.runtests
以启用单元测试的执行:
ant -Drelease.runtests= jar
如果我从调用中删除属性的定义,则不会执行目标发布测试,因此不会运行测试。当我使用netbeans IDE来构建项目时,也会发生同样的情况。
也就是说,它是一个解决方案,而不是解决方案,至少不是我所希望的解决方案。如果有一种方法可以递归地运行测试目标,而不必编辑所有这些build.xml
文件,那将会方便得多。也许这是不可能与netbeans生成的构建文件给出的约束。