2010-01-31 41 views
2

当我运行JUnit测试失败时会导致非常大的堆栈跟踪,而这些跟踪并不能提供很多信息。我希望能够看到失败的assert语句,以便每个故障最多占用2或3行,而不是20个。如何让JUnit安静?

我不使用ANT来调用JUnit,而是从一个非常大批量的命令行。额外的输出仅仅使得解析数据变得困难。

编辑:此测试是针对编程课程中的学生作业,所以会出现错误,并且有相当多的程序需要测试。

回答

3

鉴于这是一个比较少见的情况(从大批量的命令行运行JUnit,而不是使用IDE或像Ant这样的工具),如果结果不是一种方式,我不会感到惊讶在JUnit本身内部进行工作。

为什么不把结果写入文件,然后通过一个小的解析器运行它,该解析器可以识别JUnit失败的开始,打印接下来的几行,然后跳到下一个的开始?

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> 
+0

虽然这样会很好,但是测试的代码实际上是由学生提交的任务,所以它会失败。我们不使用ANT的唯一原因是因为我们还没有投入时间来改变它。尽管可能需要进行一些调查。 – 2010-02-01 00:30:07

1

forum post似乎描述的方式来过滤什么是JUnit的报道,当你运行命令行测试。该方法似乎是创建一个替代入口点类(即“主要”方法),该类使用另一个RunListener来记录错误的方式。

警告:这将涉及到一些Java编码,通过JUnit javadocs进行拖网,以及(可能)查看JUnit源代码的想法。

0

失败的JUnit测试用例应该是嘈杂的。我喜欢他们向我尖叫;)

如果你的单元测试用例不断地惹怒和破坏,虽然一切都很好(误报),而是想到改变测试用例。而是包装JUnit测试运行器,而不是自行运行测试用例。