2011-10-12 85 views
9

Tôi đang sử dụng sóng âm để đo lường chất lượng mã. Một điều mà tôi không biết là các bước để đo lường phạm vi mã bằng Cobertura.SONAR - Phạm vi mã đo lường bằng Cobertura

Tôi đã làm theo các bước từ http://cobertura.sourceforge.net/anttaskreference.html và có thể tạo tệp xml. Làm cách nào để tải các tệp xml này vào SONAR?

Có cách nào dễ dàng hơn để sử dụng Cobertura trong SONAR không?

Tôi đang chạy phạm vi mã (Cobertura) trong một máy chủ khác với máy chủ SONAR của tôi. Cả hai máy chủ đều chạy dưới LINUX.

Cảm ơn sự giúp đỡ!

+0

Cập nhật về chủ đề này: ví dụ có thể được tìm thấy trên kho lưu trữ hình ảnh sonar của chúng tôi => https://github.com/SonarSource/sonar-examples/tree/master/projects/code-coverage –

Trả lời

11

Bạn cấu hình các nhiệm vụ Sonar để tải lên báo cáo thử nghiệm đơn vị và Cobertura được tạo ra bởi các bộ phận khác của xây dựng logic của bạn.

Điều này trái ngược với Maven có vòng đời xây dựng chuẩn mà Sonar có thể tận dụng.

Kiểm tra đơn vị và mã bảo hiểm

Logic sau chạy các kiểm tra đơn vị với các lớp được thiết bị cobertura.Một báo cáo bảo hiểm XML được tạo ra bởi Cobertura ở cuối:

<target name="instrument-classes" depends="compile-tests"> 
    <taskdef resource="tasks.properties" classpathref="test.path"/> 
    <cobertura-instrument todir="${instrumented.classes.dir}" datafile="${build.dir}/cobertura.ser"> 
     <fileset dir="${classes.dir}"/> 
    </cobertura-instrument> 
</target> 

<target name="junit" depends="instrument-classes"> 
    <junit printsummary="yes" haltonfailure="yes"> 
     <classpath> 
      <path refid="test.path"/> 
      <pathelement path="${instrumented.classes.dir}"/> 
      <pathelement path="${test.classes.dir}"/> 
     </classpath> 

     <formatter type="xml"/> 

     <batchtest fork="yes" todir="${test.reports.dir}"> 
      <fileset dir="${test.src.dir}"> 
       <include name="**/*Test*.java"/> 
       <exclude name="**/AllTests.java"/> 
      </fileset> 
     </batchtest> 
    </junit> 
</target> 

<target name="test" depends="junit"> 
    <cobertura-report format="xml" datafile="${build.dir}/cobertura.ser" destdir="${cobertura.reports.dir}"/> 
</target> 

Gọi Sonar

Tôi thường sử dụng một mục tiêu Sonar rất đơn giản:

<target name="sonar" depends="test"> 
    <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml" classpathref="sonar.path"/> 

    <sonar:sonar key="${sonar.project.key}" version="${sonar.project.version}" xmlns:sonar="antlib:org.sonar.ant"/> 
</target> 

Và sử dụng một thuộc tính tập tin để kiểm soát tất cả các khía cạnh hành vi của Sonar:

sonar.project.key=org.demo:demo 
sonar.project.version=1.0-SNAPSHOT 
sonar.projectName=Demo project 

sonar.host.url=http://myserver:9000 
sonar.jdbc.url=jdbc:mysql://myserver:3306/sonar?useUnicode=true&characterEncoding=utf8 
sonar.jdbc.driverClassName=com.mysql.jdbc.Driver 
sonar.jdbc.username=sonar 
sonar.jdbc.password=sonar 

sonar.sources=${src.dir} 
sonar.tests=${test.src.dir} 
sonar.binaries=${classes.dir} 

sonar.dynamicAnalysis=reuseReports 
sonar.surefire.reportsPath=${test.reports.dir} 
sonar.java.coveragePlugin=cobertura 
sonar.cobertura.reportsPath=${cobertura.reports.dir}/coverage.xml 

Chứng minh cách Sonar có thể được định cấu hình nhận các báo cáo thử nghiệm đơn vị được tạo bởi junit và báo cáo phạm vi mã được tạo bởi cobertura.

Bản dựng không phải chạy trên cùng một máy chủ với Sonar. Trong trường hợp đó, người ta phải cung cấp thông tin đăng nhập của Sonar URL và JDBC từ xa.

+0

Tôi đã cố gắng làm theo chỉ dẫn của bạn; tuy nhiên, tôi vẫn có cùng một vấn đề như trước đây, tôi không thể thấy số liệu thống kê bảo hiểm bên trong SONAR. Các tệp xml và ser được tạo tương tự với những gì tôi đã có trước đó. Bạn có thể giúp tôi lấy số liệu thống kê trong các tác phẩm SONAR không? – lwijono

+0

Đầu ra của tác vụ Sonar có hiển thị rằng bạn đang tải đúng tập tin bảo hiểm không? –

+0

Tôi làm cách nào để kiểm tra điều này? – lwijono

2

Bạn sẽ phải thêm các thuộc tính để Sonar của pom.xml:

<properties> 
    <sonar.dynamicAnalysis>false</sonar.dynamicAnalysis> 
    <sonar.phase>generate-sources</sonar.phase> 
    <sonar.surefire.reportsPath>target/reports/test/</sonar.surefire.reportsPath> 
    <sonar.cobertura.reportPath>../project/target/reports/coverage/coverage.xml</sonar.cobertura.reportPath> 
</properties> 

(với những con đường phù hợp với môi trường của bạn)

Và chạy:

mvn sonar:sonar 

Kiểm tra user list để biết thêm chi tiết .

+0

Điều gì xảy ra nếu dự án của tôi không sử dụng Maven? Tôi vẫn cần phải chạy nó? Từ trang web Cobertura, có vẻ như chúng tôi cũng có thể sử dụng ANT. Liệu tôi có sai? Ngay bây giờ, tôi bối rối với mối quan hệ giữa sonar - maven - Cobertura. Hãy nói rằng tôi gọi một xây dựng từ hudson bằng cách gọi kiến ​​sẽ chạy kịch bản xây dựng của tôi. Xây dựng kịch bản của tôi sẽ làm một xây dựng và cũng cập nhật SONAR DB. Hơn nữa, ban đầu, tôi nghĩ rằng tôi chỉ cần thêm một số lệnh trong kịch bản xây dựng của tôi sẽ chạy Coberture. Bây giờ tôi không chắc chắn. Làm thế nào tôi nên gọi Coberture với maven trong trường hợp của tôi? Giải pháp khác cũng được hoan nghênh? Cảm ơn sự giúp đỡ của bạn. – lwijono

+0

Sonar được ghép với Maven cho đến gần đây. Kể từ 2.6 (tháng 3 năm 2011), 'Sonar' cũng hỗ trợ ANT. Bạn có thể thêm các thuộc tính ở trên vào kịch bản kiến ​​như được hiển thị [ở đây] (http://docs.codehaus.org/display/SONAR/Analyse+with+Ant+Task+1.0), ví dụ: ''. Tôi đã không chạy Sonar + Cobertura + Ant Á hậu, nhưng nó không phải là bất kỳ khác nhau. Ngoài ra, bạn có thể kiểm tra một Sonar Stand Alone (không có ANT, Maven, vv) [runner] (http://docs.codehaus.org/display/SONAR/Analyse+with+a+simple+Java+Runner) – tolitius

1

nếu bạn đang sử dụng Maven, thì bạn không có bất kỳ điều gì đặc biệt để chỉ định trong tệp POM của bạn. Chỉ cần chạy "mvn clean sonar: sonar" và Sonar sẽ tự động biên dịch mã của bạn, chạy thử nghiệm của bạn với Cobertura (đó là công cụ bảo hiểm mặc định trong Sonar) và đẩy tất cả các kết quả trong DB.

Tương tự nếu bạn đang sử dụng Ant [1] hoặc trình đơn java runner [2] thay vì Maven.

Tôi nhấn mạnh vào thực tế là bạn không phải tự chạy Cobertura (với nhiệm vụ Ant chẳng hạn) trước đó để chạy Sonar.

[1] http://docs.codehaus.org/display/SONAR/Analyzing+with+Sonar+Ant+Task

[2] http://docs.codehaus.org/display/SONAR/Analyse+with+a+simple+Java+Runner

Fabrice, SonarSource

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