...
Introduction
Emma is an open source code coverage tool. In our case, Emma enables code coverage by instrumenting the target code. The instrumentation process involves Emma looking at the class or jar files and adding its own layer between the JVM and the code normally called.
During the Instrumenting process, metadata is created per class. This metadata is stored in files locally. In our situation, we generate one meta file per webapp.
The instrumented code has an extra port open, which can accept commands from Emma such as return coverage information or reset coverage information that resides in memory.
To generate a full report Emma requires:
- the code has been compiled with the debug option on
- the source code is available,
- session data is available in a local file,
- a relevant metadata file exists.
Command line recipe
Prerequisite
- The highest version (build 2.1.5320) emma jar file needs to be downloaded from Emma home. The jar needs to be placed in {$JAVA_HOME}/jre/lib/ext
...
- or
...
- added
...
- to
...
- the
...
- classpath
...
- of
...
- the
...
- following
...
- commands.
...
- This
...
- is
...
- also
...
- true
...
- for
...
- the
...
- JAVA_HOME
...
- seen
...
- by
...
- the
...
- Sakai
...
- server.
...
- the
...
- source
...
- code
...
- is
...
- available
...
- for
...
- report
...
- generation
...
Note:
...
- I
...
- have
...
- written
...
- a
...
- simple
...
- Perl
...
- script
...
- that
...
- copies
...
- all
...
- the
...
- source
...
- code
...
- into
...
- one
...
- directory
...
structure
...
- instead
...
- of
...
- being
...
- scattered
...
- under
...
- the
...
- java/src
...
- directories.
...
- This
...
- allows
...
- report
...
- generation
...
- for
...
- all
...
- reports
...
- to
...
- point
...
- to
...
- the
...
- same
...
- source
...
- code
...
- directory.
...
- Javac
...
- compiles
...
- the
...
- source
...
- code
...
- with
...
- debug
...
- option
...
- on
...
Note:
...
- Running
...
- maven
...
- pack-demo
...
- compiles
...
- with
...
- debug
...
- on
...
- by
...
- default
Instrument code
Once emma.jar
...
sits
...
in
...
the
...
appropriate
...
directory
...
then
...
the
...
following
...
command
...
should
...
bring
...
up
...
the
...
help
...
information
...
for
...
EMMA:
...
{$JAVA_HOME}/bin/java
...
emma
...
Code Block | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| =
|
| |
| =
| }||||||||||
emma usage: emma <command> command options,
where <command> is one of:
run application runner same as 'emmarun' tool;
instr offline instrumentation processor;
ctl remote control processor;
merge offline data file merge processor.
report offline report generator;
use '<command> -h' to see usage help for a given command
EMMA v2.1, build 5320 (stable)
{code}
*Note |
Note 1:
...
Any
...
older
...
version
...
than
...
that
...
mentioned
...
in
...
the
...
results
...
will
...
not
...
function
...
correctly
...
for
...
our
...
needs.
...
Note
...
2:
...
I
...
have
...
written
...
some
...
example
...
only
...
Perl
...
code
...
that
...
looks
...
for
...
Web-INF/classes
...
directories
...
and
...
then
...
generates
...
a
...
...
...
that
...
runs
...
Emma
...
and
...
generates
...
a
...
metadata
...
file,
...
one
...
per
...
Webapp
...
Assuming
...
you
...
are
...
running
...
from
...
a
...
*NIX
...
environment
...
and
...
the
...
now
...
standard
...
bash
...
environment
...
and
...
the
...
target
...
Sakai
...
server
...
has
...
been
...
shutdown.
...
Code Block |
---|
java emma instr -ix - -ip {$SAKAI_HOME}/webapps/{$EMMA_INST}/WEB-INF/classes -m overwrite
-out= {$EMMA_REPORT_HOME}/{$EMMA_INST}.em
{code}
|*Variable*|*Description*|
| |
Variable | Description |
SAKAI_HOME |
...
File |
...
location |
...
of |
...
the |
...
root |
...
of |
...
your |
...
Sakai |
...
Server |
...
EMMA_REPORT_HOME |
...
File |
...
location |
...
for |
...
root |
...
dir |
...
for |
...
report |
...
generation |
...
EMMA_INST |
...
Webapp |
...
to |
...
instrument. |
...
E.G.: |
...
sakai-login-tool |
...
Result:
...
The
...
code
...
for
...
the
...
sakai-login-tool
...
is
...
now
...
instrumented
...
and
...
a
...
metadata
...
file
...
sakai-login-tool.em
...
has
...
been
...
created
...
in
...
the
...
report
...
directory.
...
Otherwise,
...
you
...
will
...
need
...
to
...
expand
...
the
...
variables
...
and
...
add
...
the
...
full
...
paths.
...
Generate
...
report
...
Restart
...
your
...
server.
...
Near
...
the
...
beginning
...
of
...
the
...
logging
...
you
...
will
...
see
...
an
...
entry
...
mentioning
...
Emma
...
is
...
alive
...
and
...
listening
...
at
...
a
...
given
...
port
...
number.
...
Collect
...
session
...
data
...
and
...
reset
...
in
...
memory
...
data:
...
Code Block |
---|
java emma ctl -connect localhost:47653 -command coverage.get,{$EMMA_REP0RT_HOME}/coverage.ec -command coverage.reset
{code}
*Generate the actual report:*
mkdir |
Generate the actual report:
mkdir {$EMMA_REP0RT_HOME}/{$EMMA_INST}
...
java
...
emma
...
report
...
-r
...
html
...
-sp
...
{
...
$EMMA_SRC_DIR}
...
-in
...
{$EMMA_REP0RT_HOME}/{$EMMA_INST}.em/coverage_demo.em
...
-in
...
-Dreport.html.out.file={$EMMA_REP0RT_HOME}/{$EMMA_INST}/index.html