Wie erhalte ich Emma oder Cobertura, mit Maven, um Bericht Berichterstattung über Quellcode in anderen Modulen?

StackOverflow https://stackoverflow.com/questions/4717846

Frage

Ich habe einen Multi-Modul Maven-Setup mit Java-Code.

Meine Unit-Tests, in einem der Module, Übung Code in mehreren Modulen. Natürlich müssen die Module Interdependenzen und Code in allen relevanten Modulen kompiliert wird, wie im Vorfeld der Testdurchführung benötigt werden.

Also: Wie kann ich einen Bericht über die Abdeckung des gesamten Codebasis bekommen


Hinweis: Ich bin nicht die Frage, wie die Ergebnisse der Berichterstattung kombinieren für Tests in mehreren Modulen. Ich frage, wie die Abdeckung von Tests in einem einzigen Modul bekommen mit instrumentierten Code aus mehreren Modulen. Jeder, der in der ehemaligen interessiert könnte beziehen sich auf diese other questions und die Empfehlungen von Crowne Maven Armaturenbrett und Sonar .

Es gelang mir, eine vollständige Abdeckung Bericht bekommen reine Ant verwenden. [EDIT:] Ich instrumentierte alle Gläser aus dem Entwicklungs-Runtime-Verzeichnis in ein temporäres Verzeichnis; vorangestellt, das temporäre Verzeichnis auf dem Classpath; dann liefen Tests von Ant mit Batch-Test .

Ant kann von Maven ausgeführt werden, aber die Herausforderung hier ist die nahtlose Integration (dh Fütterung alle die Classpath und sourcepath Elemente von Maven Ant automatisch), weshalb ich nicht Maven Einrichtungen für diesen Zweck verwendet haben.

Es gibt auch anderen Fragen über Integrationstests. jedes Projektes Bericht standardmäßig jedoch standardmäßig nur Berichte Berichterstattung über Code in dem gleichen Projekt, während meines Tests Übung Code in mehreren Projekten.

Das Artikel in Spanisch relevant sein könnte. Hier ist ein weiterer Seam spezifischen Artikel .


War es hilfreich?

Lösung

Der aktuelle Blog-Beitrag von Thomas Sundberg enthält eine Methode, die mit Ameise für die cobertura Anrufe, anstatt das maven Plugin cobertura teilweise das Problem löst.

Es stützt sich auf die folgenden grundlegenden Ansatz mit spezialisierten pom.xml und build.xml Dateien:

Starten Sie mit einer typischen Maven Kompilierung auf dem übergeordneten pom, die alle Klassen in dem untergeordneten Module kompilieren.

mvn clean compile # maven-compile-plugin called for compiling

Dann Instrument alle Modulklassen:

ant instrument # cobertura called for instrumentation

Dann rufen Sie Maven-todsichere-Plugin namens zum Testen der instrumentierten Klassen, mit cobertura als Testabhängigkeit

mvn test 

Dann einen benutzerdefinierten Bericht Aufruf Pull verwenden in alle Ergebnisse aus verschiedenen Modulen:

ant report # cobertura called for reporting

Die wichtigsten Elemente der Ameise build.xml Datei sind Instrument alle Module separat und dann zum Bericht über alle Module nach den Ergebnissen zusammengeführt werden. Diese Funktion muss für jedes Modul in seinem Beispiel genannt werden:

<target name="instrumentAModule">
    <property name="classes.dir" value="target/classes"/>
    <cobertura-instrument todir="./${module}/${classes.dir}">
        <fileset dir="./${module}/target/classes">
            <include name="**/*.class"/>
        </fileset>
    </cobertura-instrument>
</target>

Dann, nachdem die Prüfung abgeschlossen ist, geht die Berichtsphase zunächst alle Ergebnisse aus all den verschiedenen Verzeichnissen in eine neue SER-Datei zusammengefügt werden (sum.ser in seinem Beispiel genannt)

<target name="report" depends="merge">
    <property name="src.dir" value="src/main/java/"/>
    <cobertura-report datafile="sum.ser"
                      format="html"
                      destdir="./target/report">
        <!-- Add all modules that should be included below -->
        <!-- fileset dir="./MODULE_NAME_TO_REPLACE/${src.dir}"/ -->
        <fileset dir="./product/${src.dir}"/>
    </cobertura-report>
</target>

<target name="merge">
    <cobertura-merge datafile="sum.ser">
        <fileset dir=".">
            <include name="**/cobertura.ser"/>
        </fileset>
    </cobertura-merge>
</target>

Es kann möglich sein, die Ameise Komponenten in mit der antrun Plugin maven zu integrieren, aber ich bin nicht vertraut genug mit der Phasen / Lifecycles zu wissen, wo die verschiedenen Anrufe setzen.

Dies ist sehr nützlich für mich, da ich abstrakte Testklassen in meinem api Module schreiben und sie dann biete mit einer Implementierung in meinem lib Module. Bisher sowohl cobertura und emma nicht gelungen, diesen Entwurf zu handhaben, so meine Codeabdeckung typischerweise 0 oder in den einstelligen Bereich ist.

Andere Tipps

Sie nie versucht, aber dies kann ein Weg sein, um es zu erreichen:

  • In jedem Modul kurz vor dem install Phase, lassen Sie die JAR-Dateien cobertura Instrument und installieren Sie die instrumentierte JAR-Dateien (!) In das lokale Maven-Repository
  • In dem Tests-Modul, Maven wird Artefakt Abhängigkeiten aus der lokalen Maven-Repository verwenden, um die Tests auszuführen. Diese instrumentierten Klassen sollen nun in der Daten-Datei erscheinen, z.B. cobertura.ser
  • Führen Sie die cobertura-Bericht Generation wie gewohnt aus dem Tests-Modul des Projektes, zum Beispiel mvn site

Siehe cobertura Dokumentation, wie man manuell invoke cobertura zum Instrumente externer JAR-Dateien an Ort und Stelle:

... Sie können auch in JAR-Dateien passieren zu instrumentierten Standard ant Dateigruppen verwenden werden. Cobertura wird jede Klasse aus dem Glas und Instrumente extrahiert. Wenn 'todir' nicht angegeben wurde dann das Original-Glas mit einer instrumentierten Version überschrieben werden ...

Der Build-Plugins des pom.xml kann wie folgt aussehen - Sie können ein Profil oder eine Verwendung Klassifizierer hinzufügen zwischen der endgültigen JAR-Datei und der instrumentierte JAR-Datei zu unterscheiden, wenn Sie sie in Ihrem lokalen Repo nicht überschrieben werden sollen. Dann in den Tests Modul, die Sie gerade benötigen, um die Abhängigkeiten zu Ihrem anderen Module zu definieren die Klassifizierer verwendet wird.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
                <execution>
                    <id>cobertura-inplace-instrumentation</id>
                    <phase>package</phase>
                    <configuration>
                        <tasks>
                            <taskdef classpathref="maven.plugin.classpath" resource="tasks.properties" />
                            <cobertura-instrument
                                datafile="${project.build.directory}/cobertura-nop.ser">
                                <fileset dir="${project.build.directory}">
                                    <include name="${project.build.finalName}.${project.packaging}" />
                                </fileset>
                            </cobertura-instrument>
                        </tasks>
                    </configuration>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>net.sourceforge.cobertura</groupId>
                    <artifactId>cobertura</artifactId>
                    <version>1.9.4.1</version>
                </dependency>
            </dependencies>
        </plugin>

Im Allgemeinen Berichte an ihre spezifischen Modul betreffen, jedoch können sie aggregiert werden,
zwei Ansätze sind:

Ich würde empfehlen, dass Sie versuchen, Sonar für Sie den Bericht Aggregation zu tun.

Sehen Sie die öffentliche Instanz „ nemo “, die beeindruckenden Fähigkeiten, um zu sehen, die angeboten werden.

Ich bezweifle, wenn möglich wäre, da die Berichterstattung Informationen von cobertura / emma erhalten wird durch die kompilierten Klassen instrumentiert. Während dies für Klassen im angegebenen Projekt arbeiten würde, ist es, wenn diese Werkzeuge Instrument abhängige Bibliotheken zweifelhaft.

Ein Blick auf die Maven Plugin cobertura Nutzung tut auch nicht scheinen, eine solche Möglichkeit zu zeigen.

I found this pretty straightforward (although I did it a while ago, and may be rusty with details...

My core project contains all of the modules. I use Cobertura to measure my test coverage. I am using Hudson as a Continuous Integration engine, and have the Cobertura plugin for Hudson.

It has been working a treat for a while now.

Good Luck !

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top