Bắt đầu bỏ qua việc thực hiện JaCoCo do thiếu tệp dữ liệu thực thi. Khi thực hiện JaCoCo


122

Tôi đang sử dụng Maven 3.0.3, JUnit 4.8.1 và Jacoco 0.6.3.201306030806 và tôi đang cố gắng tạo báo cáo bảo hiểm thử nghiệm.

Tôi chỉ có một dự án với các bài kiểm tra đơn vị, nhưng tôi không thể chạy báo cáo, tôi liên tục gặp lỗi: Skipping JaCoCo execution due to missing execution data filekhi tôi chạy:

mvn clean install -P test-coverage

Đây là cách pom của tôi được cấu hình:

<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>

Tất cả các thử nghiệm của tôi chạy thành công. Đây là một số đầu ra từ 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] 

Bất cứ ý tưởng nào tôi thiếu cấu hình?



Có vẻ như bạn cũng có các bài kiểm tra tích hợp trong pom của bạn, điều này có thể gây mất tập trung. Ngoài ra, chúng tôi đã loại bỏ destFilevà để nó ghi vào tệp đích / jacoco.exec mặc định.
MarkHu

Tôi đã đăng câu trả lời tại vị trí này .
Shivkumar Kawtikwar

Câu trả lời:


133

jacoco-maven-plugin: 0.7.10-SNAPSHOT

Từ jacoco: đại lý chuẩn bị cho biết:

Một trong những cách để làm điều này trong trường hợp maven-Surefire-plugin - là sử dụng cú pháp để đánh giá thuộc tính muộn:

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

Lưu ý @{argLine}rằng đã được thêm vào -your -extra -arguments.

Cảm ơn Slava Semushin đã nhận thấy sự thay đổi và báo cáo trong bình luận .

jacoco-maven-plugin: 0.7.2-SNAPSHOT

Theo dõi jacoco: đại lý chuẩn bị cho biết:

[org.jacoco: jacoco-maven-plugin: 0.7.2-SNAPSHOT: ready-agent] Chuẩn bị một thuộc tính trỏ đến tác nhân thời gian chạy JaCoCo có thể được chuyển qua làm đối số VM cho ứng dụng đang được thử nghiệm. Tùy thuộc vào loại bao bì dự án theo mặc định, một thuộc tính có tên sau được đặt:

  • tycho.testArgLine cho loại bao bì nhật thực-thử nghiệm-plugin và
  • argLine khác.

Lưu ý rằng các thuộc tính này không được ghi đè bằng cấu hình thử nghiệm, nếu không, có thể đính kèm tác nhân JaCoCo. Nếu bạn cần thông số tùy chỉnh xin vui lòng nối chúng. Ví dụ:

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

Kết quả thông tin bảo hiểm được thu thập trong khi thực hiện và theo mặc định được ghi vào một tệp khi quá trình kết thúc.

bạn nên thay đổi dòng sau trong maven-surefire-plugincấu hình plugin từ (lưu ý ${argLine}bên trong <argLine>):

<argLine>-Xmx2048m</argLine>

đến

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

Thực hiện các thay đổi cần thiết cho các plugin khác maven-failsafe-pluginvà thay thế các điều sau (một lần nữa, chú ý ${argLine}):

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

đến

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

Bây giờ mặc dù, có vấn đề này , mà không có mục tiêu jacoco, việc xây dựng thất bại.
Andreas

Làm việc cho nhưng tôi đã phải sử dụng tycho.testArgLine vì tôi đang sử dụng tycho.
Raffi Khatchadourian 04/07/2015

1
Liên kết được trích dẫn bây giờ có một chút gợi ý khác nhau để sử dụng @{argLine}.
Slava Semushin

2
Chính xác thì đây là vấn đề của tôi. Tôi đã có các đối số tùy chỉnh trong lệnh mvn mvn clean package sonar:sonar -U -DargLine="-Dxxx=yyy". Tôi không tuyên bố rõ ràng maven-Surefire-plugin và thiết lập cấu hình. Tôi chỉ cần thêm giữ chỗ argLine trong dòng lệnh maven như thế nào mvn clean package sonar:sonar -U -DargLine="@{argLine} -Dxxx=yyy". Bây giờ tệp jacoco.exec được tạo và báo cáo bảo hiểm được tạo bằng sonar.
RenatoIvancic

1
Nó hoạt động !!! Vấn đề là do cấu hình <argLine> mà tôi đã thêm trên maven-Surefire-plugin để tăng bộ nhớ cho các bài kiểm tra Tích hợp Định cấu hình <argLine> $ {argLine} --my - đối số bổ sung - tại đây-- </ argLine > đã giải quyết vấn đề
Massimo Da Ros

23

Tôi đã đối mặt với một chút vấn đề khác mà trả lại cùng một lỗi.

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

Sự thật là, lỗi này được trả lại vì nhiều, nhiều lý do. Chúng tôi đã thử nghiệm các giải pháp khác nhau trên Stack Overflow, nhưng thấy tài nguyên này là tốt nhất. Nó lấy đi nhiều lý do tiềm năng khác nhau tại sao Jacoco có thể trở lại cùng một lỗi.

Đối với chúng tôi, giải pháp là thêm một tác nhân chuẩn bị vào cấu hình.

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

Tôi sẽ tưởng tượng hầu hết người dùng sẽ trải nghiệm nó vì những lý do khác nhau, vì vậy hãy xem tài nguyên nói trên!


2
Tôi nghĩ bạn đóng đinh nó. Mọi người có thể google nó để "sửa nhanh", nhưng câu trả lời đúng nhất sẽ là "Sự thật là, lỗi này được trả về vì nhiều lý do". Chỉ cần tìm ra đó là gì. Đối với tôi, đó là một phụ huynh viết đè lên <argLine> trong plugin maven-Surefire-plugin.
tuan.dinh

Điều này! Cảm ơn. Tôi đã nhận được thông báo tương tự, nhưng đó là vì plugin chắc chắn của tôi chỉ tìm kiếm các tệp có tên **/*Test.javakhi các lớp kiểm tra của tôi được đặt tên*Tests.java
Roger Worrell

Tôi có hai vấn đề: 1. Không có lớp kiểm tra nào, cần ít nhất một *Test.javalớp và một phương thức kiểm tra được chú thích @Testđể Jacoco có thể làm gì đó. 2. Trong các biến môi trường Travis cho dự án của tôi, có lỗi đánh máy SONART_TOKEN=*****, nên được đặt tên SONAR_TOKEN=*****. Xem tài liệu Travis ở đây , tìm kiếm or define SONAR_TOKEN in your Repository Settings. Sau khi tôi sửa nó, build chạy thành công. Bạn có thể xem dự án gitbhub của tôi trong câu hỏi .
Jose Quijada

15

Có thể xảy ra trường hợp một số thiết lập argline hoặc plugin khác trong pom có ​​thể ghi đè cài đặt thứ tự thực hiện jacoco.

argLine được đặt thành -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

Một trong những ví dụ

           <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>

Sau khi loại bỏ argLine khỏi các plugin này, jacoco bắt đầu hoạt động bình thường.


Giải quyết vấn đề của tôi. Điểm tuyệt vời!
dùng1974753

13

Người ta cũng có thể nhận được lỗi "Bỏ qua thực thi JaCoCo do thiếu tệp dữ liệu thực thi" do thiếu các thử nghiệm trong dự án. Ví dụ: khi bạn khởi động dự án mới và không có tệp * Test.java nào cả.


5

Những gì tdrury nói:

thay đổi cấu hình plugin của bạn thành này:

<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>

Chỉnh sửa: Chỉ cần lưu ý một điều quan trọng, DestFile và dataFile có vẻ nhạy cảm với trường hợp nên nó được coi là DestFile, không phải là Destfile.


5

Tôi biết câu hỏi này khá cũ nhưng nếu ai đó như tôi đến đây để tìm câu trả lời thì điều này có thể giúp ích. Tôi đã có thể khắc phục lỗi trên với điều này.

1) Xóa đoạn mã dưới đây khỏi plugin maven-Surefire-plugin

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

2) Thêm mục tiêu dưới đây:

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

3

Đã đến cùng một vấn đề vừa rồi.

Tôi có một lớp được đặt tên HelloWorldvà tôi đã tạo một lớp thử nghiệm cho tên HelloWorldTestsđó, sau đó tôi nhận được kết quả đầu raSkipping JaCoCo execution due to missing execution data file.

Sau đó tôi đã cố gắng thay đổi pom.xml để làm cho nó hoạt động, nhưng nỗ lực đã thất bại.

Cuối cùng, tôi chỉ cần đổi tên HelloWorldTeststhành HelloWorldTest, và nó đã hoạt động!

Vì vậy, tôi đoán rằng, theo mặc định , jacoco chỉ nhận ra lớp thử nghiệm có tên như thế XxxTest, cho biết đó là lớp thử nghiệm dành cho Xxx. Vì vậy, chỉ cần đổi tên các lớp kiểm tra của bạn thành định dạng này sẽ hoạt động!


2

Tôi đã thử tất cả các câu trả lời nhưng chỉ có sự kết hợp lời khuyên sau đây có hiệu quả với tôi. Tại sao? Tôi đã có yêu cầu rất cụ thể:

  1. JaCoCo tạo báo cáo khi bản dựng được chạy từ dòng lệnh: mvn clean verify (Maven 3.6.0)
  2. Intellij IDEA (2019.01) cũng chạy thử nghiệm của tôi
  3. Tất cả đều hoạt động với sự có mặt của một javaagentđịnh nghĩa khác trong surefireplugin

Giải pháp - trả trước argLinegiá trị trong surefirecấu hình với thuộc tính maven "thay thế muộn" @{...}như được giải thích trong surefire Câu hỏi thường gặp ( cấu hình cố định của tôi )

Làm cách nào để sử dụng các thuộc tính được thiết lập bởi các plugin khác trong argLine? Maven thay thế tài sản cho

Các giá trị $ {...} trong pom.xml trước khi bất kỳ plugin nào được chạy. Vì vậy, Surefire sẽ không bao giờ nhìn thấy những người nắm giữ vị trí trong tài sản argLine của mình. Do Phiên bản 2.17 sử dụng cú pháp thay thế cho các thuộc tính này,

@ {...} cho phép thay thế muộn các thuộc tính khi plugin được thực thi, do đó các thuộc tính đã được sửa đổi bởi các plugin khác sẽ được chọn chính xác.

Lần thử đầu tiên không thành công - xác định thuộc tính jaCoCoArgLine trong prepare-agentcấu hình mục tiêu jacoco- kịch bản không thành công yêu cầu thứ hai của tôi, IntelliJ IDEA không thể tìm ra tác nhân cho jmockit mà tôi sử dụng trong dự án để chế tạo phương thức tĩnh


Đối mặt với cùng một vấn đề khi sử dụng với JMockit và đã có thể giải quyết vấn đề với giải pháp này. tức là thêm argLine vào plugin Surefire
Karthik Rao

1

Tôi đã thêm một dự án Maven / Java với 1 lớp Miền với các tính năng sau:

  • Kiểm tra đơn vị hoặc tích hợp với các plugin Surefire và Failsafe.
  • Tìm kiếm.
  • Kiểm tra bảo hiểm thông qua Jacoco .

Kết quả Jacoco ở đâu? Sau khi thử nghiệm và chạy 'mvn sạch', bạn có thể tìm thấy kết quả trong 'target / site / jacoco / index.html'. Mở tệp này trong trình duyệt.

Thưởng thức!

Tôi đã cố gắng để giữ cho dự án đơn giản nhất có thể. Dự án đặt nhiều đề xuất từ ​​các bài đăng này cùng nhau trong một dự án ví dụ. Cảm ơn các bạn, những người đóng góp!


Tôi đã thử dự án git của bạn nhưng không rõ làm thế nào để xem báo cáo.
Nagaraj Vittal

Kết quả Jacoco ở đâu? Sau khi thử nghiệm và chạy 'mvn sạch', bạn có thể tìm thấy kết quả trong 'target / site / jacoco / index.html'. Mở tệp này trong trình duyệt.
tm1701

Bạn có thể muốn liên kết kho lưu trữ của bạn trở lại stackoverflow. Tôi đã có một thời gian khó khăn để tìm lại câu hỏi sau khi tôi tìm thấy một lỗi trong bản demo của bạn.
Wolfgang Fahl

Và vẫn không hoạt động như mong đợi :-( thư mục đích chỉ có tập hợp.exec vì nó là nội dung khi thực hiện cài đặt sạch mvn ...
Wolfgang Fahl

1

Tôi vật lộn trong nhiều ngày. Tôi đã thử tất cả các cấu hình khác nhau được đề xuất trong chủ đề này. Không ai trong số họ làm việc. Cuối cùng, tôi chỉ tìm thấy cấu hình quan trọng là mục tiêu của tác nhân chuẩn bị . Nhưng bạn phải đặt nó trong giai đoạn đúng. Tôi đã thấy rất nhiều ví dụ đưa nó vào " thử nghiệm trước tích hợp ", đó là một sai lầm, vì nó sẽ chỉ được thực hiện sau khi thử nghiệm đơn vị. Vì vậy, bài kiểm tra đơn vị sẽ không được công cụ.

Cấu hình đúng chỉ nên sử dụng pha mặc định, (không chỉ định rõ ràng pha). Và thông thường, bạn không cần phải tập trung vào plugin maven-Surefire-plugin .

  <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>

0

Việc thực thi nói rằng việc đưa dữ liệu jacoco vào /Users/davea/Dropbox/workspace/myproject/target/jacoco.exec nhưng cấu hình maven của bạn đang tìm kiếm dữ liệu theo $ {Dựair} / target / cover-báo cáo / jacoco-unit. thực hiện.


1
Đúng vậy, tại sao plugin lại bỏ qua những gì tôi chỉ định trong cấu hình?
Dave

hãy thử chuyển cấu hình Destfile của bạn sang cấu hình thực thi tác nhân chuẩn bị. Không phải tất cả các plugin maven đều xử lý kế thừa cấu hình.
tdrury

0

Phản hồi của tôi rất muộn nhưng đối với người dùng khác Trong trường hợp của bạn, bạn phải định cấu hình cắm không an toàn để sử dụng cấu hình tác nhân dòng lệnh được lưu trong biến itCoverageAgent. Ví dụ như

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

Trong cấu hình maven của bạn, jacoco chuẩn bị các đối số dòng lệnh trong giai đoạn chuẩn bị tác nhân, nhưng plugin failafe không sử dụng nó nên không có tệp dữ liệu thực thi.


0

Thử sử dụng:

mvn jacoco:report -debug

để xem chi tiết về quy trình báo cáo của bạn.

Tôi đã cấu hình jacoco của mình như thế này:

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

Sau đó mvn jacoco:report -debughiển thị nó bằng cách sử dụng cấu hình mặc định, có nghĩa jacoco.execlà không có trong ~/jacoco.exec. Lỗi nóimissing execution data file .

Vì vậy, chỉ cần sử dụng cấu hình mặc định:

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

Và mọi thứ hoạt động tốt.


0

Đôi khi việc thực thi chạy lần đầu tiên và khi chúng tôi thực hiện cài đặt sạch, nó sẽ không tạo ra sau đó. Vấn đề là sử dụng true cho SkipMain và bỏ qua các thuộc tính trong maven-Trình biên dịch-plugin của tệp pom chính. Xóa chúng nếu chúng được giới thiệu như một phần của bất kỳ vấn đề hoặc đề xuất nào.


0

Trong trường hợp của tôi, tác nhân chuẩn bị có destFilecấu hình khác, nhưng theo đó, báo cáo phải được cấu hình bằng một dataFile, nhưng cấu hình này bị thiếu. Khi dataFileđã được thêm vào, nó bắt đầu hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.