2015-07-15 13 views
5

Tôi đang cố gắng tạo dữ liệu phủ sóng mã kiểm tra đơn vị cho sonar cho dự án maven đa mô-đun và không nhận được kết quả chính xác.Không thể lấy sonar để xử lý các tệp thực thi jacoco cho dự án maven đa mô-đun

Cấu trúc dự án là tương tự như sau:

  • dự án
    • parentPom
    • moduleA
    • moduleB
      • mô-đun B1
      • mô-đun B2
    • mô-đun C

Tôi đang sử dụng maven jacoco cắm để tạo jacoco.exec tập tin, và các maven sonar cắm để phân tích mã (bao gồm cả jacoco.exec tập tin).

Những tập tin được tạo ra trong giai đoạn process-tests, như sau:

<properties> 
    <jacoco.report.path>${project.build.directory}/jacoco.exec</jacoco.report.path> 
    <sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath> 
</properties> 

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.4.201502262128</version> 
    <executions> 
    <execution> 
     <id>default-prepare-agent</id> 
     <phase>process-test-classes</phase> 
     <goals> 
     <goal>prepare-agent</goal> 
     </goals> 
     <configuration> 
     <destFile>${jacoco.report.path}</destFile> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Khi tôi chạy mvn clean install tôi có thể thấy rằng có một tập tin jacoco.exec tạo ra cho mỗi mô-đun:

$ find . -name '*.exec' 
./moduleA/target/jacoco.exec 
./moduleB/moduleB1/target/jacoco.exec 
./moduleB/moduleB2/target/jacoco.exec 
./moduleC/target/jacoco.exec 

Khi tôi chạy mvn sonar: sonar Tôi thấy rằng cảm biến Jacoco chạy cho tất cả các mô-đun, nhưng dường như chỉ hoạt động với mô-đun đầu tiên. module tiếp theo hiển thị Coverage information was not collected:

[INFO] [17:13:58.333] Sensor JaCoCoSensor 
[INFO] [17:13:58.350] Analysing moduleA\target\jacoco.exec 
[INFO] [17:13:58.374] No information about coverage per test. 
[INFO] [17:13:58.374] Sensor JaCoCoSensor (done) | time=41ms 
... 
[INFO] [17:14:02.202] Sensor JaCoCoSensor 
[INFO] [17:14:02.261] Analysing moduleB\moduleB1\target\jacoco.exec 
[WARN] [17:14:02.334] Coverage information was not collected. Perhaps you forget to include debug information into compiled classes? 
[INFO] [17:14:02.334] Sensor JaCoCoSensor (done) | time=132ms 
... 

Tôi không chắc chắn lý do tại sao không có thông tin bảo hiểm trong các mô-đun thứ hai và tiếp theo, kể từ maven-compiler-plugin bao gồm thông tin debug theo mặc định, và để được an toàn Tôi cũng chạy mvn clean install -Dmaven.compiler.debug=true nhưng có kết quả tương tự .

Kết quả là, khi tôi kiểm tra dự án trong máy chủ sonar, nó cho thấy phạm vi mã chỉ dành cho mô-đun đầu tiên: moduleA. Không có thông tin về phạm vi mã cho các mô-đun khác. Rõ ràng giải pháp ở đây là để tạo ra chỉ một tập tin jacoco.exec duy nhất, để khi jacoco-maven-plugin thực hiện nó nối kết quả cho mỗi mô-đun vào tập tin đó, để sonar có thể làm việc ma thuật của nó một cách chính xác.

Theo đó, tôi sửa đổi tập tin parentPom/pom.xml của tôi như sau:

<properties> 
    <!-- single jacoco.exec file relative to root directory of the project --> 
    <jacoco.report.path>${session.executionRootDirectory}/code-coverage/jacoco.exec</jacoco.report.path> 
    <sonar.jacoco.reportPath>${jacoco.report.path}</sonar.jacoco.reportPath> 
</properties> 

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.4.201502262128</version> 
    <executions> 
    <execution> 
     <id>default-prepare-agent</id> 
     <phase>process-test-classes</phase> 
     <goals> 
     <goal>prepare-agent</goal> 
     </goals> 
     <configuration> 
     <destFile>${jacoco.report.path}</destFile> 
     <append>true</append> <!-- now appending to single jacoco.exec file --> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Điều này có nghĩa rằng sau khi kiểm tra đơn vị đã chạy, các đại lý jacaco được gọi Bây giờ khi tôi chạy mvn clean install tôi chỉ nhìn thấy một jacoco.exec file:

$ find . -name '*.exec' 
./code-coverage/target/jacoco.exec 

Nhưng khi tôi chạy mvn sonar: sonar các JaCoCoSe nsor dường như không được gọi và dự án trên máy chủ sonar không có bảo hiểm mã nào cả.

Tôi đang làm gì sai ở đây? Làm thế nào để có được sonar để phân tích bảo hiểm mã cho tất cả các mô-đun trong dự án maven của tôi?

Tôi có cần sửa đổi maven-surefire-plugin theo một cách nào đó không?

Tôi đang sử dụng SonarQube 5.1, JDK 1.8, jacoco-maven-plugin cảm biến 0.7.4.201502262128

Trả lời

1

JaCoCo sẽ chỉ bảo hiểm tải cho các lớp bạn đề cập trong mô-đun của bạn. Điều này có nghĩa là nếu vì lý do nào đó mà jacoco.exec trong mô-đun B của bạn không chứa thông tin bảo hiểm về các tệp .class của mô-đun này thì nó sẽ không tải bất kỳ phạm vi nào (ngay cả khi bạn đã bao phủ các lớp trong mô-đun khác) .

Các vấn đề liên quan