Kiểm tra tham số - Khi nào và tại sao bạn sử dụng chúng?


15

Gần đây tại nơi làm việc, chúng tôi đã có một số ý kiến ​​khác nhau liên quan đến thử nghiệm Tham số . Thông thường chúng tôi sử dụng kiểu TDD (hoặc ít nhất là cố gắng) để tôi hiểu những lợi ích của việc chấp nhận đó. Tuy nhiên, tôi đang vật lộn để xem các bài kiểm tra tham số đạt được mang lại. Để tham khảo, chúng tôi làm việc trên một dịch vụ và đó là các thư viện được hiển thị thông qua giao diện RESTful.

Những gì tôi đã thấy cho đến nay là các thử nghiệm, ít nhất là sử dụng JUnit trong Eclipse:

  • Thiếu chi tiết - khi thử nghiệm thất bại, rất khó để xem các tham số khiến thử nghiệm bị lỗi
  • Thường phức tạp để tạo
  • Có xu hướng được tạo sau khi mã được viết - hoàn toàn không phải là một nhược điểm như vậy nhưng mọi người có đặt ra các thử nghiệm tham số hóa khi họ bắt đầu một đoạn mã không?

Nếu bất cứ ai có bất kỳ ví dụ về nơi họ thực sự hữu ích hoặc thậm chí bất kỳ gợi ý tốt để sử dụng chúng sẽ là tuyệt vời. Tôi muốn chắc chắn rằng tôi không chỉ cố chấp vì cá nhân tôi không chọn sử dụng chúng và xem liệu chúng có phải là thứ chúng tôi nên xem là một phần trong kho vũ khí thử nghiệm của mình không.


1
Vấn đề không nằm ở ý tưởng mà là ở thư viện cồng kềnh. Trong C #, cú pháp thân thiện hơn, khi bạn sử dụng nói MbUnit. Vâng, đó là một ý tưởng tốt. Thêm mã của riêng bạn để làm cho quá trình này dễ dàng hơn - đọc nội dung từ tệp - bất cứ điều gì hoạt động. Cũng xem cách MsTest xử lý việc này.
Công việc

Chúng tôi (Square) đã viết Burst để giải quyết một số vấn đề này Parameterized. Nó thường thêm ít nồi hơi, và làm cho nó khá rõ ràng nơi thử nghiệm thất bại.
Daniel Lubarov

Câu trả lời:


4

Vấn đề với việc kiểm tra bất kỳ phần mềm nào là sự phức tạp sẽ tăng lên khá nhanh. Thực tế là, bạn không thể kiểm tra tất cả các kết hợp tham số có thể được truyền cho các phương thức của mình. Phadke ủng hộ cách tiếp cận Thiết kế Thử nghiệm (DOE), cho phép tạo ra danh sách các giá trị tham số có khả năng cần được kiểm tra.

Ý tưởng là, mặc dù bạn không kiểm tra toàn diện, hầu hết các lỗi đều khiến "vùng lỗi" xảy ra thay vì lỗi điểm cô lập. Phương pháp DOE Phadke chủ trương sử dụng các mảng trực giao lấy mẫu không gian tham số đủ mịn để đánh vào tất cả các vùng lỗi có thể.

Các lỗi riêng biệt có thể sẽ không được xác định, nhưng những lỗi này thường ít hơn các vùng lỗi.

Cách tiếp cận DOE cung cấp cho bạn một cách có hệ thống để chọn các giá trị tham số để thay đổi.


Liên kết được cung cấp bị hỏng.
Josh Gust

1
@JoshGust Dễ dàng sửa bằng cách sử dụng Google. Cảm ơn cho những người đứng đầu lên.
Peter K.

4

Chúng có thể hữu ích để đảm bảo rằng mã của bạn xử lý không chỉ đường dẫn hạnh phúc, mà cả các trường hợp cạnh. Sau khi bạn biết mã của mình hoạt động với các biến thông thường, hãy tham số hóa trường hợp kiểm tra và đảm bảo null và 0, chuỗi rỗng, số lớn, chuỗi dài, ký tự Unicode kỳ lạ, v.v., cũng hoạt động tốt.


2

Có ít nhất hai hương vị của các thử nghiệm được tham số hóa, ít nhất là trong JUnit 4.8. Đó là: Các tham số tham số ( @RunWith(Parameterized.class)) yêu cầu nguồn dữ liệu, tạo / đọc các cấu hình tham số được xác định trước và Lý thuyết ( @RunWith(Theories.class)), đưa ra một hoặc nhiều bộ đầu vào có thể cho mỗi loại đối số có thể thực hiện đặc tả của các phương thức đã cho. Có vẻ như ít hơn như thế này:

  • chỉ định một số giá trị có thể ( @DataPoints) cho các đối số chuỗi (như null, chuỗi rỗng, chuỗi không trống, chuỗi thực sự dài)
  • chỉ định một số giá trị có thể ( @DataPoints) cho các đối số lớp Thú (như null, Dogví dụ, Catví dụ, Birdchẳng hạn)
  • chuẩn bị @Theorymà chấp nhận một Stringtham số và một Animaltham số. nó sẽ được thực thi với mọi kết hợp có thể có của các giá trị tham số có thể (trong ví dụ đã cho đó là kết hợp 4 x 4 = 16, bao gồm ( null, null))
  • nếu phương thức được kiểm tra không thể chấp nhận một số kết hợp, hãy sử dụng Assume.assumeThatnhập tĩnh để lọc ra các kết hợp không hợp lệ (ví dụ: khi bạn muốn kiểm tra hành vi của phương thức cho các chuỗi không trống, một trong những dòng đầu tiên sẽ là "giả sử không phải là null"

Như đã viết trước đây - sẽ không có ý nghĩa khi kiểm tra mọi kết hợp có thể có của mọi phương thức (nó phát nổ các bộ kiểm tra, tưởng tượng thử nghiệm một phương thức với 5 tham số, mỗi tham số chỉ có 5 giá trị có thể: 5 ** 5 -> hơn 3000 lần chạy thử !), nhưng đối với các phương pháp quan trọng cho nhiệm vụ (như phương thức API) tôi khuyến khích điều đó, chỉ để ở bên an toàn ...


1

Ví dụ chung:

  • Các phương thức với các đối số chuỗi. Sử dụng các thử nghiệm tham số để kiểm tra các đầu vào khác nhau và đầu ra dự kiến ​​của chúng. Thực tế hơn nhiều khi có một danh sách các cặp (đầu vào, dự kiến) so với viết một TC cho mỗi cặp.

  • Áp dụng cùng một kịch bản trên các đối số khác nhau. Chúng tôi có một kịch bản làm việc với các Animalđối tượng và có rất nhiều lớp con như Dog, Cat, Bird. Tạo một danh sách các động vật có sẵn và kiểm tra kịch bản trên chúng.

Cụ thể cho dịch vụ web:

  • Từ ví dụ chuỗi đối số ở trên. Kiểm tra những gì xảy ra với các đối số khác nhau cùng loại nhưng giá trị khác nhau.

0

Kiểm tra tham số hoạt động tốt cho các chức năng / tính năng kiểm tra có đầu vào đơn giản khi bạn muốn kiểm tra nhiều loại đầu vào.

Chúng không hoạt động tốt để kiểm tra chức năng khác nhau và đầu vào phức tạp. Chúng không nên được sử dụng như một cấu trúc thuận tiện để viết ít mã hơn.


1
Tại sao các tham số không nên được sử dụng như một sự thuận tiện để viết ít mã hơn? Không có đức tính tuyệt vời trong việc cung cấp một danh sách đầy đủ của một tập hợp lớn (ish) các trường hợp thử nghiệm.
Jonathan Eunice

1
Làm thế nào để câu trả lời của bạn cung cấp nhiều thông tin hơn 5 câu trả lời khác?
Adam Zuckerman

-2

Một trường hợp tôi sử dụng nhiều thử nghiệm được tham số hóa theo cách TDD-ish là viết trình phân tích cú pháp - Tôi có thể bắt đầu với một danh sách nếu đầu vào và đầu ra dự kiến ​​và sau đó viết mã để nó vượt qua tất cả các trường hợp thử nghiệm.

Nhưng tôi đã thấy một vài điều khủng khiếp của thử nghiệm tham số. Không, Virginia, bộ thử nghiệm của bạn không cần thử nghiệm đơn vị của riêng nó.


1
Các thử nghiệm tham số lý tưởng phải có dạng "mục (n) trong mục khớp đầu ra thực tế (n) trong đầu ra mong đợi" hoặc tương tự, và trong trường hợp đó không cần thử nghiệm. Nhưng đối với bất kỳ điều gì phức tạp hơn, tôi muốn thấy một hoặc hai bài kiểm tra tham số rõ ràng với các trường hợp kiểm thử của riêng họ hơn là mã "kiểm tra (kiểm tra)" bằng tay của tôi rõ ràng là chính xác ". Nếu đó là sự thật, bạn sẽ không viết trường hợp thử nghiệm nào cả. Rõ ràng là có thể vượt qua sự phức tạp và tôi không tranh luận rằng không có dòng nào, nhưng tôi nghĩ có những trường hợp kiểm tra thử nghiệm là một ý tưởng tốt.
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.