我们已经迁移到 JUnit 4 和 ant 1.7
测试在 Eclipse 中运行良好,但在使用 ant 运行测试时会忽略注释。
根据 Ant junit 任务文档:
它也适用于 JUnit 4.0,包括仅使用注释而不使用 JUnit4TestAdapter 的“纯”JUnit 4 测试。
但是文档没有详细说明它应该如何配置。
junit任务是否需要任何特殊设置?我错过了什么吗?我们有扩展 TestCase(即 3.8 风格)的测试和“纯”Junit 4 测试,这可能是问题吗?
我在 Ant 中使用纯 JUnit4 测试。
这是我的构建文件中有趣的部分:
<junit printsummary="yes" haltonfailure="yes">
<formatter type="xml"/>
<classpath refid="path.test"/>
<batchtest fork="yes" todir="${dir.report.unittests.xml}">
<fileset dir="src">
<include name="**/*Test*.java"/>
</fileset>
</batchtest>
</junit>
确保您在 Ant 的 lib 目录中拥有最新版本的 junit.jar 文件。据我所知,所需版本随 ant 1.7 或更高版本一起提供...
Ant 默认附带一个 JUnit 3 版本。JUnit 3 不支持测试注释。
要使用 junit 任务中的 JUnit 4 注释,请确保在 junit 任务的嵌套类路径元素中提供 JUnit 4 jar 的位置(请参阅ant FAQ 中的此条目)。
<junit showoutput="yes" fork="true">
<classpath>
<!-- The location of the JUnit version that you want to use -->
<pathelement location="lib/junit-4.9b1.jar"/>
</classpath>
<formatter type="plain" usefile="false" />
<batchtest>
<fileset dir="${tests.dir}"/>
</batchtest>
</junit>
这是覆盖 ANT_HOME/lib 中的 ant-junit.jar 的更好解决方案,因为这意味着您可以将 JUnit jar 与代码一起保存在源代码控制中,从而直接升级到更高版本。
请注意,虽然我没有在上面的文件集中指定任何包含模式,但这确实意味着 junit 任务将尝试针对该目录结构中的所有类运行 JUnit,这可能会导致包含许多不包含的类任何测试取决于您如何构建源文件。
您最终只能使用 ant 1.9.3+ 中添加的skipNonTests参数来查找和执行测试!
这是上面接受的答案的代码片段(除了新的skipNonTests参数和去掉文件名要求中的“测试”):
<junit printsummary="yes" haltonfailure="yes">
<formatter type="xml"/>
<classpath refid="path.test"/>
<batchtest skipNonTests="true" fork="yes" todir="${dir.report.unittests.xml}">
<fileset dir="src">
<include name="**/*.java"/>
</fileset>
</batchtest>
</junit>
这发生在我身上,这是因为我既使用注释又扩展了 TestCase。
public class TestXXX extends TestCase {
@Test
public void testSimpleValidCase() {
// this was running
}
@Test
public void simpleValidCase() {
// this wasn't running
}
}
当您扩展 TestCase 时,您将采用 JUnit3 样式,因此忽略 JUnit4 注释。
解决方案是停止扩展 TestCase。
验证您的类路径定义...这解决了我的问题。
<path id="classpath" description="Classpath do Projeto">
<fileset dir="${LIB}">
<include name="**/*.jar" />
<exclude name="**/.SVN/*.*"/>
</fileset>
</path>
这是我的通用 ant 脚本的相关部分...不确定这是否对您有帮助..
<junit fork="true"
forkmode="once"
haltonfailure="false"
haltonerror="false"
failureproperty="tests.failures"
errorproperty="tests.errors"
includeantruntime="true"
showoutput="true"
printsummary="true">
<classpath>
<path refid="path-id.test.classpath.run"/>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes"
todir="${dir.build.testresults}">
<fileset dir="${dir.src.tests}">
<include name="**/*Test.java"/>
</fileset>
</batchtest>
</junit>
将此注释应用于其他类 org.junit.Ignore
我还尝试在没有 JUnit4TestAdapter 的情况下使用 JUnit 4.0 进行测试,即没有方法
public static junit.framework.Test suite() { return new JUnit4TestAdapter(SomeTestClass.class); }
我使用蚂蚁 1.9.4。运行 ant test verbose (ant -v) 显示
[junit] 在同一个 VM 中运行多个测试
[junit] 隐式添加 /usr/share/java/junit.jar:/usr/sharejava/ant-launcher.jar:/usr/share/java/ant.jar:/usr /share/java/ant/ant-junit.jar 到 CLASSPATH
啊哈,但仍然有一些 ant-junit-task。下载此文件还显示了未隐式添加的 /usr/share/java/ant/ant-junit4.jar。我只是明确地添加了它:
<junit printsummary="yes"
fork="yes"
forkmode="once"
maxmemory="1023m"
showoutput="no">
...
<classpath>
<pathelement path="...:${junitJar}:${hamcrestJar}:/usr/share/java/ant/ant-junit4.jar" />
</classpath>
...
</junit>
它奏效了。没有:没有。我知道这个解决方案一点也不漂亮......
我最终做的是在任务使用的我的定义之一中添加一个 Ant>。等等。