2011-01-17 26 views
12

Tôi có thiết lập Maven đa mô-đun với mã Java.Làm thế nào để tôi có được Emma hoặc Cobertura, với Maven, để báo cáo mức độ phù hợp về mã nguồn trong các mô-đun khác?

Thử nghiệm đơn vị của tôi, trong một trong các mô-đun, mã tập thể dục trong nhiều mô-đun. Đương nhiên, các mô-đun có phụ thuộc lẫn nhau, và mã trong tất cả các mô-đun có liên quan được biên dịch khi cần thiết trước khi thực hiện kiểm tra.

Vì vậy: Làm thế nào tôi có thể nhận được báo cáo về phạm vi phủ sóng của toàn bộ bộ mã?


Lưu ý: Tôi không hỏi cách kết hợp kết quả bảo hiểm cho thử nghiệm trong nhiều mô-đun. Tôi hỏi làm thế nào để có được bảo hiểm cho các bài kiểm tra trong một mô-đun duy nhất bằng cách sử dụng mã nhạc cụ từ nhiều mô-đun. Bất kỳ ai quan tâm đến trước đây đều có thể tham khảo theseotherquestions và các đề xuất của Crowne cho Maven DashboardSonar.

Tôi đã thành công trong việc nhận được báo cáo bảo hiểm đầy đủ using pure Ant. [EDIT:] Tôi thiết kế tất cả các lọ từ thư mục phát triển thời gian chạy vào một thư mục tạm thời; prepended thư mục tạm thời cho classpath; sau đó chạy thử nghiệm từ Ant với thử nghiệm hàng loạt.

Ant có thể chạy từ Maven, nhưng thách thức ở đây là tích hợp liền mạch (tức là, tự động nạp tất cả các phần tử classpath và sourcepath từ Maven vào Ant), đó là lý do tôi không sử dụng các tiện ích của Maven cho mục đích này.

Ngoài ra còn có otherquestions về thử nghiệm tích hợp. Tuy nhiên, theo mặc định, báo cáo của từng dự án theo mặc định chỉ báo cáo mức độ phù hợp trên mã trong dự án giống như, trong khi thử nghiệm của tôi thực hiện mã trong nhiều dự án.

Điều này article in Spanish có thể có liên quan. Đây là một số khác là Seam-specific article.


Trả lời

6

recent blog post by Thomas Sundberg này chứa một phương pháp mà một phần giải quyết vấn đề này bằng cách sử dụng kiến ​​cho các cuộc gọi Cobertura, thay vì sử dụng các plugin maven Cobertura.

Nó dựa trên phương pháp sau đây cơ bản với các tập tin pom.xml và build.xml chuyên ngành:

Bắt đầu với một maven điển hình biên dịch trên pom phụ huynh, mà sẽ biên dịch tất cả các lớp trong các module con.

mvn clean compile # maven-compile-plugin called for compiling 

Sau đó, công cụ tất cả các lớp mô-đun:

ant instrument # cobertura called for instrumentation 

Sau đó gọi maven-surefire-plugin gọi là để thử nghiệm bằng cách sử dụng các lớp học instrumented, với Cobertura như một sự phụ thuộc kiểm tra

mvn test 

Sau đó, sử dụng cuộc gọi báo cáo tùy chỉnh để lấy tất cả kết quả từ các mô-đun khác nhau:

ant report # cobertura called for reporting 

Các yếu tố chính của tệp ant build.xml là để cụ thể tất cả các mô-đun riêng biệt và sau đó báo cáo về tất cả các mô-đun sau khi hợp nhất các kết quả. Chức năng này cần phải được gọi cho mỗi mô-đun trong ví dụ của mình:

<target name="instrumentAModule"> 
    <property name="classes.dir" value="target/classes"/> 
    <cobertura-instrument todir="./${module}/${classes.dir}"> 
     <fileset dir="./${module}/target/classes"> 
      <include name="**/*.class"/> 
     </fileset> 
    </cobertura-instrument> 
</target> 

Sau đó, sau khi kiểm tra xong, giai đoạn báo cáo đầu tiên kết hợp tất cả các kết quả từ tất cả các thư mục khác nhau được sáp nhập vào một tập tin .ser mới (gọi tắt là sum.ser trong ví dụ của mình)

<target name="report" depends="merge"> 
    <property name="src.dir" value="src/main/java/"/> 
    <cobertura-report datafile="sum.ser" 
         format="html" 
         destdir="./target/report"> 
     <!-- Add all modules that should be included below --> 
     <!-- fileset dir="./MODULE_NAME_TO_REPLACE/${src.dir}"/ --> 
     <fileset dir="./product/${src.dir}"/> 
    </cobertura-report> 
</target> 

<target name="merge"> 
    <cobertura-merge datafile="sum.ser"> 
     <fileset dir="."> 
      <include name="**/cobertura.ser"/> 
     </fileset> 
    </cobertura-merge> 
</target> 

có thể để tích hợp các thành phần kiến ​​vào maven sử dụng plugin antrun, nhưng tôi không đủ quen thuộc với các giai đoạn/vòng đời để biết được nơi để đặt các cuộc gọi khác nhau.

Điều này rất hữu ích đối với tôi, khi tôi viết các lớp thử nghiệm trừu tượng trong các mô-đun api của mình và sau đó cung cấp cho chúng triển khai trong các mô-đun lib của tôi. Cho đến nay cả cobertura và emma đều không thể xử lý thiết kế này nên độ bao phủ mã của tôi thường là 0 hoặc bằng các chữ số đơn.

0

Tôi nghi ngờ liệu điều này có thể thực hiện được do thông tin bảo hiểm thu được bởi cobertura/emma bằng cách thiết lập các lớp đã biên dịch hay không. Trong khi điều này sẽ làm việc cho các lớp trong dự án được chỉ định, nó là nghi ngờ nếu những công cụ này sẽ cụ các thư viện phụ thuộc.

Nhìn vào maven cobertura plugin usage cũng dường như không biểu thị bất kỳ khả năng nào như vậy.

+1

Tất cả các mô-đun của tôi đều nằm trong tầm kiểm soát của tôi. Tất cả đều được biên soạn và thiết bị, dựa trên cây phụ thuộc, khi tôi chạy Maven và công cụ phủ sóng. –

+0

@Joshua Fox. Tôi đoán bạn cần phải kiểm tra với các nhà phát triển cobertura hoặc nhìn vào nguồn cobertura. – Raghuram

0

Tôi thấy điều này khá đơn giản (mặc dù tôi đã làm nó một thời gian trước đây, và có thể gỉ với các chi tiết ...

dự án cốt lõi của tôi chứa tất cả các mô-đun. Tôi sử dụng Cobertura để đo vùng phủ sóng thử nghiệm của tôi. Tôi là sử dụng Hudson như một công cụ tích hợp liên tục, và có các plugin Cobertura cho Hudson.

Nó đã làm việc một điều trị trong một thời gian bây giờ.

Good Luck!

2

Nói chung, các báo cáo liên quan đến mô-đun cụ thể của họ, tuy nhiên chúng có thể được tổng hợp,
hai phương pháp là:

tôi sẽ khuyên bạn nên thử sử dụng sonar để thực hiện báo cáo tổng hợp cho bạn.

Xem phiên bản công khai "nemo" của chúng tôi để xem khả năng ấn tượng được cung cấp.

+2

Cảm ơn bạn. Tuy nhiên, tôi không hỏi làm thế nào để kết hợp các kết quả bảo hiểm cho các bài kiểm tra trong nhiều mô-đun. Thay vào đó, tôi hỏi làm thế nào để có được bảo hiểm cho các bài kiểm tra trong một mô-đun duy nhất bằng cách sử dụng mã nhạc cụ từ nhiều mô-đun. –

4

Không bao giờ cố gắng, nhưng điều này có thể là một cách để thực hiện điều đó:

  • Trong mỗi mô-đun, ngay trước khi cài đặt giai đoạn, chúng ta hãy cụ Cobertura các tập tin jar và cài đặt các tập tin jar instrumented (!) vào kho lưu trữ Maven cục bộ
  • Trong mô-đun thử nghiệm, Maven sẽ sử dụng các phụ thuộc giả tạo từ kho lưu trữ Maven cục bộ để chạy các thử nghiệm. Các lớp được thiết kế này giờ đây sẽ xuất hiện trong tệp dữ liệu, ví dụ: cobertura.ser
  • Chạy tạo báo cáo cobertura như bình thường từ bên trong mô-đun thử nghiệm của dự án của bạn, ví dụ: mvn site

Xem cobertura tài liệu hướng dẫn về cách tự gọi Cobertura để cụ tập tin JAR bên ngoài tại chỗ:

... Bạn cũng có thể vượt qua trong file jar được instrumented sử dụng filesets kiến ​​tiêu chuẩn. Cobertura sẽ trích xuất từng lớp từ lọ và đặt nó. Nếu 'todir' không quy định rõ thì jar gốc sẽ được ghi đè bằng một phiên bản instrumented ...

Các pom.xml 's xây dựng bổ sung có thể trông như thế này - bạn có thể muốn thêm một hồ sơ cá nhân hoặc sử dụng phân loại để phân biệt giữa tệp jar cuối cùng và tệp jar cụ thể nếu bạn không muốn ghi đè lên chúng trong repo cục bộ của bạn. Sau đó, trong mô-đun kiểm tra, bạn chỉ cần xác định các phụ thuộc vào các mô-đun khác của bạn bằng cách sử dụng các bộ phân loại.

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>cobertura-inplace-instrumentation</id> 
        <phase>package</phase> 
        <configuration> 
         <tasks> 
          <taskdef classpathref="maven.plugin.classpath" resource="tasks.properties" /> 
          <cobertura-instrument 
           datafile="${project.build.directory}/cobertura-nop.ser"> 
           <fileset dir="${project.build.directory}"> 
            <include name="${project.build.finalName}.${project.packaging}" /> 
           </fileset> 
          </cobertura-instrument> 
         </tasks> 
        </configuration> 
        <goals> 
         <goal>run</goal> 
        </goals> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>net.sourceforge.cobertura</groupId> 
        <artifactId>cobertura</artifactId> 
        <version>1.9.4.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 
Các vấn đề liên quan