Mã bảo hiểm là gì và làm thế nào để bạn đo lường nó?


275

Mã bảo hiểm là gì và làm thế nào để bạn đo lường nó?

Tôi đã được hỏi câu hỏi này liên quan đến bảo hiểm mã thử nghiệm tự động hóa của chúng tôi. Dường như, bên ngoài các công cụ tự động, nó còn nghệ thuật hơn khoa học. Có bất kỳ ví dụ thực tế nào về cách sử dụng bảo hiểm mã không?

Câu trả lời:


241

Phạm vi mã là một phép đo xem có bao nhiêu dòng / khối / cung của mã của bạn được thực thi trong khi các kiểm tra tự động đang chạy.

Phạm vi bảo hiểm được thu thập bằng cách sử dụng một công cụ chuyên dụng để tạo các nhị phân để thêm các cuộc gọi truy tìm và chạy một bộ đầy đủ các thử nghiệm tự động đối với sản phẩm được đo. Một công cụ tốt sẽ cung cấp cho bạn không chỉ tỷ lệ phần trăm của mã được thực thi mà còn cho phép bạn truy sâu vào dữ liệu và xem chính xác dòng mã nào đã được thực thi trong một thử nghiệm cụ thể.

Nhóm của chúng tôi sử dụng Magellan - một bộ công cụ bao trùm mã nội bộ. Nếu bạn là một cửa hàng .NET, Visual Studio có các công cụ tích hợp để thu thập phạm vi bảo hiểm mã. Bạn cũng có thể cuộn một số công cụ tùy chỉnh, như bài viết này mô tả.

Nếu bạn là một cửa hàng C ++, Intel có một số công cụ chạy cho Windows và Linux, mặc dù tôi chưa sử dụng chúng. Tôi cũng đã nghe nói có công cụ gSc cho GCC, nhưng tôi không biết gì về nó và không thể cung cấp cho bạn một liên kết.

Về cách chúng tôi sử dụng nó - phạm vi bảo hiểm mã là một trong những tiêu chí thoát của chúng tôi cho mỗi cột mốc. Chúng tôi thực sự có ba số liệu bảo hiểm mã - phạm vi bảo hiểm từ các thử nghiệm đơn vị (từ nhóm phát triển), thử nghiệm kịch bản (từ nhóm thử nghiệm) và phạm vi bảo hiểm kết hợp.

BTW, trong khi phạm vi bảo hiểm mã là một thước đo tốt về số lượng thử nghiệm bạn đang thực hiện, nó không nhất thiết là một thước đo tốt về mức độ bạn đang thử nghiệm sản phẩm của mình. Có các số liệu khác bạn nên sử dụng cùng với phạm vi bảo hiểm mã để đảm bảo chất lượng.


40
"Có các số liệu khác bạn nên sử dụng cùng với phạm vi bảo hiểm mã để đảm bảo chất lượng." Bạn có thể nói những số liệu khác là gì?
Đội quân

Bạn cũng có thể sử dụng Testwell CTC ++ , đây là một công cụ bao phủ mã khá hoàn chỉnh cho C, C ++, C # và Java
B_PRIEUR

1
@Abdul Khi bạn đo độ bao phủ mã, bạn nên chạy cả hai loại thử nghiệm và đo độ bao phủ mã cho chúng một cách riêng biệt. Đối với "vòng cung mã" - đó là các nhánh thực thi mã, như if / then.
Franci Penov

1
@Maverick hầu hết mọi người đều cho rằng thử nghiệm đơn vị khi họ nói về phạm vi bảo hiểm mã, tuy nhiên tại Microsoft, chúng tôi đã đo độ bao phủ mã từ cả thử nghiệm đơn vị và thử nghiệm tích hợp.
Franci Penov

1
@darth_coder không có gì nói chung. Ứng dụng cũng sẽ không được tự động sử dụng và nếu không có gì thu thập dữ liệu thiết bị, sự hiện diện của ứng dụng mới là không liên quan. Trường hợp duy nhất có thể ảnh hưởng đến mọi thứ là nếu ứng dụng chạy cùng lúc với các kiểm tra tự động đang chạy và khiến mã hệ điều hành được chạy trong cùng quy trình như tự động kiểm tra, do đó có khả năng hiển thị một số mã HĐH đang chạy không bị xúc động bởi các bài kiểm tra.
Franci Penov

189

Bảo hiểm mã về cơ bản kiểm tra xem bao nhiêu mã của bạn được bảo hiểm trong các thử nghiệm. Vì vậy, nếu bạn có phạm vi bảo hiểm mã 90% thì có nghĩa là có 10% mã không được bảo hiểm trong các thử nghiệm. Tôi biết bạn có thể nghĩ rằng 90% mã được bao phủ nhưng bạn phải nhìn từ một góc độ khác. Điều gì đang ngăn bạn nhận được bảo hiểm mã 100%?

Một ví dụ tốt sẽ là:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Bây giờ, trong đoạn mã trên có hai đường dẫn / nhánh. Nếu bạn luôn nhấn vào nhánh "CÓ" thì bạn sẽ không bao gồm phần khác và nó sẽ được hiển thị trong kết quả Bảo hiểm Mã. Điều này là tốt bởi vì bây giờ bạn biết rằng những gì không được bảo hiểm và bạn có thể viết một bài kiểm tra để bao gồm các phần khác. Nếu không có bảo hiểm mã thì bạn chỉ đang ngồi trên một quả bom hẹn giờ để phát nổ.

NCover là một công cụ tốt để đo lường phạm vi bảo hiểm.


5
Câu trả lời tốt nhất, gần 10 năm trước! Chỉ trích! :)
Nikos

4
Câu trả lời đơn giản và có ý nghĩa :)
Parveen

Đúng. Người duy nhất có ý nghĩa. Mặc dù tôi thậm chí không buồn tiếp tục cuộn xuống. Đây là nơi tôi dừng lại. Đánh dấu trang.
TheRealChx101

64

Chỉ cần nhớ rằng, có "phạm vi bao phủ 100% mã" không có nghĩa là mọi thứ đều được kiểm tra hoàn toàn - trong khi điều đó có nghĩa là mọi dòng mã đều được kiểm tra, điều đó không có nghĩa là chúng được kiểm tra trong mọi tình huống (phổ biến) ..

Tôi sẽ sử dụng phạm vi bảo hiểm mã để làm nổi bật các đoạn mã mà tôi có lẽ nên viết thử nghiệm. Ví dụ: nếu bất kỳ công cụ bao phủ mã nào hiển thị myImportantFunction () không được thực thi trong khi chạy các bài kiểm tra đơn vị hiện tại của tôi, thì có lẽ chúng nên được cải thiện.

Về cơ bản, phạm vi bảo hiểm mã 100% không có nghĩa là mã của bạn là hoàn hảo. Sử dụng nó như một hướng dẫn để viết các bài kiểm tra (đơn vị-) toàn diện hơn.


1
- "Bảo hiểm mã 100%" không có nghĩa là mọi thứ đều được kiểm tra hoàn toàn - trong khi điều đó có nghĩa là mọi dòng mã đều được kiểm tra, điều đó không có nghĩa là chúng được kiểm tra trong mọi tình huống (phổ biến) ..- "dưới mọi (chung) tình hình "điều này có liên quan đến dữ liệu đầu vào và tham số không? Tôi đang gặp khó khăn để hiểu tại sao nếu mọi thứ được kiểm tra, nó không đồng nghĩa với việc được kiểm tra hoàn toàn.
Abdul

20
Chỉ vì mỗi dòng mã của bạn được chạy tại một số điểm trong các thử nghiệm của bạn, điều đó không có nghĩa là bạn đã kiểm tra mọi kịch bản có thể xảy ra mà mã có thể được chạy theo. Nếu bạn vừa có một hàm đã lấy xvà trả về x/xvà bạn đã chạy thử nghiệm bằng my_func (2), bạn sẽ có phạm vi bảo hiểm 100% (vì mã của hàm sẽ được chạy) nhưng bạn đã bỏ lỡ một vấn đề lớn khi 0 là tham số. Tức là bạn đã không kiểm tra tất cả các kịch bản cần thiết ngay cả với phạm vi bảo hiểm 100%.
steve

bạn có thể vui lòng xem xét tình huống này khi các trường hợp kiểm thử đơn vị không được viết cho tất cả các phương thức. Bảo hiểm mã sẽ vẫn là 100%. stackoverflow.com/questions/43395968/
hy

52

Bổ sung một vài điểm cho nhiều câu trả lời trước:

Bảo hiểm mã có nghĩa là, bộ kiểm tra của bạn bao phủ mã nguồn của bạn tốt đến mức nào. tức là ở mức độ nào thì mã nguồn được bao phủ bởi tập hợp các trường hợp thử nghiệm.

Như đã đề cập trong các câu trả lời ở trên, có nhiều tiêu chí bảo hiểm khác nhau, như đường dẫn, điều kiện, chức năng, câu lệnh, v.v. Nhưng các tiêu chí bổ sung cần được đề cập là

  1. Phạm vi điều kiện: Tất cả các biểu thức boolean được đánh giá là đúng và sai.
  2. Phạm vi quyết định: Không chỉ các biểu thức boolean được đánh giá đúng và sai một lần, mà còn bao gồm tất cả các phần thân if-otherif-other tiếp theo.
  3. Bảo hiểm vòng lặp: có nghĩa là, mỗi vòng lặp có thể được thực hiện một lần, nhiều lần và không có thời gian. Ngoài ra, nếu chúng tôi có giả định về giới hạn tối đa, thì, nếu khả thi, hãy kiểm tra thời gian giới hạn tối đa và, nhiều hơn một lần so với giới hạn tối đa.
  4. Bảo hiểm xuất nhập cảnh: Kiểm tra tất cả các cuộc gọi có thể và giá trị trả về của nó.
  5. Tham số giá trị bảo hiểm (PVC). Để kiểm tra nếu tất cả các giá trị có thể cho một tham số được kiểm tra. Ví dụ: một chuỗi có thể là bất kỳ chuỗi nào trong số này: a) null, b) trống, c) khoảng trắng (dấu cách, tab, dòng mới), d) chuỗi hợp lệ, e) chuỗi không hợp lệ, f) chuỗi byte đơn, g ) chuỗi kép. Việc không kiểm tra từng giá trị tham số có thể có thể để lại lỗi. Chỉ kiểm tra một trong số này có thể dẫn đến phạm vi bao phủ 100% mã khi mỗi dòng được bảo hiểm, nhưng vì chỉ một trong bảy tùy chọn được kiểm tra, có nghĩa là, chỉ có phạm vi bảo hiểm 14,2% của giá trị tham số.
  6. Bảo hiểm kế thừa: Trong trường hợp nguồn hướng đối tượng, khi trả về một đối tượng dẫn xuất được gọi bởi lớp cơ sở, phạm vi bảo hiểm để đánh giá, nếu đối tượng anh chị em được trả về, cần được kiểm tra.

Lưu ý: Phân tích mã tĩnh sẽ tìm thấy nếu có bất kỳ mã không thể truy cập hoặc mã treo, tức là mã không nằm trong bất kỳ lệnh gọi chức năng nào khác. Và bảo hiểm tĩnh khác. Ngay cả khi phân tích mã tĩnh báo cáo rằng mã 100% được bảo hiểm, nó sẽ không cung cấp báo cáo về bộ thử nghiệm của bạn nếu tất cả phạm vi bảo hiểm mã có thể được kiểm tra.


2
Một sự bổ sung thú vị ở đây cho những câu trả lời khác
HDave

14

Mã bảo hiểm đã được giải thích tốt trong các câu trả lời trước. Vì vậy, đây là nhiều hơn một câu trả lời cho phần thứ hai của câu hỏi.

Chúng tôi đã sử dụng ba công cụ để xác định phạm vi bảo hiểm mã.

  1. JTest - một công cụ độc quyền được xây dựng trên JUnit. (Nó cũng tạo ra các bài kiểm tra đơn vị.)
  2. Cobertura - một công cụ bao phủ mã nguồn mở có thể dễ dàng kết hợp với các bài kiểm tra JUnit để tạo báo cáo.
  3. Emma - khác - cái này chúng tôi đã sử dụng cho mục đích hơi khác so với thử nghiệm đơn vị. Nó đã được sử dụng để tạo báo cáo bảo hiểm khi người dùng cuối truy cập ứng dụng web. Điều này kết hợp với các công cụ kiểm tra web (ví dụ: Canoo) có thể cung cấp cho bạn các báo cáo bảo hiểm rất hữu ích cho bạn biết bao nhiêu mã được bảo hiểm trong quá trình sử dụng thông thường của người dùng cuối.

Chúng tôi sử dụng những công cụ này để

  • Đánh giá rằng các nhà phát triển đã viết bài kiểm tra đơn vị tốt
  • Đảm bảo rằng tất cả các mã được duyệt qua trong quá trình kiểm tra hộp đen

6

Bảo hiểm mã chỉ đơn giản là thước đo của mã được kiểm tra. Có nhiều tiêu chí bảo hiểm có thể đo lường được, nhưng thông thường, đó là các đường dẫn, điều kiện, chức năng và tuyên bố khác nhau trong một chương trình trang điểm cho tổng phạm vi bảo hiểm. Chỉ số bảo hiểm mã chỉ là một tỷ lệ phần trăm của các thử nghiệm thực hiện từng tiêu chí bảo hiểm này.

Theo như cách tôi đi theo dõi phạm vi kiểm tra đơn vị theo dõi các dự án của mình, tôi sử dụng các công cụ phân tích mã tĩnh để theo dõi.


5

Đối với Perl, có mô-đun Devel :: Cover tuyệt vời mà tôi thường sử dụng trên các mô-đun của mình.

Nếu việc xây dựng và cài đặt được quản lý bởi Module :: Build, bạn có thể chỉ cần chạy ./Build testcoverđể có được một trang web HTML đẹp cho bạn biết phạm vi bảo hiểm trên mỗi phụ, dòng và điều kiện, với màu sắc đẹp giúp dễ dàng xem đường dẫn mã nào không được che.


1

Trong các câu trả lời trước Bảo hiểm mã đã được giải thích tốt. Tôi chỉ bổ sung một số kiến ​​thức liên quan đến các công cụ nếu bạn đang làm việc iOSOSXnền tảng, Xcode cung cấp phương tiện để kiểm tra và giám sát phạm vi bảo hiểm mã.

Liên kết tham khảo:

https://developer.apple.com/lvern/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/ch chương/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

Cả hai đều là các liên kết hữu ích để tìm hiểu và khám phá phạm vi bảo hiểm mã với Xcode.


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.