aboutsummaryrefslogtreecommitdiff
path: root/org.jacoco.doc/docroot/doc/classids.html
diff options
context:
space:
mode:
Diffstat (limited to 'org.jacoco.doc/docroot/doc/classids.html')
-rw-r--r--org.jacoco.doc/docroot/doc/classids.html183
1 files changed, 183 insertions, 0 deletions
diff --git a/org.jacoco.doc/docroot/doc/classids.html b/org.jacoco.doc/docroot/doc/classids.html
new file mode 100644
index 00000000..b59fec21
--- /dev/null
+++ b/org.jacoco.doc/docroot/doc/classids.html
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <link rel="stylesheet" href=".resources/doc.css" charset="UTF-8" type="text/css" />
+ <link rel="shortcut icon" href=".resources/report.gif" type="image/gif" />
+ <title>JaCoCo - Class Ids</title>
+</head>
+<body>
+
+<div class="breadcrumb">
+ <a href="../index.html" class="el_report">JaCoCo</a> &gt;
+ <a href="index.html" class="el_group">Documentation</a> &gt;
+ <span class="el_source">Class Ids</span>
+</div>
+<div id="content">
+
+<h1>Class Ids</h1>
+
+<p>
+ As JaCoCo's class identifiers are sometimes causing confusion this chapter
+ answers the concepts and common issues with class ids in FAQ style format.
+</p>
+
+<h3>What are class ids and how are they created?</h3>
+<p>
+ Class ids are 64-bit integer values, for example
+ <code>0x638e104737889183</code> in hex notation. Their calculation is
+ considered an implementation detail of JaCoCo. Currently ids are created with
+ a CRC64 checksum of the raw class file.
+</p>
+
+<h3>What are class ids used for?</h3>
+<p>
+ Class ids are used to unambiguously identify Java classes. At runtime execution
+ data is sampled for every loaded class and typically stored to
+ <code>*.exec</code> files. At analysis time &mdash; for example for report
+ generation &mdash; the class ids are used to relate analyzed classes with the
+ execution data.
+</p>
+
+<h3>What are the advantages of JaCoCo class ids?</h3>
+<p>
+ The concept of class ids allows distinguishing different versions of classes,
+ for example when multiple versions of an application are deployed to an
+ application server or different versions of libraries are included.
+</p>
+<p>
+ Also class ids are the prerequisite for JaCoCo's minimal runtime-overhead and
+ small <code>*.exec</code> files even for very large applications under test.
+</p>
+
+<h3>What is the disadvantage of JaCoCo class ids?</h3>
+<p>
+ The fact that class ids identify a specific version of a class causes problems
+ in setups where different classes are used at runtime and at analysis time.
+</p>
+
+<h3>What happens if different classes are used at runtime and at analysis time?</h3>
+<p>
+ In this case execution data cannot be related to the analyzed classes. As a
+ consequence such classes are reported with 0% coverage.
+</p>
+
+<h3>How can I detect that I have a problem with class ids?</h3>
+<p>
+ The typical symptom of class id mismatch is classes not shown as covered
+ although they have been executed during the test. This situation can be easily
+ detected e.g. in the HTML report: Open the <i>Sessions</i> page with the link
+ on the top-right corner. You see a list of all classes where execution data
+ has been collected for. Find the class in questions and check whether the
+ entry has a link to the corresponding coverage report page. If the entry is
+ not linked this means there is a class id mismatch between the class used at
+ runtime and the class provided to create the report.
+</p>
+
+<h3>What can cause different class ids?</h3>
+<p>
+ Class ids are identical for the exact same class file only (byte-by-byte).
+ There is a couple of reasons why you might get different class files. First
+ compiling Java source files will result in different class files if you use
+ a different tool chain:
+</p>
+<ul>
+ <li>Different compiler vendor (e.g. Eclipse vs. Oracle JDK)</li>
+ <li>Different compiler versions</li>
+ <li>Different compiler settings (e.g. debug vs. non-debug) </li>
+</ul>
+<p>
+ Also post-processing class files (obfuscation, AspectJ, etc.) will typically
+ change the class files. JaCoCo will work well if you simply use the same class
+ files for runtime as well as for analysis. So the tool chain to create these
+ class files does not matter.
+</p>
+<p>
+ Even if the class files on the file system are the same there is possible that
+ classes seen by the JaCoCo runtime agent are different anyways. This typically
+ happens when another Java agent is configured <i>before</i> the JaCoCo agent
+ or special class loaders pre-process the class files. Typical candidates are:
+</p>
+<ul>
+ <li>Mocking frameworks</li>
+ <li>Application servers</li>
+ <li>Persistence frameworks</li>
+</ul>
+
+<h3>What workarounds exist to deal with runtime-modified classes?</h3>
+<p>
+ If classes get modified at runtime in your setup there are some workarounds to
+ make JaCoCo work anyways:
+</p>
+<ul>
+ <li>If you use another Java agent make sure the <a href="agent.html">JaCoCo
+ agent</a> is specified at first in the command line. This way the JaCoCo
+ agent should see the original class files.</li>
+ <li>Specify the <code>classdumpdir</code> option of the
+ <a href="agent.html">JaCoCo agent</a> and use the dumped classes at report
+ generation. Note that only loaded classes will be dumped, i.e. classes not
+ executed at all will not show-up in your report as not covered.</li>
+ <li>Use <a href="offline.html">offline instrumentation</a> before you run your
+ tests. This way classes get instrumented by JaCoCo before any runtime
+ modification can take place. Note that in this case the report has to be
+ generated with the <i>original</i> classes, not with instrumented ones.</li>
+</ul>
+
+<h3>Why can't JaCoCo simply use the class name to identify classes?</h3>
+<p>
+ To understand why JaCoCo can't rely on class names we need to have a look at
+ the way how JaCoCo measures code coverage.
+</p>
+<p>
+ JaCoCo tracks execution with so called <i>probes</i>. Probes are additional
+ byte code instructions inserted in the original class file which will note
+ when they are executed and report this to the JaCoCo runtime. This process is
+ called <i>instrumentation</i>. To keep the runtime overhead minimal, only a
+ few probes are inserted at "strategic" places. These probe positions are
+ determined by <a href="flow.html">analyzing the control flow</a> of all
+ methods of a class. As a result every instrumented class produces a list of
+ <code>n</code> boolean flags indicating whether the probe has been executed or
+ not. A JaCoCo <code>*.exec</code> file simply stores a boolean array per
+ class id.
+</p>
+<p>
+ At analysis time, for example for report generation, the <code>*.exec</code>
+ file is used to get information about probe execution status. But as probes
+ are stored in a plain boolean array there is no information like corresponding
+ methods or lines. To retrieve this information we need the original class
+ files and perform the exact same control flow analysis than at instrumentation
+ time. Because this is a deterministic process we get the same probe positions.
+ With this information we can now interfere the execution status of every
+ single instruction and branch of a method. Using the debug information
+ embedded in the class files we can also calculate line coverage.
+</p>
+<p>
+ If we would use just slightly different classes at analysis time than at
+ runtime &mdash; e.g. different method ordering or additional branches &mdash;
+ we would end-up with different probes. For example the probe at index
+ <code>i</code> would be in method <code>a()</code> and not in method
+ <b>b()</b>. Obviously this will create random coverage results.
+</p>
+
+<h3>Why do I get an error when I try to analyze multiple versions of the same
+ class with a group?</h3>
+<p>
+ JaCoCo always analyzes a set of class as a group. The group is used to
+ aggregate data for source files and packages (both can contain multiple
+ classes). Within the reporting API classes are identified by their fully
+ qualified name (e.g. to create stable file names in the HTML reports).
+ Therefore it is not possible to include two different classes with the same
+ name within a group. Anyhow it is possible to analyze different versions of
+ class files in separate groups, for example the <a href="ant.html#report">Ant
+ report task</a> can be configured with multiple groups.
+</p>
+
+</div>
+<div class="footer">
+ <span class="right"><a href="@jacoco.home.url@">JaCoCo</a> @qualified.bundle.version@</span>
+ <a href="license.html">Copyright</a> &copy; @copyright.years@ Mountainminds GmbH &amp; Co. KG and Contributors
+</div>
+
+</body>
+</html>