2016-11-06 12 views
1

私たちのプロジェクトでは、JenkinsやSonarQubeを使用してJaCoCoが誤ったカバレッジ計算をする問題があります。複数のビルドをマージする際のコードカバレッジが正しくありません

これは、ジェンキンスさんのためにいつものビルドスクリプトの例構築です:

<property name="demo"   location="."/> 
<property name="exec_name"  value="build1.exec"/> 
<import file=     "${demo}/buildscripts/common/product_common_ant.xml"/> 

<property name="coverage_data" location="\\server\jenkins\jobs\Test-Coverage\coverage_data\JobName"/> 

<target name="testrun" depends="compile" description="Execute tests with coverage"> 
    <jacoco:coverage destfile="${cov_res_file}" append="true"> 
     <testng classpathref="testrun_classpath" suitename="UnitTests" failureProperty="testng.failure" verbose="2" outputdir="${test-output}" workingDir="${demo}"> 
      <xmlfileset dir="${test}" includes="builds/unitTests.xml"/> 
     </testng> 
    </jacoco:coverage> 
    <copy file="${test-output}/testng-results.xml" tofile = "${test-output}/unit-test-results.xml"/> 
    <fail if="testng.failure"/> 

    <jacoco:coverage destfile="${cov_res_file}" append="true"> 
     <testng classpathref="testrun_classpath" suitename="IntegrationTests" failureProperty="testng.failure" verbose="2" outputdir="${test-output}" workingDir="${demo}"> 
      <xmlfileset dir="${test}" includes="builds/integTests_Build.xml"/> 
     </testng> 
    </jacoco:coverage> 
    <copy file = "${test-output}/testng-results.xml" tofile = "${test-output}/integ-test-results.xml"/> 
    <fail if="testng.failure"/> 

    <jacoco:coverage destfile="${cov_res_file}" append="true"> 
     <testng classpathref="testrun_classpath" suitename="BUildGUITests1" failureProperty="testng.failure" verbose="2" outputdir="${test-output}" workingDir="${demo}"> 
      <xmlfileset dir="${test}" includes="builds/funcTests_build_part01.xml"/> 
     </testng> 
    </jacoco:coverage> 
    <copy file = "${test-output}/testng-results.xml" tofile = "${test-output}/gui-test-results.xml"/> 
    <fail if="testng.failure"/> 
</target> 

<target name="mergeTestResults" depends="testrun, copyCoverageResults"> 
    <copy file="${buildscripts}/empty-test-results.xml" tofile="${test-output}/testng-merge.xml"/> 
    <for param="xmlFile"> 
     <path> 
      <fileset dir="${test-output}" > 
       <include name="unit-test-results.xml" /> 
       <include name="integ-test-results.xml" /> 
       <include name="gui-test-results.xml" /> 
      </fileset> 
     </path> 
     <sequential> 
      <copy file="${test-output}/testng-merge.xml" toFile="${test-output}/start-merge.xml"/> 
      <xslt style="${buildscripts}/merge-test-results.xsl" 
         destdir="${test-output}" 
         in="${test-output}/start-merge.xml" 
         out="${test-output}/testng-merge.xml"> 
       <param name="with" expression="@{xmlFile}" /> 
      </xslt> 
      <delete file="${test-output}/start-merge.xml" /> 
     </sequential> 
    </for> 
</target> 

だから、例えばありますこのビルドとカバレッジデータで実行する3つのスイートは

\\server\jenkins\jobs\Test-Coverage\coverage_data\JobName\buildX.exec 

カバレッジのビルドに保存されている私は、コンパイルを取り出し、一部を構築している次のスクリプト

<project name="Product Test Coverage Build" default="report" basedir="..\.." xmlns:jacoco="antlib:org.jacoco.ant"> 
<echo>Current username: ${user.name}</echo> 

<defaultexcludes echo="true"/> 

<property name="demo"   location="."/> 
<property name="src"   location="${demo}/src"/> 
<property name="bin"   location="${demo}/bin"/> 
<property name="lib1"   location="${demo}/lib"/> 
<property name="lib2"   location="${demo}/lib64"/> 
<property name="coverage"  location="${demo}/coverage"/> 

<property name="pr11_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part1-64\"/> 
<property name="pr12_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part2-64\"/> 
<property name="pr13_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part3-64\"/> 
<property name="pr14_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part4-64\"/> 
<property name="pr15_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part5-64\"/> 
<property name="pr16_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part6-64\"/> 
<property name="pr17_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part7-64\"/> 
<property name="pr18_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part8-64\"/> 
<property name="pr19_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product-Part9-64\"/> 

<property name="pr21_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part1-64\"/> 
<property name="pr22_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part2-64\"/> 
<property name="pr23_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part3-32\"/> 
<property name="pr24_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part4-64\"/> 
<property name="pr25_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part5-64\"/> 
<property name="pr26_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part6-64\"/> 
<property name="pr27_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part7-32\"/> 
<property name="pr28_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part8-64\"/> 
<property name="pr210_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product2-Part10-64\"/> 

<property name="pr31_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product3-Unit-Integ-Tests\"/> 
<property name="pr32_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product3-32\"/> 
<property name="pr33_coverage" location="\\server\jenkins\jobs\Product-Test-Coverage\coverage_data\Product3-Integration-1\"/> 

<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml" classpathref="testrun_classpath"/> 

<target name="merge" depends ="compile"> 
    <jacoco:merge destfile="${coverage}/merged.exec"> 
     <fileset dir="${pr11_coverage}" includes="*.exec"/> 
     <fileset dir="${pr12_coverage}" includes="*.exec"/> 
     <fileset dir="${pr13_coverage}" includes="*.exec"/> 
     <fileset dir="${pr14_coverage}" includes="*.exec"/> 
     <fileset dir="${pr15_coverage}" includes="*.exec"/> 
     <fileset dir="${pr16_coverage}" includes="*.exec"/> 
     <fileset dir="${pr17_coverage}" includes="*.exec"/> 
     <fileset dir="${pr18_coverage}" includes="*.exec"/> 
     <fileset dir="${pr19_coverage}" includes="*.exec"/> 

     <fileset dir="${pr21_coverage}" includes="*.exec"/> 
     <fileset dir="${pr22_coverage}" includes="*.exec"/> 
     <fileset dir="${pr23_coverage}" includes="*.exec"/> 
     <fileset dir="${pr24_coverage}" includes="*.exec"/> 
     <fileset dir="${pr25_coverage}" includes="*.exec"/> 
     <fileset dir="${pr26_coverage}" includes="*.exec"/> 
     <fileset dir="${pr27_coverage}" includes="*.exec"/> 
     <fileset dir="${pr28_coverage}" includes="*.exec"/> 
     <fileset dir="${pr210_coverage}" includes="*.exec"/> 

     <fileset dir="${pr31_coverage}" includes="*.exec"/> 
     <fileset dir="${pr32_coverage}" includes="*.exec"/> 
     <fileset dir="${pr33_coverage}" includes="*.exec"/> 
    </jacoco:merge> 
</target> 

<property environment="env"/> 
<property name="coverage_rep" location="\\server\jenkins\jobs\Product-Test-Coverage\builds\${env.BUILD_NUMBER}\"/> 

<target name="report" depends="merge"> 
    <jacoco:report> 
     <executiondata> 
      <file file="${coverage}/merged.exec"/> 
     </executiondata> 
     <structure name="Product Overall Code Coverage"> 
      <sourcefiles encoding="UTF-8"> 
       <fileset dir="${src}"/> 
      </sourcefiles> 
     </structure> 
     <html destdir="${coverage}"/> 
     <csv destfile="${coverage}/report.csv"/> 
     <xml destfile="${coverage}/report.xml"/> 
    </jacoco:report> 
    <copy file="${coverage}/index.html" tofile="${coverage_rep}/index.html"/> 
</target> 

を持っています。

JenkinsまたはSonarQubeでこのスクリプトを実行すると、約19%のコードカバレッジが得られます.Eclemma(Jacoco)を使用してすべてのテストをローカルで実行すると、約65%(これは信頼性の高い結果です)です。

私たちのビルドはそれぞれのSVNコミット時に実行され、実行するたびにコンパイルされます。すべてのテストサーバーは同じJavaバージョンを使用しますが、32ビットと64ビットの両方のアーキテクチャが使用されています。

ここで間違っていますか?

答えて

0

さらに1年後、突然コードカバレッジが再び正しくなりました。不思議で残念なことに、何が間違っていたかを知る方法はありません。

関連する問題