2013-03-06 39 views
15

This sonar page cơ bản liệt kê các phương pháp khác nhau được sử dụng bởi các công cụ phân tích mã số bảo hiểm khác nhau:Sự khác biệt giữa ba phương pháp phân tích độ bao phủ mã là gì?

  1. Source code thiết bị đo đạc (Được sử dụng bởi Clover)
  2. offline mã byte thiết bị đo đạc (Được sử dụng bởi Cobertura)
  3. Thiết bị mã byte trực tuyến (Được sử dụng bởi Jacoco)

Ba phương pháp này và phương pháp nào hiệu quả nhất và tại sao? Nếu câu trả lời cho câu hỏi về hiệu quả là "nó phụ thuộc", thì hãy giải thích tại sao?

Trả lời

12

Công cụ mã nguồn bao gồm việc thêm hướng dẫn vào mã nguồn trước khi biên dịch. Các hướng dẫn này được sử dụng để theo dõi các phần nào của các mã đã được thực hiện.

Công cụ mã byte ngoại tuyến bao gồm thêm các hướng dẫn tương tự, nhưng sau khi biên dịch, trực tiếp vào mã byte.

Thiết bị mã byte trực tuyến bao gồm việc thêm cùng các hướng dẫn đó vào mã byte, nhưng tự động, khi chạy, khi mã byte được nạp bởi JVM.

This page có so sánh giữa các phương pháp. Nó có thể là thiên vị, vì nó là một phần của tài liệu Clover.

Tùy thuộc vào định nghĩa của bạn về "hiệu quả", chọn tùy chọn bạn thích nhất. Tôi không nghĩ rằng bạn sẽ nhận được sự khác biệt rất lớn. Họ đều làm công việc, và bức tranh lớn sẽ giống như bất cứ phương pháp nào được sử dụng.

+0

Tôi nghĩ bạn muốn có liên kết đến tài liệu Clover? – sharakan

+0

Có. Tôi quên thêm liên kết. Xong ngay. Cảm ơn bạn đã tìm hiểu vấn đề. –

+1

Hiện tại cobertura hỗ trợ cả Java 7 và Java 8 –

3

Nói chung ảnh hưởng đến mức độ phù hợp là như nhau.

Công cụ mã nguồn có thể cung cấp kết quả báo cáo cao cấp, đơn giản vì thiết bị mã byte không thể phân biệt bất kỳ cấu trúc nào trong các dòng nguồn, vì độ chi tiết khối mã chỉ được ghi lại theo dòng nguồn.

Hãy tưởng tượng tôi có hai câu lệnh lồng nhau (hoặc tương đương, nếu (a & & b) ... *) trong một dòng. Một mã nguồn instrumenter có thể nhìn thấy chúng, và cung cấp thông tin bảo hiểm cho nhiều nhánh trong if, bên trong dòng nguồn; nó có thể báo cáo các khối dựa trên các dòng và cột. Một mã byte instrumenter chỉ thấy một dòng bọc quanh các điều kiện. Liệu nó báo cáo dòng là "được bảo hiểm" nếu điều kiện thực hiện, nhưng là sai?

Bạn có thể cho rằng đây là một trường hợp hiếm hoi (và có thể là) và do đó không hữu ích. Khi bạn nhận được bảo hiểm không có thật về nó theo sau là một trường thất bại, bạn có thể thay đổi suy nghĩ của bạn về tiện ích.

Có một số nice example and explanation of how byte code coverage makes getting coverage of switch statements right, vô cùng khó khăn.

Một mã nguồn instrumenter cũng có thể đạt được thực hiện kiểm tra nhanh hơn, bởi vì nó có trình biên dịch giúp tối ưu hóa mã được thiết kế. Đặc biệt, một đầu dò được chèn vào bên trong một vòng lặp bởi một công cụ nhị phân có thể được biên dịch bên trong vòng lặp bởi một trình biên dịch JIT.Một trình biên dịch Java tốt sẽ thấy thiết bị tạo ra một kết quả bất biến vòng lặp và nâng thiết bị ra khỏi vòng lặp. (Một trình biên dịch JIT cũng có thể làm điều này, câu hỏi đặt ra là liệu chúng có thực sự làm như vậy) hay không.

+0

Thực ra, lý do mà các công cụ như Cobertura và JaCoCo không hiển thị thông tin bảo hiểm nội dòng đơn giản là các nhà phát triển đã chọn không triển khai nó. Trong công cụ cụ thể bytecode on-the-fly của tôi (JMockit Coverage), * này được * thực hiện và phân đoạn dòng riêng biệt (chẳng hạn như trong "' if (a && b) '") * được * hiển thị như vậy trong báo cáo bảo hiểm . –

+0

Đó là cách tất cả các công cụ là: "các nhà phát triển đã chọn không thực hiện (một số tính năng)". Tốt là bạn có nhiều sự nhiệt tình hơn. Làm thế nào để bạn phân biệt các phần của dòng? Tôi không nghĩ rằng các tập tin lớp học đã cung cấp thông tin tại bất kỳ chi tiết tốt hơn. –

+0

Ở cấp độ mã byte, hướng dẫn nhảy là cơ sở để tách nhiều phân đoạn thực thi trong một dòng mã. Mỗi lệnh nhảy có hướng dẫn đích, có thể hoặc không thể nằm trong cùng một dòng; thông tin này được cung cấp bởi thư viện ASM được sử dụng cho thao tác bytecode. Đối với mỗi dòng mã, danh sách các lệnh nhảy và mục tiêu của chúng được lưu giữ và có sẵn cho trình tạo báo cáo HTML sau đó phân tích từng dòng mã * nguồn * trong khi khớp các nhánh bytecode với các đoạn đường riêng lẻ. –

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