tags:

views:

2093

answers:

1

I am configuring JUnit in Ant so that unit tests will be run on each build. I would like the output of failing tests to be printed in the Ant console output whenever they are run. I don't need to see any output from succeeding tests.

Here is the relevant bit of my build.xml file:

<junit>
    <classpath>
        <pathelement path="${build}"/>
    </classpath>
    <formatter type="brief" usefile="false"/>
    <batchtest>
        <fileset dir="${src}" includes="my/tree/junit/"/>
    </batchtest>
</junit>

This produces almost what I want, failing tests are detailed in the Ant output, except that succeeding tests also write the following output:

    [junit] Testsuite: my.tree.junit.ExampleTest
    [junit] Tests run: 7, Failures: 0, Errors: 0, Time elapsed: 0.002 sec

I believe I have tried all the combinations listed in the JUnit task documentation, including:

  • printsummary attribute
  • showoutput attribute
  • formatter element with each kind of type

My use case is running ant from the command line. As I write more tests, I don't want the output from succeeding tests to be so large that output from failing tests scrolls off the screen. I just want ant to be quiet unless there's a failing test that needs my attention. How can I configure Ant/JUnit to do this?

I am using Ant version 1.6.4 and JUnit 4.6.

+5  A: 

One possibility would be to define your own xml formatter with the 'classname' attribute (and extending org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter, potentially doing nothing on endTest() or endTestsuite() methods).
That formatter would ignore info message and only display failure messages.


Note: this settings mention the possibility of only displaying failed tests:

<junit showoutput="true"
       fork="true"
       failureproperty="tests.failed"
       errorproperty="tests.failed">
    <batchtest todir="${test.results.dir}">
        <fileset dir="test">
            <include name="**/*Test.java"/>
        </fileset>
    </batchtest>
    <classpath path="${classes.dir}:${junit.jar}:${test.classes.dir}"/>
    <formatter usefile="false" type="brief"/>
    <!-- <formatter type="xml"/> If missing, only displays failed tests -->
</junit>

Did you test that ?


Yet another approch would be to define your ant Juint Test runner, supporting ant JUnitResultFormatter and displaying only stderr messages.

The EclipseTestRunner from eclipse is a good example.

VonC
Very nice answer!
furtelwart
Thanks, the example you showed is essentially the same as what I had posted in my question, so I think the difference might be something to do with running it in the Netbeans context. I'll try implementing a custom formatter but I had hoped to avoid having to do that.
Greg Hewgill
I implemented a custom formatter and was able to accomplish my original goal.
Greg Hewgill
@Greg: that's great. If the custom formatter is not too big, could you post it here (or at least the part which only prints error messages)?
VonC