我正在通过ant运行Jenkins上的Junit测试,我真的遇到了这个错误。
我的ant文件的相关部分:
<!-- Get the Junit test files -->
<target name="getTest">
<svn svnkit="false" javahl="false">
<export srcUrl="${svn.junit}" destPath="${junit.dir}" />
</svn>
</target>
<!-- Compile Junit Test Files -->
<target name="test-compile" depends="compileJava">
<javac srcdir="${junit.dir}" target="1.6" source="1.6" destdir="${test.classes}">
<classpath>
<path refid="test.classpath" />
<pathelement location="${test.classes}" />
</classpath>
</javac>
</target>
<!-- Run JUnit Tests -->
<target name="test" depends="test-compile">
<junit haltonfailure="no" failureproperty="failed">
<classpath>
<path refid="test.classpath" />
<pathelement location="${test.classes}" />
</classpath>
<formatter type="xml" />
<batchtest fork="yes" todir="${test.reports}">
<fileset dir="${junit.dir}">
<include name="**/*Test*.java" />
</fileset>
</batchtest>
</junit>
<fail message="TEST FAILER" if="failed" />
</target>
<path id="test.classpath">
<pathelement location="${basedir}/junit-4.11.jar" />
<pathelement location="${basedir}/ant-junit-1.8.4.jar" />
<pathelement location="${build.classes.dir}" />
<pathelement location="${build.lib.dir}" />
<pathelement location="${source.dir}" />
</path>
测试编译到test-classes文件夹中并使用控制台输出在测试中运行:
[junit] Test com.some.app.ProjectName.MyTestClass FAILED
当您在测试结果中查看测试时,它会显示堆栈跟踪
java.lang.ClassNotFoundException: com.some.app.ProjectName.MyTestClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
答案 0 :(得分:0)
junit documentation描述了batchtest操作,如下所示:
根据模式匹配定义一些测试。
batchtest 从任意数量的嵌套资源集合中收集包含的资源。然后,它为每个以 .java 或 .class 结尾的资源生成测试类名称。
因此,这暗示了“test-compile”目标的问题,因为缺少的是从以下文件集派生的类名:
<fileset dir="${junit.dir}">
<include name="**/*Test*.java" />
</fileset>
虽然ANT文件看起来不错,但您是否有可能错过Java源代码顶部的“包”声明?我被抓了一次....查看$ {test.classes}目录,仔细检查没有匹配的类文件。