मर्ज किए गए कवरेज रिपोर्ट देने के लिए मल्टी-मॉड्यूल मावेन + सोनार + जैकोको को कैसे कॉन्फ़िगर करें?


128

मैंने इस एक के लिए इंटरनेट को खोजा है। मावेन गुणों के साथ करने के लिए ${sonar.jacoco.reportPath}, या org.jacoco:jacoco-maven-plugin:prepare-agentया के maven-surefire-plugin argLineसाथ सेटिंग करने के लिए बहुत सारे आधे-उत्तर हैं -javaagent

कुछ कैसे, इन जवाबों में से कोई भी, या तो अपने दम पर, या संयोजन में, जो मैं कर रहा हूं उसका उत्पादन कर रहे हैं: एक कवरेज रिपोर्ट जो एक वर्ग को कवर के रूप में दिखाती है यदि इसका उपयोग स्टैक के उच्चतर परीक्षणों में किया जाता है, जैसे कि संस्थाओं का उपयोग किया जा रहा है DAO द्वारा, भले ही यह पूरी तरह से अपने स्वयं के मॉड्यूल में परीक्षणों द्वारा कवर नहीं किया गया था।

क्या इसे प्राप्त करने के लिए कोई निश्चित विन्यास है?

जवाबों:


164

मैं आपके समान ही स्थिति में था, पूरे इंटरनेट पर बिखरे हुए आधे उत्तर काफी परेशान करने वाले थे, क्योंकि ऐसा लगता था कि बहुत से लोगों के पास एक ही मुद्दा था, लेकिन किसी को भी पूरी तरह से समझाने की जहमत नहीं उठाई गई कि उन्होंने इसे कैसे हल किया।

सोनार डॉक्स का उल्लेख उदाहरण के साथ एक GitHub परियोजना है कि सहायक होते हैं। मैंने इसे हल करने के लिए नियमित यूनिट परीक्षणों के लिए एकीकरण परीक्षण तर्क को लागू करने के लिए किया था (हालांकि उचित इकाई परीक्षण विशिष्ट होना चाहिए, यह हमेशा ऐसा नहीं होता है)।

मूल pom.xml में, ये गुण जोड़ें:

<properties>
    <!-- Sonar -->
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.language>java</sonar.language>
</properties>

यह सोनार को सभी सबमॉडल्स के लिए एक ही जगह (मूल परियोजना में एक लक्ष्य फ़ोल्डर) के लिए यूनिट परीक्षण रिपोर्ट बना देगा। यह सोनार को स्वयं का रोल करने के बजाय मैन्युअल रूप से चलाई गई रिपोर्टों का पुन: उपयोग करने के लिए भी कहता है। हमें केवल बिल्ड / प्लग इन के अंदर पेरेंट पोम में इसे रखकर सभी सबमॉडल्स के लिए जकोको-मावेन-प्लगइन रन बनाने की जरूरत है:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.0.201210061924</version>
    <configuration>
        <destFile>${sonar.jacoco.reportPath}</destFile>
        <append>true</append>
    </configuration>
    <executions>
        <execution>
            <id>agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>

destFileरिपोर्ट फ़ाइल को उस स्थान पर रखता है जहाँ सोनार उसकी तलाश करेगा और appendउसे अधिलेखित करने के बजाय फ़ाइल में जोड़ देगा। यह एक ही फाइल में सभी सबमॉडल्स के लिए सभी JaCoCo रिपोर्टों को संयोजित करेगा।

सोनार प्रत्येक सबमॉड्यूल के लिए उस फाइल को देखेगा, क्योंकि हमने उसे ऊपर बताया था, जिससे हमें सोनार में मल्टी मॉड्यूल फाइलों के लिए संयुक्त इकाई परीक्षण के परिणाम मिले।


अद्भुत! इसने काम किया है। आखिरकार! मुझे लगता है कि जो जादू गायब था, वह मुझे याद आ रहा था <append> true </ append>
स्टीवर्ट

यह काम करता हैं! नई रिपोर्ट पथ उत्पन्न करने के लिए मुझे mvn packageदौड़ने mvn sonar:sonarसे पहले एक नया करना था ।
thomasa88

2
उदाहरण के अनुसार, "sonar.jacoco.itReportPath" संपत्ति का उपयोग "समग्र व्यावसायिक कवरेज" में विलय के परिणाम प्राप्त करने के लिए किया जाना चाहिए। कृपया जवाब अपडेट करें।
यवेस मार्टिन

4
"sonar.dynamicAnalysis" भी पदावनत किया गया है: docs.sonarqube.org/display/SONAR/Release+4.3+Upgrad+Notes
यवेस मार्टिन

3
अद्यतित लिंक: docs.sonarqube.org/display/SONARQUBE53/…
लोनज़क

23

सामान्य प्रश्न

उस समय से मेरे सिर के ऊपर से सवाल जोकोको के साथ पागल हो गए थे।

मेरा आवेदन सर्वर (jBoss, Glassfish ..) इराक, सीरिया में स्थित है, जो भी हो .. क्या उस पर एकीकरण परीक्षण चलाते समय मल्टी-मॉड्यूल कवरेज प्राप्त करना संभव है? जेनकिंस और सोनार भी अलग-अलग सर्वरों पर हैं।

हाँ। आपको जैकोको एजेंट का उपयोग करना होगा जो मोड में चलता है output=tcpserver, जैकोको चींटी लिब। मूल रूप से दोjar एस। इससे आपको 99% सफलता मिलेगी।

जैकोको एजेंट कैसे काम करता है?

आप एक स्ट्रिंग संलग्न करें

-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*

अपने एप्लिकेशन सर्वर JAVA_OPTS पर जाएं और इसे पुनरारंभ करें। इस तार में ही[your_path] आपके वीएम पर जहां एप सर्वर चलता है, उसे jacocoagent.jar, संग्रहीत (इसे संग्रहीत करें) पथ के साथ बदलना होगा। उस समय से आप ऐप सर्वर शुरू करते हैं, जो सभी एप्लिकेशन तैनात हैं, उनकी गतिशील निगरानी की जाएगी और उनकी गतिविधि (मतलब कोड का उपयोग) आपके लिए तैयार होगा।

जब से मेरा परीक्षण शुरू हुआ है तब से ही मैं जेकोको एजेंट को निष्पादन डेटा एकत्र करना शुरू कर सकता हूं?

हां, इस उद्देश्य के लिए आपको अपने जेन्किन्स कार्यक्षेत्र में स्थित जैकोकोएंट.जर और चींटी बिल्ड स्क्रिप्ट की आवश्यकता है।

तो मूल रूप से मुझे http://www.eclemma.org/jacoco/ से क्या जरूरत है, मेरे जोकिन्स वर्कस्पेस में स्थित jacocoant.jar है, और मेरे ऐप सर्वर वीएम पर स्थित jacocoagent.jar?

ये सही है।

मैं चींटी का उपयोग नहीं करना चाहता, मैंने सुना है कि जैकोको मावेन प्लगइन सभी चीजें भी कर सकता है।

यह सही नहीं है, जैकोको मावेन प्लगइन यूनिट टेस्ट डेटा और कुछ इंटीग्रेशन टेस्ट डेटा ( Arquillian Jacoco देखें ) इकट्ठा कर सकता है , लेकिन अगर आपके पास उदाहरण के लिए बाकी के टेस्ट किए हुए टेस्ट हैं जो जेनकिंस में एक अलग बिल्ड के रूप में हैं, और मल्टी-मॉड्यूल कवरेज दिखाना चाहते हैं, तो मैं कर सकता हूं। देखें कि कैसे मावेन प्लगइन आपकी मदद कर सकता है।

वास्तव में जकोको एजेंट क्या पैदा करता है?

.execप्रारूप में केवल कवरेज डेटा । सोनार तो इसे पढ़ सकते हैं।

क्या जैकोको को यह जानने की जरूरत है कि मेरे जावा कक्षाएं कहाँ स्थित हैं?

नहीं, सोनार करता है, लेकिन जैकोको नहीं। जब तुम करोगेmvn sonar:sonar कक्षाओं में जाते हैं तो खेल में आते हैं।

तो चींटी लिपि का क्या?

इसे आपके जेनकिंस कार्यक्षेत्र में प्रस्तुत किया जाना है। मेरा चींटी स्क्रिप्ट, मैंने कहा jacoco.xmlकि यह ऐसा दिखता है:

<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
    <property name="jacoco.port" value="6300"/>
    <property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>

    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
    </taskdef>

    <target name="jacocoReport">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
    </target>

    <target name="jacocoReset">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
        <delete file="${jacocoReportFile}"/>
    </target>
</project>

इस लिपि को लागू करते समय आपको दो अनिवार्य परमानेंट पास करने चाहिए जो -Dworkspace=$WORKSPACE इसे आपके जेंकिंस वर्कस्पेस को इंगित करने और -Djacoco.host=yourappserver.comबिना होस्ट करने के लिए उपयोग करेंhttp://

यह भी ध्यान दें कि मैंने अपना jacocoant.jar$ {कार्यक्षेत्र} /tools/jacoco/jacocoant.jar पर रखा है

मुझे आगे क्या करना चाहिये?

क्या आपने jacocoagent.jar के साथ अपना ऐप सर्वर शुरू किया है?

क्या आपने अपने जेन्किन्स कार्यक्षेत्र में चींटी स्क्रिप्ट और jacocoant.jar लगाई थी?

यदि हाँ, तो अंतिम चरण जेंकिन्स बिल्ड को कॉन्फ़िगर करना है। यहाँ रणनीति है:

  1. jacocoResetपहले से एकत्रित सभी डेटा को रीसेट करने के लिए चींटी लक्ष्य को लागू करें।
  2. अपने परीक्षण चलाएं
  3. jacocoReportरिपोर्ट प्राप्त करने के लिए चींटी लक्ष्य का आह्वान करें

यदि सब कुछ सही है, तो आप देखेंगे it-jacoco.exec अपने निर्माण कार्यक्षेत्र में ।

स्क्रीनशॉट को देखें, मैंने antअपने कार्यक्षेत्र में भी $WORKSPACE/tools/antdir में स्थापित किया है , लेकिन आप अपने जेनकींस में स्थापित एक का उपयोग कर सकते हैं।

यहाँ छवि विवरण दर्ज करें

सोनार में इस रिपोर्ट को कैसे आगे बढ़ाया जाए?

मावेन sonar:sonarकाम करेगा (इसे कॉन्फ़िगर करना न भूलें), इसे मुख्य pom.xml पर इंगित करें ताकि यह सभी मॉड्यूल के माध्यम से चलेगा। sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.execसोनार को बताने के लिए पैरामीटर का उपयोग करें जहां आपकी एकीकरण परीक्षण रिपोर्ट स्थित है। हर बार जब यह नए मॉड्यूल कक्षाओं का विश्लेषण करेगा, तो इसमें कवरेज के बारे में जानकारी मिलेगी it-jacoco.exec

मेरे पास पहले से ही मेरे 'target` dir, `mvan सोनार: sonar` को अनदेखा / हटाने के लिए jacoco.exec है

डिफ़ॉल्ट रूप से अपने लक्ष्य को मिटाता mvn sonar:sonarहै cleanऔर हटाता है, sonar.dynamicAnalysis=reuseReportsइससे बचने के लिए उपयोग करें।


20

नई तरह का संस्करण 0.7.7

संस्करण 0.7.7 के बाद से एक समग्र रिपोर्ट बनाने का एक नया तरीका है:

आप एक अलग 'रिपोर्ट' प्रोजेक्ट बनाते हैं जो सभी आवश्यक रिपोर्ट एकत्र करता है (एग्रीगेटर प्रोजेक्ट में कोई भी लक्ष्य अपने मॉड्यूल से पहले निष्पादित किया जाता है इसलिए इसका उपयोग नहीं किया जा सकता है)।

aggregator pom
  |- parent pom
  |- module a
  |- module b
  |- report module 

जड़ पोम इस तरह दिखता है (मॉड्यूल के तहत नई रिपोर्ट मॉड्यूल जोड़ने के लिए भूल नहीं है):

<build>
<plugins>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
      <execution>
        <id>prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

प्रत्येक उप मॉड्यूल से poms को बिल्कुल बदलने की आवश्यकता नहीं है। रिपोर्ट मॉड्यूल से पोम इस तरह दिखता है:

<!-- Add all sub modules as dependencies here -->
<dependencies>
  <dependency>
    <module a>
  </dependency>
  <dependency>
    <module b>
  </dependency>
 ...

  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.8</version>
        <executions>
          <execution>
            <id>report-aggregate</id>
            <phase>verify</phase>
            <goals>
              <goal>report-aggregate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

एक पूर्ण छूट यहां पाया जा सकता है


3
यह काम। कुल रिपोर्ट सभी मॉड्यूल के लिए संचयी कोड कवरेज को दर्शाती है। क्या आपने कभी सोनार में इस संचयी रिपोर्ट को देखने की कोशिश की? मैंने व्यक्तिगत रिपोर्टों के लिए जैकोको.सेक्स को पढ़ने के लिए सोनार-क्बे का इस्तेमाल किया, लेकिन इस रिपोर्ट के साथ, मुझे रिपोर्ट मॉड्यूल में एक एकत्रित जैकोको.एक्सईसी नहीं दिखता है।
स्वेता V

@SwethaV इसमें कोई सफलता? हम एक ही स्थिति में हैं और एकत्रित निष्पादन को उत्पन्न करने के लिए एक तरीका खोजने की आवश्यकता है :)
विंकी

हम सोनार क्वे वर्जन 6.X का उपयोग करते हैं, जिसका अपना टेस्ट कवरेज पेज है, इसलिए मुझे वहां पर जैकोको की जरूरत नहीं है। एक पुराने संस्करण के लिए हमने
कोबटुरा

11

मैं अपना समाधान पोस्ट करूंगा क्योंकि यह अन्य लोगों से अलग है और मुझे मौजूदा उत्तर की सहायता से, सही होने के लिए एक ठोस दिन भी मिला है।

मल्टी-मॉड्यूल मावेन परियोजना के लिए:

ROOT
|--WAR
|--LIB-1
|--LIB-2
|--TEST

जहां WARपरियोजना मुख्य वेब ऐप है, LIB1 और 2 अतिरिक्त मॉड्यूल हैं जो WARनिर्भर करता है और TESTजहां एकीकरण परीक्षण रहते हैं। TESTएक एम्बेडेड टॉमकैट उदाहरण (टॉमकैट प्लगइन के माध्यम से नहीं) को स्पिन करता है WARऔर JUnit परीक्षणों के एक सेट के माध्यम से परियोजना चलाता है और उनका परीक्षण करता है। WARऔर LIBपरियोजनाओं दोनों का अपना इकाई परीक्षण किया है।

इस सब का परिणाम एकीकरण और इकाई परीक्षण कवरेज अलग हो रहा है और सोनारक्यूब में प्रतिष्ठित होने में सक्षम है।

ROOT pom.xml

<!-- Sonar properties-->
<sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>

<!-- build/plugins (not build/pluginManagement/plugins!) -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <executions>
        <execution>
            <id>agent-for-ut</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <append>true</append>
                <destFile>${sonar.jacoco.reportPath}</destFile>
            </configuration>
        </execution>
        <execution>
            <id>agent-for-it</id>
            <goals>
                <goal>prepare-agent-integration</goal>
            </goals>
            <configuration>
                <append>true</append>
                <destFile>${sonar.jacoco.itReportPath}</destFile>
            </configuration>
        </execution>
    </executions>
</plugin>

WAR, LIB और TEST pom.xmlJaCoCo प्लगइन्स निष्पादन का वारिस होगा।

TEST pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <skipTests>${skip.tests}</skipTests>
                <argLine>${argLine} -Duser.timezone=UTC -Xms256m -Xmx256m</argLine>
                <includes>
                    <includes>**/*Test*</includes>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>

मैंने पेट्रीकैनुलेंस ब्लॉग पोस्ट 'यूनिट कोडिंग रिपोर्ट्स फॉर यूनिट एंड इंटीग्रेशन टेस्ट विद द जैकोको मावेन प्लगिन' को भी पाया कि जैकोको सेटअप चीजों के लिए मूल्यवान है।


मुझे इस पोस्ट को किसी चरण में अपडेट करने की आवश्यकता है क्योंकि यह वास्तव में थोड़ा उप-रूपी है। मॉड्यूल agent-for-itमें परीक्षण चलाते समय केवल आवश्यक है TESTलेकिन वर्तमान कॉन्फ़िगरेशन में यह हर दूसरे मॉड्यूल के लिए चल रहा है, जहां इसका कोई मूल्य नहीं है। सुधार agent-for-utअन्य सभी मॉड्यूलों agent-for-itमें चलाने और केवल चलाने के लिए होगा TEST
मार्कशीट

7

इसे पूरा करने का एक तरीका है। जादू एक संयुक्त jacoco.exec फ़ाइल बनाने के लिए है। और मावेन 3.3.1 के साथ इसे प्राप्त करने का एक आसान तरीका है। यहाँ मेरा प्रोफ़ाइल:

<profile>
    <id>runSonar</id>
    <activation>
        <property>
            <name>runSonar</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <sonar.language>java</sonar.language>
        <sonar.host.url>http://sonar.url</sonar.host.url>
        <sonar.login>tokenX</sonar.login>
        <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
        <sonar.jacoco.reportPath>${jacoco.destFile}</sonar.jacoco.reportPath>
        <jacoco.destFile>${maven.multiModuleProjectDirectory}/target/jacoco_analysis/jacoco.exec</jacoco.destFile>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <append>true</append>
                            <destFile>${jacoco.destFile}</destFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.sonarsource.scanner.maven</groupId>
                    <artifactId>sonar-maven-plugin</artifactId>
                    <version>3.2</version>
                </plugin>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.7.8</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</profile>

यदि आप इस प्रोफ़ाइल को अपने पैरेंट पोम में जोड़ते हैं और कॉल करते हैं mvn clean install sonar:sonar -DrunSonar करते हैं तो आपको पूरा कवरेज मिलता है।

यहां का जादू है maven.multiModuleProjectDirectory। यह फ़ोल्डर हमेशा वह फ़ोल्डर होता है जहाँ आपने अपना मैवेन बिल्ड शुरू किया था।


कई अन्य समाधानों से गुजरने के बाद, इसने मेरे लिए काम किया।
जिमसन कन्ननथारा जेम्स

एकमात्र समस्या थी, मुझे त्रुटि के mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar -DrunSonarकारण सोनार को कमांड के साथ चलाना पड़ा A required class was missing while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar: org/sonar/batch/bootstrapper/IssueListener
जिमसन कन्ननथारा जेम्स

1
इस जादू का उपयोग न करें। दी गई संपत्ति एक कार्यान्वयन विवरण है और इस पर भरोसा नहीं किया जाएगा। - मेवेन डेवलपर टीम
माइकल-ओ

6

कॉन्फ़िगरेशन मैं अपने मूल स्तर पोम में उपयोग करता हूं जहां मेरे पास अलग इकाई और एकीकरण परीक्षण चरण हैं।

मैं मूल गुण पोम गुण में निम्न गुणों को कॉन्फ़िगर करता हूं

    <maven.surefire.report.plugin>2.19.1</maven.surefire.report.plugin>
    <jacoco.plugin.version>0.7.6.201602180812</jacoco.plugin.version>
    <jacoco.check.lineRatio>0.52</jacoco.check.lineRatio>
    <jacoco.check.branchRatio>0.40</jacoco.check.branchRatio>
    <jacoco.check.complexityMax>15</jacoco.check.complexityMax>
    <jacoco.skip>false</jacoco.skip>
    <jacoco.excludePattern/>
    <jacoco.destfile>${project.basedir}/../target/coverage-reports/jacoco.exec</jacoco.destfile>

    <sonar.language>java</sonar.language>
    <sonar.exclusions>**/generated-sources/**/*</sonar.exclusions>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.coverage.exclusions>${jacoco.excludePattern}</sonar.coverage.exclusions>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/coverage-reports</sonar.jacoco.reportPath>

    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
    <skip.failsafe.tests>${skipTests}</skip.failsafe.tests>

मैं प्लगइन परिभाषाओं को प्लगइन प्रबंधन के तहत रखता हूं।

ध्यान दें कि मैं अचूक के लिए एक संपत्ति को परिभाषित करता हूं (अचूकअफ्रीग्लिन) और फेलसेफ (फेलसेफअर्गिन) तर्क देता है कि जकोको को प्रत्येक परीक्षण के साथ चलाने के लिए जावाकोको को कॉन्फ़िगर करने की अनुमति दी जाए।

प्लगइन प्रबंधन के तहत

  <build>
     <pluginManagment>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <fork>true</fork>
                    <meminitial>1024m</meminitial>
                    <maxmem>1024m</maxmem>
                    <compilerArgument>-g</compilerArgument>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <forkCount>4</forkCount>
                    <reuseForks>false</reuseForks>
                    <argLine>-Xmx2048m ${surefireArgLine}</argLine>
                    <includes>
                        <include>**/*Test.java</include>
                    </includes>
                    <excludes>
                        <exclude>**/*IT.java</exclude>
                    </excludes>
                    <skip>${skip.surefire.tests}</skip>
                </configuration>
            </plugin>
            <plugin>
                <!-- For integration test separation -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.19.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.19.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <forkCount>4</forkCount>
                    <reuseForks>false</reuseForks>
                    <argLine>${failsafeArgLine}</argLine>
                    <includes>
                        <include>**/*IT.java</include>
                    </includes>
                    <skip>${skip.failsafe.tests}</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>verify</id>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <!-- Code Coverage -->
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco.plugin.version}</version>
                <configuration>
                    <haltOnFailure>true</haltOnFailure>
                    <excludes>
                        <exclude>**/*.mar</exclude>
                        <exclude>${jacoco.excludePattern}</exclude>
                    </excludes>
                    <rules>
                        <rule>
                            <element>BUNDLE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>${jacoco.check.lineRatio}</minimum>
                                </limit>
                                <limit>
                                    <counter>BRANCH</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>${jacoco.check.branchRatio}</minimum>
                                </limit>
                            </limits>
                        </rule>
                        <rule>
                            <element>METHOD</element>
                            <limits>
                                <limit>
                                    <counter>COMPLEXITY</counter>
                                    <value>TOTALCOUNT</value>
                                    <maximum>${jacoco.check.complexityMax}</maximum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
                <executions>
                    <execution>
                        <id>pre-unit-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${jacoco.destfile}</destFile>
                            <append>true</append>
                            <propertyName>surefireArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                            <outputDirectory>${sonar.jacoco.reportPath}</outputDirectory>
                            <skip>${skip.surefire.tests}</skip>
                        </configuration>
                    </execution>
                    <execution>
                        <id>pre-integration-test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <destFile>${jacoco.destfile}</destFile>
                            <append>true</append>
                            <propertyName>failsafeArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>report-integration</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                            <outputDirectory>${sonar.jacoco.reportPath}</outputDirectory>
                            <skip>${skip.failsafe.tests}</skip>
                        </configuration>
                    </execution>
                    <!-- Disabled until such time as code quality stops this tripping
                    <execution>
                        <id>default-check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                        </configuration>
                    </execution>
                    -->
                </executions>
            </plugin>
            ...

और बिल्ड सेक्शन में

 <build>
     <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>

        <plugin>
            <!-- for unit test execution -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
        <plugin>
            <!-- For integration test separation -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
        <plugin>
            <!-- For code coverage -->
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
        </plugin>
        ....

और रिपोर्टिंग अनुभाग में

    <reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-report-plugin</artifactId>
            <version>${maven.surefire.report.plugin}</version>
            <configuration>
                <showSuccess>false</showSuccess>
                <alwaysGenerateFailsafeReport>true</alwaysGenerateFailsafeReport>
                <alwaysGenerateSurefireReport>true</alwaysGenerateSurefireReport>
                <aggregate>true</aggregate>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.plugin.version}</version>
            <configuration>
                <excludes>
                    <exclude>**/*.mar</exclude>
                    <exclude>${jacoco.excludePattern}</exclude>
                </excludes>
            </configuration>
        </plugin>
     </plugins>
  </reporting>

1
मैं देखता हूं कि आपके पास अनुभागों के <append>true</append>तहत विन्यास है prepare-agent...
स्टीवर्ट

जोर। एक अन्य उत्तर के लिए मेरी टिप्पणी पढ़ें। यह मेरे लिए गायब महत्वपूर्ण घटक था, अन्य डॉक्स में नहीं मिला।
स्टीवर्ट

क्या आपके पास इसके लिए गिटब लिंक है? मैं ठीक इसी तरह के विन्यास करना चाहता हूं
रोहित कासट

@Rhit - नहीं, मैं नहीं, कम से कम एक सार्वजनिक भंडार में नहीं।
मीठे

यह सोनार क्यूब संस्करण 6.5 (निर्माण 27846) के साथ बहुत अच्छा काम करता है ...: डी कोड कवरेज को सही ढंग से प्रदर्शित किया जाएगा।
udoline

4

मुझे नए सोनार संस्करणों के लिए एक और समाधान मिला जहां JaCoCo के बाइनरी रिपोर्ट प्रारूप (* .exec) को पदावनत किया गया और पसंदीदा प्रारूप XML (सोनारजावा 5.12 और उच्चतर) है। समाधान बहुत सरल है और इस विषय से मूल निर्देशिका में * .exec रिपोर्ट के साथ पिछले समाधान के समान है: https://stackoverflow.com/a/15535970/4448263

यह मानते हुए कि हमारी परियोजना संरचना है:

moduleC - aggregate project's pom
  |- moduleA - some classes without tests
  |- moduleB - some classes depending from moduleA and tests for classes in both modules: moduleA and moduleB

आपको समग्र परियोजना के पोम में मावेन बिल्ड प्लगइन कॉन्फ़िगरेशन की आवश्यकता है:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</version>
    <executions>
        <execution>
            <id>prepare-and-report</id>
            <goals>
                <goal>prepare-agent</goal>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>report-aggregate</id>
            <phase>verify</phase>
            <goals>
                <goal>report-aggregate</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/../target/site/jacoco-aggregate</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

फिर मावेन के साथ परियोजना का निर्माण:

mvn clean verify

और सोनार के लिए आपको प्रशासन GUI में संपत्ति निर्धारित करनी चाहिए:

sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml,../target/site/jacoco-aggregate/jacoco.xml

या कमांड लाइन का उपयोग कर:

mvn sonar:sonar -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml,../target/site/jacoco-aggregate/jacoco.xml

विवरण

यह डिफ़ॉल्ट निर्देशिकाओं में प्रत्येक मॉड्यूल के लिए द्विआधारी रिपोर्ट बनाता है target/jacoco.exec:। फिर डिफ़ॉल्ट निर्देशिकाओं में प्रत्येक मॉड्यूल के लिए XML रिपोर्ट बनाता है target/site/jacoco/jacoco.xml:। फिर कस्टम निर्देशिका में प्रत्येक मॉड्यूल के लिए एक समग्र रिपोर्ट बनाता है जो प्रत्येक मॉड्यूल के ${project.basedir}/../target/site/jacoco-aggregate/लिए मूल निर्देशिका के सापेक्ष है। मॉड्यूलए और मॉड्यूलबी के लिए यह सामान्य मार्ग होगाmoduleC/target/site/jacoco-aggregate/

चूंकि मॉड्यूलबी मॉड्यूलए पर निर्भर करता है, इसलिए मॉड्यूलबी अंतिम बनाया जाएगा और इसकी रिपोर्ट का उपयोग सोनार में ए और बी दोनों के लिए एक समग्र कवरेज रिपोर्ट के रूप में किया जाएगा।

कुल रिपोर्ट के अलावा, हमें एक सामान्य मॉड्यूल रिपोर्ट की आवश्यकता है क्योंकि JaCoCo कुल रिपोर्ट में केवल निर्भरता के लिए कवरेज डेटा होता है।

साथ में, सोनार के लिए पूर्ण कवरेज डेटा प्रदान करने वाली ये दो प्रकार की रिपोर्टें।

एक कम प्रतिबंध है: आपको परियोजना की मूल निर्देशिका में एक रिपोर्ट लिखने में सक्षम होना चाहिए (अनुमति होनी चाहिए)। या आप jacoco.skip=trueरूट प्रोजेक्ट के pom.xml (मॉड्यूलसी) और jacoco.skip=falseवर्गों और परीक्षणों (मॉड्यूलए और मॉड्यूलबी) के साथ मॉड्यूल में संपत्ति सेट कर सकते हैं ।


2
    <sonar.language>java</sonar.language>
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.jacoco.reportPath>${user.dir}/target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.jacoco.itReportPath>${user.dir}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
    <sonar.exclusions>
        file:**/target/generated-sources/**,
        file:**/target/generated-test-sources/**,
        file:**/target/test-classes/**,
        file:**/model/*.java,
        file:**/*Config.java,
        file:**/*App.java
    </sonar.exclusions>

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                            <propertyName>surefire.argLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-prepare-agent-integration</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <destFile>${sonar.jacoco.itReportPath}</destFile>
                            <append>true</append>
                            <propertyName>failsafe.argLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report-integration</id>
                        <goals>
                            <goal>report-integration</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>             

2

सोनार के रूप में sonar.jacoco.reportPath, sonar.jacoco.itReportPathऔर sonar.jacoco.reportPathsसभी को हटा दिया गया है , आपको उपयोग करना चाहिएsonar.coverage.jacoco.xmlReportPaths अब । यदि आप सोनार और जैकोको के साथ मल्टी मॉड्यूल मावेन प्रोजेक्ट को कॉन्फ़िगर करना चाहते हैं तो यह भी कुछ प्रभाव डालता है।

जैसा कि @Lonzak ने बताया , सोनार 0.7.7 के बाद से, आप सोनार रिपोर्ट एग्रिगेशन गोल का उपयोग कर सकते हैं। बस आप पर निर्भरता निम्नलिखित है:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</version>
    <executions>
        <execution>
            <id>report</id>
            <goals>
                <goal>report-aggregate</goal>
            </goals>
            <phase>verify</phase>
        </execution>
    </executions>
</plugin>

जैसा कि जकोको-मावेन-प्लगइन के वर्तमान संस्करण xml-रिपोर्ट के साथ संगत हैं, यह हर मॉड्यूल के लिए बनाएगा, जिसमें एक टारगेट फ़ोल्डर है एक साइट / जकोको-एग्रीगेट फ़ोल्डर जिसमें एक jacoco.xmlफ़ाइल है।

सोनार को सभी मॉड्यूल को संयोजित करने के लिए, निम्नलिखित कमांड का उपयोग करें:

mvn -Dsonar.coverage.jacoco.xmlReportPaths=full-path-to-module1/target/site/jacoco-aggregate/jacoco.xml,module2...,module3... clean verify sonar:sonar

मेरे उत्तर को छोटा और सटीक रखने के लिए, मैंने maven-surefire-pluginऔर maven-failsafe-pluginनिर्भरता का उल्लेख नहीं किया । आप बस उन्हें किसी अन्य कॉन्फ़िगरेशन के बिना जोड़ सकते हैं:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.22.2</version>
    <executions>
        <execution>
        <id>integration-test</id>
            <goals>
                <goal>integration-test</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1

आप एक चींटी कार्य को मर्ज कह सकते हैं सभी फ़ाइल (* .exec) को एक ही फ़ाइल में एक साथ रखने के लिए, मावेन पर ।

यदि आप चलाए जा रहे हैं इकाई परीक्षण चरण तैयार-पैकेज का उपयोग करते हैं , यदि आप एकीकरण परीक्षण चलाते हैं तो उत्तर-एकीकरण-परीक्षण का उपयोग करें ।

इस साइट का एक उदाहरण है कि जेकोको चींटी कार्य को मावेन परियोजना में कैसे कॉल करें

आप सोनार पर इस मर्ज की गई फ़ाइल का उपयोग कर सकते हैं।


0

यूनिट-टेस्टिंग और इंटीग्रेशन-टेस्टिंग के लिए आप मावेन-अचूक-प्लग-इन का उपयोग कर सकते हैं और मावेन-फेलसेफ-प्लगइन प्रतिबंधित शामिल / शामिल नहीं है। मैं सोनार / जाकोको के संपर्क में रहते हुए सीडीआई के साथ खेल रहा था, इसलिए मैंने इस परियोजना को समाप्त किया:

https://github.com/FibreFoX/cdi-sessionscoped-login/

शायद यह आपकी थोड़ी मदद करे। मेरे pom.xml में मैं निर्दिष्ट परीक्षण-प्लगइन्स के कॉन्फ़िगरेशन-सेक्शन में argLine- ऑप्शन को सेट करके "-javaagent" निहित का उपयोग करता हूं। MAVEN परियोजनाओं में ANT का उपयोग करते हुए स्पष्ट है कि मैं एक कोशिश नहीं करूँगा, मेरे लिए दो दुनियाओं को मिलाना।

मेरे पास केवल एकल-मॉड्यूल मावेन परियोजना है, लेकिन शायद यह आपको काम करने के लिए समायोजित करने में मदद करता है।

नोट: शायद सभी मावेन-प्लगइन्स up2date नहीं हैं, हो सकता है कि कुछ मुद्दे बाद के संस्करणों में तय किए गए हों


इसके लिए धन्यवाद; मैं देखूंगा और आपको बताऊंगा कि यह कैसे काम करता है। इस सप्ताह हालांकि नहीं हो सकता है :)
स्टीवर्ट

0

यह नमूना मेरे लिए बहुत अच्छा काम करता है:

<plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.2</version>
            <executions>
                <execution>
                    <id>pre-unit-test</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                        <propertyName>surefireArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                        <!--<excludes>
                            <exclude>com.asimio.demo.rest</exclude>
                            <exclude>com.asimio.demo.service</exclude>
                        </excludes>-->
                        <propertyName>testArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>post-unit-test</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>merge-results</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>merge</goal>
                    </goals>
                    <configuration>
                        <fileSets>
                            <fileSet>
                                <directory>${project.build.directory}/coverage-reports</directory>
                                <includes>
                                    <include>*.exec</include>
                                </includes>
                            </fileSet>
                        </fileSets>
                        <destFile>${project.build.directory}/coverage-reports/aggregate.exec</destFile>
                    </configuration>
                </execution>
                <execution>
                    <id>post-merge-report</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/aggregate.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <argLine>${surefireArgLine}</argLine>
                <!--<skipTests>${skip.unit.tests}</skipTests>-->
                <includes>
                    <include>**/*Test.java</include>
                    <!--<include>**/*MT.java</include>
                    <include>**/*Test.java</include>-->
                </includes>
            <!--    <skipTests>${skipUTMTs}</skipTests>-->
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <!--<skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>-->
                <argLine>${testArgLine}</argLine>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <!--<excludes>
                    <exclude>**/*UT*.java</exclude>
                </excludes>-->
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

कृपया अपने उत्तर के लिए कुछ स्पष्टीकरण प्रदान करें
mishsx

@mishsx स्पष्टीकरण के लिए एक अच्छा लेख: natritmeyer.com/howto/…
SerhatTopkaya
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.