code coverage
Filip Drabek
fdrabek at redhat.com
Fri Oct 8 06:27:37 UTC 2010
Hi all,
I would like to inform you that Cobertura code coverage tool can be used
in our project now.
To get the test coverage of our project or separate modules:
1) activate profile cobertura in maven build process
For example : mvn -Pdev,enterprise,cobertura install
-Dmaven.test.skip=false.
2) run tests (param -Dmaven.test.skip=false )
3) check the report in ${project.path}/directory target/cobertura/site
(overview of the module in index.html)
Technical details :
1) Cobertura maven plugin
There is a cobertura maven plugin at
http://mojo.codehaus.org/cobertura-maven-plugin/ which works well for
code coverage of tests.
This plugin measures code coverage of unit tests and not coverage of
integration tests.
There are some workarounds which can be used:
a) There is a patch for the maven plugin (patch can be found at this
page http://jira.codehaus.org/browse/MCOBERTURA-86 )
- Since that patch is not in current release of cobertura maven
plugin, this workaround can be used only on local environment of developer.
b) Run integration tests together with unit tests
(http://blog.jayway.com/2008/12/13/getting-coverage-for-integration-tests/)
- This workaround breaks the benefit of maven lifecycle phases.
c) Use maven antrun plugin and create an ant script
- This is solution and not just workaround.
Benefit is also that cobertura merge task, which is not
implemented in cobertura maven plugin, is implemented for ant.
2) Ant script
To use the code coverage in multiple maven modules projects, maven
profile "cobertura" was created.
Maven antrun plugin is used for running the ant script. (version 1.1
must be specified)
The profile can be activated by using param -Pcobertura in mvn command.
a) Instrumentation
The instrumentation task needs to run before tests. We need to run
the instrumentation task :
- For integration tests in maven lifecycle phase pre-integration-test
- for unit tests it is phase process-test-classes.
-- dependency
Because of dependency conflicts the dependencies are declared in
profile -> plugin -> dependencies.
To use the cobertura ant tasks we need to specify the task
definition. We can use the classpath reference to maven plugin classpath
which contains all necessary dependencies.
(it is done by code<taskdef classpathref="maven.plugin.classpath"
resource="tasks.properties" />)
-- folder structure
The folder structure is the same as the folder structure generated
by cobertura maven plugin.(So that we will be able to use cobertura
maven plugin when it will be ready)
-- data file location
"When you instrument your classes, Cobertura generates a .ser file
containing basic information about each class.
As your tests run, Cobertura adds additional information to this
same data file. If the instrumented classes can not find the data file
when running then they will create a new one. It is important that you use the
same cobertura.ser file when instrumenting, running, and generating reports.
The best way to do this is to specify the location of the data file
when running your tests. You should pass the
-Dnet.sourceforge.cobertura.datafile=${basedir}/cobertura.ser
sysproperty to the JUnit task"
[text from http://cobertura.sourceforge.net/faq.html]
To use this solution it would be neccessary to update the settings
of tests. There is a second choice which is used by maven plugin and our
script.
Ant script creates a file cobertura.properties in classpath which
contains path to the data file. (There is a note about this in
coberturas release notes from 5 June 2007)
b) Report
The results of code coverage is stored in folder
{project.path}/target/cobertura/site. The basic overview can be found in
file index.html.
-- backup
The instrumented classes should not be deployed to local
repository. To avoid such situation the compiled classes are backuped
before the tests runs and restored after test run finishes.
c) Merge
To generate one final report for all projects cobertura merge task
must be called. This task will merge data from specified coberturas data
files into one file.
Than we report task which will generete the html/ xml report from
data file is called. To generate the report we must specify the path to
source codes as parameter.
For each source code folder there must be defined these parameters
--basedir [{project.source.folder}/src/main/java] [relative from
specified folder to tested class]..
I wrote a groovy script which is doing this work it can be found in
file {rhq.project}/modules/enterprise/server/container/pom.xml.
Currently this task is implemented only in module
enterprise/server/container and generates the report in xml format
because of hudson task.
Filip Drabek
More information about the rhq-devel
mailing list