当我运行JUnit时,测试失败会导致非常大的堆栈跟踪,但实际上并没有提供太多信息。我希望能够只看到失败的断言语句,这样每次失败最多只需要2行或3行,而不是20行。
我没有使用ANT来调用JUnit,而是从非常大的批处理命令行运行它们。额外的输出只会使解析数据变得困难。
编辑:此测试适用于编程课程中的学生作业,因此会出现错误,并且有相当多的程序需要测试。
答案 0 :(得分:3)
鉴于这是一种相对罕见的情况(大批量从命令行运行JUnit,而不是使用IDE或像Ant这样的工具)如果事实证明不是一种方式,我不会感到惊讶在JUnit本身内解决它。
为什么不将结果写入文件,然后通过识别JUnit失败开始的小解析器运行,打印下几行,然后跳到下一行的开头?
答案 1 :(得分:2)
我会说你的JUnit测试一旦解决它们就会很好而且安静。留下“嘈杂”的堆栈痕迹作为激励消除它们并返回绿色条。
“......我没有使用ANT来调用JUnit ......” - 为什么不呢?什么是批量购买它们?如果您使用Ant,您不仅可以获得测试,还可以获得HTML报告任务。这将“安静”输出,很好地呈现它,而不会丢弃堆栈跟踪细节。
听起来您正在使用已提交的作业作为您编写的JUnit测试工具中的第三方JAR。好方法。应该是向上还是向下,红色或绿色。您现在是QA部门 - 堆栈跟踪是学生的责任。
你可以给他们测试课程并告诉他们在运行时让他们的东西通过。把责任放在它们所属的地方。
学生应该尽早了解单元测试的价值。我会为他们提供JUnit和Ant 并使它们提供运行JUnit测试作为传递赋值的先决条件。
这是一个示例Ant build.xml,您可以根据需要随意修改它。特别注意测试任务:
<?xml version="1.0" encoding="UTF-8"?>
<project name="spring-finance" basedir="." default="package">
<property name="version" value="1.6"/>
<property name="haltonfailure" value="no"/>
<property name="out" value="out"/>
<property name="production.src" value="src/main/java"/>
<property name="production.lib" value="src/main/webapp/WEB-INF/lib"/>
<property name="production.resources" value="src/main/resources"/>
<property name="production.classes" value="${out}/production/${ant.project.name}"/>
<property name="test.src" value="src/test/java"/>
<property name="test.lib" value="src/test/lib"/>
<property name="test.resources" value="src/test/resources"/>
<property name="test.classes" value="${out}/test/${ant.project.name}"/>
<property name="exploded" value="out/exploded/${ant.project.name}"/>
<property name="exploded.classes" value="${exploded}/WEB-INF/classes"/>
<property name="exploded.lib" value="${exploded}/WEB-INF/lib"/>
<property name="reports.out" value="${out}/reports"/>
<property name="junit.out" value="${reports.out}/junit"/>
<property name="web.src" value="src/main/webapp"/>
<property name="web.lib" value="${web.src}/WEB-INF/lib"/>
<property name="web.classes" value="${web.src}/WEB-INF/classes"/>
<path id="production.class.path">
<pathelement location="${production.classes}"/>
<pathelement location="${production.resources}"/>
<fileset dir="${production.lib}">
<include name="**/*.jar"/>
<exclude name="**/junit*.jar"/>
<exclude name="**/*test*.jar"/>
</fileset>
</path>
<path id="test.class.path">
<path refid="production.class.path"/>
<pathelement location="${test.classes}"/>
<pathelement location="${test.resources}"/>
<fileset dir="${test.lib}">
<include name="**/junit*.jar"/>
<include name="**/*test*.jar"/>
</fileset>
</path>
<available file="${out}" property="outputExists"/>
<target name="clean" description="remove all generated artifacts" if="outputExists">
<delete dir="${out}" includeEmptyDirs="true"/>
</target>
<target name="create" description="create the output directories" unless="outputExists">
<mkdir dir="${production.classes}"/>
<mkdir dir="${test.classes}"/>
<mkdir dir="${junit.out}"/>
<mkdir dir="${exploded.classes}"/>
<mkdir dir="${exploded.lib}"/>
</target>
<target name="compile" description="compile all .java source files" depends="create">
<!-- Debug output
<property name="production.class.path" refid="production.class.path"/>
<echo message="${production.class.path}"/>
-->
<javac srcdir="src" destdir="${out}/production/${ant.project.name}" debug="on" source="${version}">
<classpath refid="production.class.path"/>
<include name="**/*.java"/>
<exclude name="**/*Test.java"/>
</javac>
<javac srcdir="${test.src}" destdir="${out}/test/${ant.project.name}" debug="on" source="${version}">
<classpath refid="test.class.path"/>
<include name="**/*Test.java"/>
</javac>
</target>
<target name="test" description="run all unit tests" depends="compile">
<!-- Debug output
<property name="test.class.path" refid="test.class.path"/>
<echo message="${test.class.path}"/>
-->
<junit printsummary="yes" haltonfailure="${haltonfailure}">
<classpath refid="test.class.path"/>
<formatter type="xml"/>
<batchtest fork="yes" todir="${junit.out}">
<fileset dir="${test.src}">
<include name="**/*Test.java"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${junit.out}">
<fileset dir="${junit.out}">
<include name="TEST-*.xml"/>
</fileset>
<report todir="${junit.out}" format="frames"/>
</junitreport>
</target>
<target name="exploded" description="create exploded deployment" depends="test">
<copy todir="${exploded}">
<fileset dir="${web.src}"/>
</copy>
<copy todir="${exploded}/WEB-INF">
<fileset dir="${web.src}/WEB-INF"/>
</copy>
<copy todir="${exploded.classes}">
<fileset dir="${production.classes}"/>
</copy>
<copy todir="${exploded.lib}">
<fileset dir="${production.lib}"/>
</copy>
</target>
<target name="jar" description="create jar file" depends="test">
<jar destfile="${out}/${ant.project.name}.jar" basedir="${production.classes}" includes="**/*.class"/>
</target>
<target name="war" description="create war file" depends="exploded">
<war basedir="${exploded}" webxml="${exploded}/WEB-INF/web.xml" destfile="${out}/${ant.project.name}.war"/>
</target>
<target name="package" description="create package for deployment" depends="test">
<antcall target="war"/>
</target>
</project>
答案 2 :(得分:1)
当你从命令行运行测试时,这个forum post似乎正在描述一种过滤JUnit报告内容的方法。该方法似乎是创建一个替代入口点类(即“主”方法),它使用备用RunListener来记录错误的方式。
警告:这将涉及一些Java编码,浏览JUnit javadocs,以及(可能)查看JUnit源代码以获取想法。
答案 3 :(得分:0)
失败的JUnit测试用例应该是嘈杂的。我喜欢他们对我尖叫;)
如果您的单元测试用例惹恼并且不断中断,尽管一切都很好(误报),而是考虑更改测试用例。而是包装JUnit测试运行器而不是自己运行测试用例。