SDK code coverage with JaCoCo
>> Monday, March 14, 2011
Today, I had to pleasure of closing bug 241254 which has been open for over two years. It was a request to run a code coverage tool against the SDK during the build.
We used JaCoCo which is an EPL licensed code coverage library brought to you by the same team that created EclEmma. Why did we chose JaCoCo?
- Help from JaCoCo committers. At EclipseCon 2010, Marc Hoffman (JaCoCo committer) indicated to Olivier Thomann that he was interested in helping us to implement JaCoCo in our build.
- Performance. Other code coverage tools made the JUnit tests take significantly longer. Our tests take long enough to finish as it is! Olivier tested JaCoCo and found that it only took the JDT core tests about 2% longer to complete with JaCoCo enabled. Our 68,000 JUnit tests take about seven hours to run in parallel on three platforms. The JDT Core tests comprise 37,000 of these tests, thus we estimated the impact of running JaCoCo during the build would only increase the test run by about eight minutes.
- Classes are instrumented on the fly and and remain untouched after the code coverage data is generated. Other code coverage tools require you to instrument the classes for code coverage. Given the huge code base of the SDK, this didn't seem like a feasible alternative.
- JaCoCo reports look awesome.
How did we implement JaCoCo in the build?
- Olivier tested an earlier version of JaCoCo and worked with the JaCoCo committers to address some issues. Once these issues were resolved, we opened IPZilla bugs to consumed JaCoCo as part of the Indigo release.
- The Eclipse SDK JUnit tests are run with the assistance of a project called org.eclipse.test. An Ant script called libary.xml is used to invoke the test suites for each test bundle. We added the JaCoCo agent and Ant jars to a new library directory of this project.These jars are then added to the extraVMargs property when the tests are run. The libary.xml also specifies the output directory of the coverage data (*.exec files).
- When the tests are run, corresponding exec files are created for each test bundle.
- We modified the test.xml that is used to run all the tests suites to generate a code coverage report upon completion of the JUnit tests. All the *.exec files are merged into a single file. A coverage report for each bundle in the SDK is run. (excluding Orbit and doc bundles as well as fragments). The Ant for the report generation looks like this:
One problem that we encountered was that that JaCoCo report task was running out of heap space when the source files were passed to it as as zipfileset instead of a fileset. This problem occurred especially when attempting to generate source reports for large bundles such as jdt.core. We overcame this problem by unzipping the source bundles into a temporary location and passing the fileset.
In addition to code coverage percentages, the report generates html of the source files that highlights the code coverage within the code itself. For example:
All this information consumes about 1GB per build. (Sorry Denis and Matt). Thus I have only enabled it for our weekly integration builds, and the data will not be sent to the mirrors.
The code coverage reports for 3.7M6 are now available. Check out your favourite Eclipse SDK bundle!
References
JaCoCo project
JaCoCo mission and design goals
JaCoco Ant tasks
Bug 241254 - run code coverage tool during build
Marc Hoffmans's JaCoCo talk at Eclipse Summit Europe 2010 Read more...