Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Longest running unit tests?

How can we find the junit tests in our suite that take the longest amount of time to run? The default output of the junitreport ant task is helpful, but our suite has thousands of tests organized into many smaller suites, so it gets tedious, and the worst offenders are always changing.

We use luntbuild but ideally it would be something we could just run from ant.

like image 468
Craig P. Motlin Avatar asked Nov 10 '08 14:11

Craig P. Motlin


People also ask

How long is too long for a unit test?

Still, it seems as though a 10 second short-term attention span is more or less hard-wired into the human brain. Thus, a unit test suite used for TDD should run in less than 10 seconds. If it's slower, you'll be less productive because you'll constantly lose focus.

How long should unit tests take to run?

Some developers will be happy to run their extensive test suite in three minutes, while others want to go the more radical route and keep it under 60 seconds.

How often should unit tests be run?

Run all your unit tests as often as possible, ideally every time the code is changed. Make sure all your unit tests always run at 100%. Frequent testing gives you confidence that your changes didn't break anything and generally lowers the stress of programming in the dark.


1 Answers

JUnitReport works on the xml files produced by the JUnit task. You could write a task that would read the test durations out of the same xml files (TEST-*.xml). But you can also take a shortcut and just read the summary file created by JUnitReport (TESTS-TestSuites.xml) which has all the information in the single file.

A quick way to do this is to use a bit of xsl to just show the slowest tests:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:text>    </xsl:text>
    <xsl:for-each select="testsuites/testsuite">
    <xsl:sort select="@time" data-type="number" order="descending" />
      <xsl:value-of select="@name"/> : <xsl:value-of select="@time"/>
      <xsl:text>
  </xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

To run from Ant you do this:

<target name="show.slow.tests">
    <xslt in="target/tests-results/TESTS-TestSuites.xml" out="target/slow.txt" style="slow.xsl"/>
</target>

Then you can just look at the first X lines to find the X slowest tests:

jfredrick$ head target/slow.txt

    ForcingBuildShouldNotLockProjectInQueuedStateTest : 11.581
    CruiseControlControllerTest : 7.335
    AntBuilderTest : 6.512
    Maven2BuilderTest : 4.412
    CompositeBuilderTest : 2.222
    ModificationSetTest : 2.05
    NantBuilderTest : 2.04
    CruiseControlConfigTest : 1.747
    ProjectTest : 1.743
    BuildLoopMonitorTest : 0.913
like image 158
3 revs, 2 users 84% Avatar answered Oct 14 '22 18:10

3 revs, 2 users 84%