Mendapatkan "Melewati eksekusi JaCoCo karena file data eksekusi hilang" saat menjalankan JaCoCo

123

Saya menggunakan Maven 3.0.3, JUnit 4.8.1, dan Jacoco 0.6.3.201306030806, dan saya mencoba membuat laporan cakupan pengujian.

Saya memiliki proyek dengan pengujian unit saja, tetapi saya tidak dapat menjalankan laporan, saya berulang kali mendapatkan kesalahan: Skipping JaCoCo execution due to missing execution data fileketika saya menjalankan:

mvn clean install -P test-coverage

Berikut adalah konfigurasi pom saya:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx2048m</argLine>
  </configuration>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.14.1</version>
  <configuration>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>
...
<profile>
  <id>test-coverage</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.6.3.201306030806</version>
        <configuration>
          <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
          <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
        </configuration>
        <executions>
          <execution>
            <id>prepare-unit-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <!-- prepare agent for measuring integration tests -->
          <execution>
            <id>prepare-integration-tests</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <phase>pre-integration-test</phase>
            <configuration>
              <propertyName>itCoverageAgent</propertyName>
            </configuration>
          </execution>
          <execution>
            <id>jacoco-site</id>
            <phase>verify</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>

Semua pengujian saya berjalan dengan sukses. Berikut beberapa keluaran dari Maven:

[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-unit-tests) @ myproject ---
[INFO] argLine set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec
[INFO] 
    ...
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0

[INFO]
    ...
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:prepare-agent (prepare-integration-tests) @ myproject ---
[INFO] itCoverageAgent set to -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec 
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:integration-test (default) @ myproject ---
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- maven-failsafe-plugin:2.14.1:verify (default) @ myproject ---
[INFO] Failsafe report directory: /Users/davea/Dropbox/workspace/myproject/target/failsafe-reports
[WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
[INFO] 
[INFO] --- jacoco-maven-plugin:0.6.2.201302030002:report (jacoco-site) @ myproject ---
[INFO] Skipping JaCoCo execution due to missing execution data file
[INFO] 

Ada ide konfigurasi apa yang saya lewatkan?

Dave
sumber
Sepertinya Anda juga memiliki tes integrasi di pom Anda, yang mungkin bisa mengganggu. Juga, kami destFilemenghapus dan membiarkannya menulis ke file target / jacoco.exec default.
MarkHu
Saya telah memposting jawaban di lokasi ini .
Shivkumar Kawtikwar

Jawaban:

135

jacoco-maven-plugin: 0.7.10-SNAPSHOT

Dari jacoco: persiapkan-agen yang mengatakan:

Salah satu cara untuk melakukan ini dalam kasus maven-surefire-plugin - adalah menggunakan sintaks untuk evaluasi properti yang terlambat:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <argLine>@{argLine} -your -extra -arguments</argLine>
  </configuration>
</plugin>

Perhatikan @{argLine}yang ditambahkan ke -your -extra -arguments.

Terima kasih Slava Semushin karena memperhatikan perubahan dan melaporkan di komentar .

jacoco-maven-plugin: 0.7.2-SNAPSHOT

Berikut jacoco: persiapkan-agen yang mengatakan:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: persiapkan-agen] Menyiapkan properti yang menunjuk ke agen runtime JaCoCo yang dapat diteruskan sebagai argumen VM ke aplikasi yang diuji. Bergantung pada jenis pengemasan proyek secara default, properti dengan nama berikut ditetapkan:

  • tycho.testArgLine untuk jenis pengemasan eclipse-test-plugin dan
  • argLine sebaliknya.

Perhatikan bahwa properti ini tidak boleh ditimpa oleh konfigurasi pengujian, jika tidak, agen JaCoCo tidak dapat dilampirkan. Jika Anda membutuhkan parameter khusus, harap tambahkan. Sebagai contoh:

<argLine>${argLine} -your -extra -arguments</argLine>

Informasi cakupan yang dihasilkan dikumpulkan selama eksekusi dan secara default ditulis ke file saat proses berakhir.

Anda harus mengubah baris berikut dalam maven-surefire-pluginkonfigurasi plugin dari (perhatikan bagian ${argLine}dalamnya <argLine>):

<argLine>-Xmx2048m</argLine>

untuk

<argLine>${argLine} -Xmx2048m</argLine>

Lakukan juga perubahan yang diperlukan pada plugin lain maven-failsafe-plugindan ganti yang berikut (sekali lagi, perhatikan ${argLine}):

<argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>

untuk

<argLine>${argLine} -Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
Jacek Laskowski
sumber
Namun sekarang, ada masalah ini , tanpa target jacoco, build gagal.
Andreas
Bekerja untuk tetapi saya harus menggunakan tycho.testArgLine karena saya menggunakan tycho.
Raffi Khatchadourian
1
Tautan yang dikutip sekarang memiliki saran yang sedikit berbeda untuk digunakan @{argLine}.
Slava Semushin
2
Persis inilah masalah saya. Saya memiliki argumen khusus dalam perintah mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Saya tidak mendeklarasikan maven-surefire-plugin secara eksplisit dan mengatur konfigurasi. Saya hanya menambahkan placeholder argLine di baris perintah maven seperti mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Sekarang file jacoco.exec dibuat dan laporan cakupan dibuat di sonar.
RenatoIvancic
1
Berhasil !!! Masalahnya adalah karena konfigurasi <argLine> yang saya tambahkan di maven-surefire-plugin untuk meningkatkan memori untuk tes Integrasi Mengonfigurasi <argLine> $ {argLine} --my - additional-arguments - here-- </ argLine > memecahkan masalah
Massimo Da Ros
23

Saya menghadapi sedikit masalah berbeda yang mengembalikan kesalahan yang sama.

Skipping JaCoCo execution due to missing execution data /target/jacoco.exec

Sebenarnya, kesalahan ini muncul karena banyak, banyak alasan. Kami bereksperimen dengan berbagai solusi di Stack Overflow, tetapi menemukan sumber daya ini yang terbaik. Ini meruntuhkan berbagai kemungkinan alasan mengapa Jacoco dapat mengembalikan kesalahan yang sama.

Bagi kami, solusinya adalah dengan menambahkan agen-persiapan ke konfigurasi.

<execution>
   <id>default-prepare-agent</id>
   <goals>
       <goal>prepare-agent</goal>
   </goals>
</execution>

Saya membayangkan sebagian besar pengguna akan mengalaminya karena alasan yang berbeda, jadi lihat sumber daya yang disebutkan di atas!

Chad Van De Hey
sumber
2
Saya pikir Anda berhasil. Orang mungkin mencari di Google untuk "perbaikan cepat", tetapi jawaban yang paling benar adalah "Sebenarnya, kesalahan ini muncul karena banyak, banyak alasan". Hanya perlu mencari tahu apa itu. Bagi saya, itu adalah pom induk yang menimpa <argLine> di plugin maven-surefire.
tuan.dinh
Ini! Terima kasih. Saya mendapat pesan yang sama, tetapi itu karena plugin pasti saya hanya mencari file yang dinamai **/*Test.javaketika kelas pengujian saya dinamai*Tests.java
Roger Worrell
Saya punya dua masalah: 1. Tidak ada kelas tes apa pun, membutuhkan setidaknya satu *Test.javakelas, dan satu metode tes yang diberi anotasi @Testsehingga Jacoco dapat melakukan sesuatu. 2. Dalam variabel lingkungan Travis untuk proyek saya, jika salah ketik SONART_TOKEN=*****, harus diberi namaSONAR_TOKEN=***** . Lihat dokumen Travis di sini , cari or define SONAR_TOKEN in your Repository Settings. Setelah saya memperbaikinya, build berjalan dengan sukses. Anda dapat melihat proyek gitbhub saya yang dimaksud .
Jose Quijada
16

Mungkin ada kasus di mana beberapa pengaturan argline atau plugin lain di pom mungkin menimpa pengaturan perintah eksekusi jacoco.

argLine diatur ke -javaagent:/Users/davea/.m2/repository/org/jacoco/org.jacoco.agent/0.6.2.201302030002/org.jacoco.agent-0.6.2.201302030002-runtime.jar=destfile=/Users/davea/Dropbox/workspace/myproject/target/jacoco.exec

Salah satu contohnya

           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                    <forkCount>5</forkCount>
                    <reuseForks>true</reuseForks>
                    <argLine>-Dnet.sf.ehcache.disabled=true</argLine>
                </configuration>
            </plugin>

Setelah menghilangkan argLine dari plugin ini, jacoco mulai berfungsi secara normal.

Atish Narlawar
sumber
Memecahkan masalah saya. Tempat yang bagus!
user1974753
13

Anda juga bisa mendapatkan kesalahan "Melewati eksekusi JaCoCo karena file data eksekusi hilang" karena tes yang hilang dalam proyek. Misalnya ketika Anda menjalankan proyek baru dan tidak memiliki file * Test.java sama sekali.

Tanya Jivvca
sumber
5

FWhat tdrury berkata:

ubah konfigurasi plugin Anda menjadi ini:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.3.201306030806</version>
    <executions>
      <!-- prepare agent for measuring integration tests -->
      <execution>
        <id>prepare-integration-tests</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
        <configuration>
          <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile>
        </configuration>
      </execution>
      <execution>
        <id>jacoco-site</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report</goal>
        </goals>
        <configuration>
          <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile>
        </configuration>
      </execution>
    </executions>
  </plugin>

Edit: Hanya melihat satu hal penting, destFile dan dataFile tampaknya case sensitive jadi seharusnya destFile, bukan destfile.

BoneGoat
sumber
5

Saya tahu pertanyaan ini cukup tua tetapi jika seseorang seperti saya datang ke sini untuk mencari jawaban maka ini mungkin bisa membantu. Saya sudah bisa mengatasi kesalahan di atas dengan ini.

1) Hapus potongan kode di bawah ini dari plugin maven-surefire-plugin

 <reuseForks>true</reuseForks>
 <argLine>-Xmx2048m</argLine>

2) Tambahkan tujuan di bawah ini:

<execution>
<id>default-prepare-agent</id>
<goals>
   <goal>prepare-agent</goal>
</goals>
</execution>
Selalu seorang newComer
sumber
3

Menemukan masalah yang sama sekarang.

Saya memiliki sebuah kelas bernama HelloWorld, dan saya membuat sebuah kelas pengujian untuk itu dinamai HelloWorldTests, lalu saya mendapatkan hasilnyaSkipping JaCoCo execution due to missing execution data file.

Saya kemudian mencoba untuk mengubah saya pom.xml untuk membuatnya berfungsi, tetapi upaya itu gagal.

Akhirnya, saya hanya mengganti nama HelloWorldTestsmenjadi HelloWorldTest, dan berhasil!

Jadi saya rasa, secara default , jacoco hanya mengenali kelas pengujian bernama like XxxTest, yang menunjukkan bahwa itu adalah kelas pengujian Xxx. Jadi cukup ganti nama kelas tes Anda ke format ini seharusnya berfungsi!

afkbrb.dll
sumber
2

Saya sudah mencoba semua jawaban tetapi hanya kombinasi saran berikut yang berhasil untuk saya. Mengapa? Saya memiliki persyaratan yang sangat spesifik:

  1. JaCoCo menghasilkan laporan ketika build dijalankan dari baris perintah: mvn clean verify (Maven 3.6.0)
  2. Intellij IDEA (2019.01) menjalankan tes saya juga
  3. Semuanya berfungsi dengan adanya yang lain yang javaagentditentukan dalam surefireplugin

Solusi - tambahkan argLinenilai dalam surefirekonfigurasi dengan properti maven "penggantian terlambat" @{...}seperti yang dijelaskan di surefire FAQ ( konfigurasi tetap saya )

Bagaimana cara menggunakan properti yang disetel oleh plugin lain di argLine? Maven melakukan penggantian properti

$ {...} nilai dalam pom.xml sebelum plugin apa pun dijalankan. Jadi Surefire tidak akan pernah melihat placeholder di properti argLine-nya. Karena Versi 2.17 menggunakan sintaks alternatif untuk properti ini,

@ {...} memungkinkan penggantian properti yang terlambat saat plugin dijalankan, sehingga properti yang telah dimodifikasi oleh plugin lain akan diambil dengan benar.

Percobaan pertama gagal - tentukan properti jaCoCoArgLine dalam prepare-agentkonfigurasi tujuan jacoco- skenario gagal persyaratan kedua saya, IntelliJ IDEA tidak dapat menemukan agen untuk jmockit yang saya gunakan dalam proyek untuk mengejek metode statis

Pawel Kruszewski
sumber
Menghadapi masalah yang sama saat menggunakan dengan JMockit dan dapat menyelesaikan masalah dengan solusi ini. yaitu menambahkan argLine di plugin yang pasti
Karthik Rao
1

Saya telah menambahkan proyek Maven / Java dengan 1 kelas Domain dengan fitur-fitur berikut:

  • Pengujian unit atau Integrasi dengan plugin Surefire dan Failsafe.
  • Findbugs.
  • Cakupan tes melalui Jacoco .

Di mana hasil Jacoco? Setelah menguji dan menjalankan 'mvn clean', Anda dapat menemukan hasilnya di 'target / site / jacoco / index.html'. Buka file ini di browser.

Nikmati!

Saya mencoba untuk membuat proyek ini sesederhana mungkin. Proyek ini menggabungkan banyak saran dari posting ini dalam sebuah proyek contoh. Terima kasih, kontributor!

tm1701
sumber
Saya mencoba proyek git Anda tetapi tidak jelas bagaimana cara melihat laporannya.
Nagaraj Vittal
Di mana hasil Jacoco? Setelah menguji dan menjalankan 'mvn clean', Anda dapat menemukan hasilnya di 'target / site / jacoco / index.html'. Buka file ini di browser.
tm1701
Anda mungkin ingin menautkan repositori Anda kembali ke stackoverflow. Saya kesulitan menemukan pertanyaan itu lagi setelah saya menemukan bug di demo Anda.
Wolfgang Fahl
Dan masih tidak berfungsi seperti yang diharapkan :-( direktori target hanya memiliki aggregate.exec karena isinya saat melakukan pemasangan mvn bersih ...
Wolfgang Fahl
1

Saya berjuang selama berhari-hari. Saya mencoba semua konfigurasi berbeda yang disarankan di utas ini. Tak satu pun dari mereka berhasil. Akhirnya, saya hanya menemukan konfigurasi penting adalah tujuan persiapan-agen . Tapi Anda harus meletakkannya di fase yang benar. Saya melihat begitu banyak contoh yang memasukkannya ke dalam " uji-pra-integrasi ", itu menyesatkan, karena hanya akan dijalankan setelah pengujian unit. Jadi pengujian unit tidak akan diinstrumentasi.

Konfigurasi yang benar sebaiknya hanya menggunakan fase default, (jangan tentukan fase secara eksplisit). Dan biasanya, Anda tidak perlu menggunakan maven-surefire-plugin secara massal .

  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.4</version>
    <executions>
      <execution>
        <id>default-prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
      <execution>
        <id>jacoco-site</id>
        <phase>post-integration-test</phase>
        <goals>
          <goal>report</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
Jianwu Chen
sumber
0

Eksekusi mengatakan itu menempatkan data jacoco di /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec tetapi konfigurasi maven Anda mencari data di $ {basedir} / target / coverage-reports / jacoco-unit. eksekutif.

tdrury
sumber
1
Benar, jadi mengapa plugin mengabaikan apa yang saya tentukan dalam konfigurasi?
Dave
coba pindahkan konfigurasi destfile Anda ke dalam konfigurasi eksekusi persiapan-agen. Tidak semua plugin maven menangani pewarisan konfigurasi dengan baik.
tdrury
0

Tanggapan saya sangat terlambat tetapi untuk pengguna lain Dalam kasus Anda, Anda harus mengkonfigurasi pluging yang tidak aman untuk menggunakan konfigurasi agen baris perintah yang disimpan dalam variabel itCoverageAgent. Sebagai contoh

<configuration>
    <argLine>${itCoverageAgent}</argLine>
</configuration>

Dalam konfigurasi maven Anda, jacoco menyiapkan argumen baris perintah dalam fase persiapan-agen, tetapi plugin failafe tidak menggunakannya sehingga tidak ada file data eksekusi.

jpl
sumber
0

Coba gunakan:

mvn jacoco:report -debug

untuk melihat detail tentang proses pelaporan Anda.

Saya mengonfigurasi jacoco saya seperti ini:

<configuration>
    <dataFile>~/jacoco.exec</dataFile>
    <outputDirectory>~/jacoco</outputDirectory>
</configuration>

Kemudian mvn jacoco:report -debugmenampilkannya menggunakan konfigurasi default, yang artinya jacoco.exectidak dalam ~/jacoco.exec. Kesalahan mengatakanmissing execution data file .

Jadi gunakan saja konfigurasi default:

<execution>
    <id>default-report</id>
    <goals>
    </goals>
    <configuration>
        <dataFile>${project.build.directory}/jacoco.exec</dataFile>
        <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
    </configuration>
</execution>

Dan semuanya bekerja dengan baik.

xiaoLiuLiu
sumber
0

Kadang-kadang eksekusi dijalankan pertama kali, dan ketika kita melakukan maven clean install, eksekusi tidak dihasilkan setelah itu. Masalahnya adalah menggunakan true untuk skipMain dan melewatkan properti di bawah maven-compiler-plugin dari File pom utama. Hapus mereka jika mereka diperkenalkan sebagai bagian dari masalah atau saran apa pun.

Srini M
sumber
0

Dalam kasus saya, agen persiapkan memiliki destFilekonfigurasi yang berbeda , tetapi karena itu laporan harus dikonfigurasi dengan dataFile, tetapi konfigurasi ini hilang. Setelah dataFileditambahkan, itu mulai berfungsi dengan baik.

Pavan Kumar
sumber