Download from the project page
This small utility is a shared library which when loaded into a Java VM (1.4+) which supports JVMDI will record all the lines of code executed. This is a relatively coarse coverage method, but good enough for a lot of purposes.
It is intended to be used during the test cycle to identify methods which have not been adequately tested.
There is a mailing list for interested developers at jvmdicover-devs@lists.sourceforge.net
Compilation is simple
Note: You need Berkerly 'DB' 3 or 4 available.
[jcrisp@dhcppc1 profile]$ sh profile.c
[jcrisp@dhcppc1 profile]$ sh report.c
report.c: In function `main':
report.c:49: warning: implicit declaration of function `exit'
[jcrisp@dhcppc1 profile]$ export LD_LIBRARY_PATH=.:./hashtable
[jcrisp@dhcppc1 profile]$ java -Xdebug -Xrunprofile:help -cp . test.Test
Java JVMDI Coverage analyser
Options (Specify after -Xrunprofile with a colon (:) and separate with comma (,)
incremental - add to the existing data in the profile
(this allows multiple small test cases)
file:<name> - define the name of the data file to store the profile
name:<name> - define the name of the profile stored in the file
detail - store additional line information in the profile for detailed reports
faster - enable experimental in-memory hashtable support
Example : -Xdebug -Xrunprofile:incremental,file:profile.dat,name:myapp
[jcrisp@dhcppc1 profile]$ java -Xdebug -Xrunprofile:detail -cp . test.Test
DEBUG magic word enabled
Coverage profile initialised.
foo
foo
foo
foo
foo
bar
16
[jcrisp@dhcppc1 profile]$ ./report
<Profile name='Profile' runCount='1' mainClass='Ltest/Test;'>
<Method name='Ltest/Test;bar()V' lines='2' span='2' coverage='1.00' passed='yes'>
<Line number='13'/>
<Line number='14'/>
</Method>
<Method name='Ltest/Test;main([Ljava/lang/String;)V' lines='9' span='9' coverage='1.00' passed='yes'>
<Line number='18'/>
<Line number='20'/>
<Line number='21'/>
<Line number='22'/>
<Line number='23'/>
<Line number='25'/>
<Line number='23'/>
<Line number='27'/>
<Line number='28'/>
</Method>
<Method name='Ltest/Test;<init>()V' lines='1' span='1' coverage='1.00' passed='yes'>
<Line number='3'/>
</Method>
<Method name='Ltest/Test;foo()V' lines='2' span='2' coverage='1.00' passed='yes'>
<Line number='8'/>
<Line number='9'/>
</Method>
<Summary methods='4' passed='4'/>
</Profile>
Process this with XSLT and display.xsl, and you get a nicer summary
David's perl script output is a lot prettier
If you get an error message from java complaining that it can't find the library, check that the library path is set correctly in the LD_LIBRARY_PATH environmental variable, and that all of the required libraries (libprofile.so, libhashtable.so and libdb-4.so) are available. 'ldd libprofile.so' should confirm this