2017-02-24 2 views
0

Für das Szenario, in dem der Test für einen Agenten ausgeführt wird, und der Jacoco-Agent für diesen Ziel-Agent instrumentiert ist. Wird jacoco die Codeabdeckung für die Premain-Methode des Zielagenten melden?Gibt der jacoco-Agent einen Code-Coverage für den Prerain eines anderen Agenten an

+1

nicht klar, was die Frage ist. – RamPrakash

+0

@RamPrakash Jeder Javaagent hat eine 'Premain'-Methode, bei der die JVM den Agenten lädt. Ich frage, ob ich zwei Agenten anbiete, der erste ist Jacoco, der zweite ist ein anderer Agent. Wird die "Premain" -Methode des zweiten Agenten für die Code-Abdeckung von jacoco agent berücksichtigt? –

Antwort

1

Javaagents werden in der Reihenfolge angewendet, in der sie in der Befehlszeile angegeben sind. Wenn der JaCoCo-Agent zuerst angegeben wird, wird seine Instrumentierung auf alle nachfolgenden Agenten angewendet.

Wenn Sie also die Abdeckung von Code, den ein Java-Agent ändert oder hinzufügt, einschließen möchten, sollten Sie diese nach JaCoCo einfügen.

+0

Danke für diese Antwort. Ich habe verstanden, dass ich, wenn ich Code-Coverage für einen anderen Agenten bekommen möchte, den jacoco-Agenten zuerst in der Kommandozeile angeben muss. Aber meine Frage ist, würde die "Premain" -Methode des zweiten Agenten von jacoco Agent für die Codeabdeckung gemeldet werden? Ich habe versucht, ein Experiment in meinem lokalen, ich finde der Bericht des Jacoco würde nicht die Code-Abdeckung des zweiten Agenten enthalten. Versuchen Sie daher herauszufinden, ob der jacoco Agent diesen Teil melden würde oder nicht? –

+1

@ Y.Feng ja es wird - ich habe Antwort hinzugefügt, die Beispiel enthält: http://Stackoverflow.com/a/42480303/244993 – Godin

1

JaCoCo-Agent instrumentiert und zeichnet die Ausführung von Klassen auf, die danach geladen werden. Java-Agenten werden in der Reihenfolge geladen, in der sie in der Befehlszeile angegeben sind. Wenn also der zweite Agent nach dem JaCoCo-Agenten angegeben wird, wird JaCoCo ihn instrumentieren und seine Ausführung aufzeichnen. Hier ist Beispiel:

Mittel src/main/java/Premain.java:

import java.lang.instrument.Instrumentation; 

public class Premain { 
    public static void premain(String args, Instrumentation inst) { 
    System.out.println("Hello world"); 
    } 
} 

eine leere Test src/test/java/Test.java nur in der Lage sein, Mittel zur Ausführung mit ihm, führt einen Code nicht von einem Agenten direkt:

import org.junit.Test 

public class Test { 
    @Test 
    public void test() { 
    } 
} 

pom.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.example</groupId> 
    <artifactId>example</artifactId> 
    <version>0.1-SNAPSHOT</version> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
    </dependency> 
    </dependencies> 

    <properties> 
    <argLine>-javaagent:target/${project.build.finalName}.jar</argLine> 
    </properties> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>3.0.2</version> 
     <configuration> 
      <archive> 
      <manifestEntries> 
       <Premain-Class>Premain</Premain-Class> 
      </manifestEntries> 
      </archive> 
     </configuration> 
     </plugin> 

     <plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>0.7.9</version> 
     </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.19.1</version> 
     <executions> 
      <execution> 
      <!-- to be able to use agent that was built --> 
      <id>default-test</id> 
      <phase>verify</phase> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

</project> 

Ausführung von mvn clean jacoco:prepare-agent verify jacoco:report wird Bericht im Verzeichnis erzeugen target/site/jacoco:

report

+0

Danke für diese detaillierte Antwort und kurze Demo! Sehr hilfreich! –

Verwandte Themen