Giá trị của việc kiểm tra trong các bài kiểm tra đơn vị thất bại là gì?


13

Trong khi có nhiều cách để giữ cho các bài kiểm tra đơn vị không được thực thi, giá trị của việc kiểm tra trong các bài kiểm tra đơn vị không thành công là gì?

Tôi sẽ sử dụng một ví dụ đơn giản: Độ nhạy trường hợp. Mã hiện tại là trường hợp nhạy cảm. Một đầu vào hợp lệ vào phương thức là "Cat" và nó sẽ trả về một enum của Animal.Cat. Tuy nhiên, chức năng mong muốn của phương pháp không nên phân biệt chữ hoa chữ thường. Vì vậy, nếu phương thức được mô tả đã được thông qua "con mèo", nó có thể trả về một cái gì đó như Animal.Null thay vì Animal.Cat và bài kiểm tra đơn vị sẽ thất bại. Mặc dù một thay đổi mã đơn giản sẽ làm cho công việc này hoạt động, một vấn đề phức tạp hơn có thể mất nhiều tuần để khắc phục, nhưng xác định lỗi bằng một bài kiểm tra đơn vị có thể là một nhiệm vụ ít phức tạp hơn.

Ứng dụng hiện đang được phân tích có 4 năm mã "hoạt động". Tuy nhiên, các cuộc thảo luận gần đây liên quan đến các bài kiểm tra đơn vị đã tìm thấy lỗ hổng trong mã. Một số chỉ cần tài liệu triển khai rõ ràng (ví dụ trường hợp có nhạy cảm hay không) hoặc mã không thực thi lỗi dựa trên cách nó được gọi hiện tại. Nhưng các bài kiểm tra đơn vị có thể được tạo ra khi thực hiện các kịch bản cụ thể sẽ khiến lỗi được nhìn thấy và là các đầu vào hợp lệ.

Giá trị của việc kiểm tra trong các bài kiểm tra đơn vị thực hiện lỗi cho đến khi ai đó có thể đi xung quanh để sửa mã?

Thử nghiệm đơn vị này có nên được gắn cờ với bỏ qua, ưu tiên, danh mục, v.v. để xác định xem một bản dựng có thành công hay không dựa trên các thử nghiệm được thực hiện? Cuối cùng, bài kiểm tra đơn vị nên được tạo để thực thi mã khi có người sửa nó.

Một mặt nó cho thấy rằng các lỗi được xác định chưa được sửa chữa. Mặt khác, có thể có hàng trăm bài kiểm tra đơn vị thất bại xuất hiện trong nhật ký và tìm kiếm những bài kiểm tra thất bại so với thất bại do đăng ký mã sẽ khó tìm thấy.


Đó là một cách để tăng số lượng bảo hiểm thử nghiệm.
JeffO

Nếu bạn đã nỗ lực để viết bài kiểm tra đơn vị, tại sao bạn muốn viết lại khi bạn quyết định khắc phục sự cố? Chỉ vì nó được kiểm tra, không có nghĩa là nó phải được chạy trong bộ. (Bạn có thể tạo một danh mục cho "Các vấn đề đã biết" và coi các bài kiểm tra đó là danh sách tồn đọng / TODO.)
Caleb

Câu trả lời:


17

Tôi không thích những sự cố không mong muốn được kiểm tra vì chúng tạo ra tiếng ồn không cần thiết. Sau mỗi lần không quan trọng nhất, tôi sẽ phải kiểm tra tất cả các sự cố không thành công (màu đỏ). Có phải màu đỏ là do có một vấn đề mới hoặc vì có một mở cũ để làm / để sửa chữa. Điều này là không ổn nếu có hơn 20 điều không mong muốn.

Thay vào đó tôi sử dụng

  • [Ignore("Reason")]thuộc tính làm cho kết quả màu vàng hoặc
  • throw new NotImplementedException()Điều đó làm cho kết quả màu xám

Lưu ý: Tôi đang sử dụng NUnit cho .net. Tôi không chắc chắn nếu tính năng "màu xám" có trong các khung không đáng tin cậy khác.

Vì vậy, tôi thích ý nghĩa sau đây của kết quả kiểm tra đơn vị.

  • màu xanh lá cây: tất cả đã hoàn thành
  • màu xám: các tính năng mới được lên kế hoạch cần được thực hiện nhưng với mức độ ưu tiên thấp
  • màu vàng: lỗi chưa được sửa. Cần khắc phục sớm
  • đỏ: bọ mới. Nên sửa ngay

Tất cả mọi thứ trừ "màu đỏ" đều có thể được kiểm tra.

Để trả lời câu hỏi: có nhiều tác hại hơn là kiểm tra "kiểm tra thất bại đỏ" nhưng kiểm tra "kiểm tra-bỏ qua màu vàng" hoặc "kiểm tra màu xám không thực hiện" có thể hữu ích như một danh sách việc cần làm.


vấn đề tôi thấy với cách tiếp cận này là, các bài kiểm tra bị bỏ qua có lẽ sẽ không bao giờ được sửa chữa. Bạn cũng có thể loại bỏ toàn bộ mã kiểm tra, điều gì sẽ là sự khác biệt (Tôi hơi tự phụ ở đây)
Lovis

4
will probably never be fixedlà một quyết định chính trị nếu bạn muốn chi tiêu trong các bài kiểm tra tự động hay không. Với "các bài kiểm tra bị bỏ qua", bạn có cơ hội sửa chúng. Vứt bỏ "các bài kiểm tra bị bỏ qua" có nghĩa là "từ bỏ các bài kiểm tra tự động cho đến khi không còn nữa"
k3b

8

Tôi sẽ không giả vờ rằng đây là tiêu chuẩn công nghiệp, nhưng tôi kiểm tra các bài kiểm tra bị hỏng như một cách nhắc nhở tôi hoặc các thành viên dự án khác của tôi rằng vẫn còn vấn đề với chính mã hoặc bài kiểm tra đơn vị.

Tôi cho rằng một điều cần xem xét là liệu các chính sách phát triển của bạn có cho phép thử nghiệm thất bại mà không bị phạt hay không. Tôi có một người bạn làm việc tại một cửa hàng phát triển dựa trên thử nghiệm, vì vậy họ luôn bắt đầu với các thử nghiệm thất bại ...


5
Nhưng bạn không bao giờ nên kiểm tra trong một thử nghiệm thất bại, vì máy chủ xây dựng của bạn không nên xây dựng một dự án với một thử nghiệm bị hỏng.
CaffGeek

@Chad: Xây dựng và thử nghiệm là hai phần riêng biệt của một bước tự động. Tòa nhà đảm bảo rằng mọi thứ biên dịch. Kiểm tra đảm bảo rằng kết quả của việc xây dựng là hợp lệ. Giải thích của tôi về câu hỏi không phải là "tôi có nên kiểm tra mã không biên dịch không?" Thay vào đó là, "tôi có nên kiểm tra trong một bài kiểm tra mà tôi biết sẽ thất bại không?"
unolysampler

1
Tôi chỉ thêm một điểm để xem xét, một số máy chủ xây dựng tích hợp liên tục chạy thử nghiệm và nếu thất bại, chúng sẽ không được triển khai. Đúng, như thể việc xây dựng thất bại, mã thất bại và không có điểm nào trong việc triển khai một sản phẩm được biết là bị hỏng.
CaffGeek

@Chad: Phải, tôi hoàn toàn quên mất máy chủ CI. Đó chắc chắn sẽ là một điểm để xem xét. Nó cũng có giá trị làm rõ những gì chúng tôi có nghĩa là bằng các bài kiểm tra "bị hỏng"; chúng chỉ là các thử nghiệm "xấu" đơn giản hay là thử nghiệm thất bại vì API đã thay đổi theo một cách nào đó?
Tieson T.

Câu hỏi nên được rõ ràng hơn. Nó sẽ là bài kiểm tra sẽ biên dịch, nhưng kết quả mong đợi sẽ thất bại.

6

Các thử nghiệm đơn vị không cung cấp cho nhóm phát triển khả năng hiển thị những gì phải được thực hiện để phù hợp với các thông số kỹ thuật đã thỏa thuận.

Nói tóm lại, các bài kiểm tra đơn vị thất bại cung cấp cho nhóm một danh sách "TODO".

Vì lý do này, không kiểm tra đơn vị là xa tốt hơn là không kiểm tra đơn vị ở tất cả *.
Sự vắng mặt của các bài kiểm tra đơn vị rời khỏi đội ngũ phát triển trong bóng tối; thông số kỹ thuật phải được xác nhận nhiều lần bằng tay .

[* Với điều kiện là các bài kiểm tra đơn vị thực sự kiểm tra một cái gì đó hữu ích.]


2
Có nhiều cách tốt hơn để duy trì danh sách việc cần làm, ví dụ như bảng trắng, ứng dụng danh sách việc cần làm hoặc hệ thống theo dõi vấn đề. Sử dụng bộ kiểm tra sẽ dễ dàng hơn nhiều nếu bạn mong muốn nó luôn vượt qua hoàn toàn và bất kỳ lỗi kiểm tra nào xuất hiện thì đó là một vấn đề mới cần khắc phục ngay lập tức.
bdsl

6

Mục đích của các bài kiểm tra đơn vị là để khẳng định hành vi dự kiến ​​của một hệ thống, không ghi lại các khiếm khuyết. Nếu chúng ta sử dụng các bài kiểm tra đơn vị để ghi lại các khiếm khuyết, thì tính hữu ích của chúng để khẳng định hành vi dự kiến ​​sẽ giảm đi. Câu trả lời cho câu hỏi "Tại sao bài kiểm tra này thất bại?" không đơn giản "Ồ, một cái gì đó bị hỏng mà tôi không mong đợi sẽ bị phá vỡ." Nó đã trở nên không biết liệu thất bại thử nghiệm được dự kiến ​​hay bất ngờ.

Đây là một đoạn từ đầu chương 13 của Làm việc hiệu quả với Bộ luật kế thừa :

Kiểm tra đơn vị tự động là một công cụ rất quan trọng, nhưng không phải để tìm lỗi - ít nhất là không trực tiếp. Nói chung, kiểm tra tự động nên chỉ định mục tiêu mà chúng tôi muốn thực hiện hoặc cố gắng duy trì hành vi đã có. Trong dòng chảy phát triển tự nhiên, các thử nghiệm xác định trở thành thử nghiệm bảo tồn . Bạn sẽ tìm thấy lỗi, nhưng thường không phải là lần đầu tiên chạy thử. Bạn tìm thấy lỗi trong các lần chạy sau khi bạn thay đổi hành vi mà bạn không mong đợi.


3

Nhưng những cái bị hỏng xác định lỗi trong một dự án mới, được đặt tên như vậy. Bằng cách đó bạn có thể thấy rằng họ NÊN phá vỡ ... Khi chúng đang được sửa chữa, chúng sẽ được chuyển sang màu xanh lá cây và chuyển sang bộ thử nghiệm thông thường.

LƯU Ý: Dự án đó sẽ phải được đặt thành không được xây dựng trên máy chủ bản dựng, nếu máy chủ bản dựng của bạn ngăn chặn các bản kiểm tra phá vỡ bản dựng (giả sử bạn xác định bản dựng bị hỏng là một bản trong đó tất cả các bản kiểm tra không vượt qua)


+1 mặc dù không có câu trả lời nếu kiểm tra hay không, có một đối số quan trọng: xây dựng máy chủ
k3b

Tôi thà sử dụng một thuộc tính để đánh dấu một bài kiểm tra như vậy thay vì chuyển nó sang một dự án riêng biệt.
CodeInChaos

2

Các bài kiểm tra đơn vị nên kiểm tra các trường hợp lỗi ngoài các trường hợp thành công của hàm. Một chức năng nên từ chối rõ ràng đầu vào xấu hoặc nên có tài liệu để giải thích những gì đầu vào được coi là hợp lệ.

Nếu bạn có một chức năng không thực hiện một trong những điều đó, thì đó là một lỗi và bạn nên có cách ghi lại rằng nó tồn tại. Tạo một bài kiểm tra đơn vị thể hiện vấn đề này là một cách để làm điều đó. Nộp một vé lỗi là một lựa chọn khác.

Quan điểm của kiểm thử đơn vị là không thành công 100%, vấn đề là tìm và sửa các lỗi trong mã. Không thực hiện các bài kiểm tra là một cách dễ dàng để có được thành công 100%, nhưng điều đó không có lợi cho dự án.


Ái chà ... "Quan điểm của thử nghiệm đơn vị là không thành công 100%", bạn có nói rằng tất cả họ không cần phải vượt qua!?
CaffGeek

2
@Chad: Vấn đề là tốt hơn là có các bài kiểm tra mà bạn biết sẽ thất bại, nhưng đang chứng minh một vấn đề thực sự thay vì không có bài kiểm tra chỉ để bạn có thể có dấu kiểm màu xanh lục vào cuối bản dựng / kiểm tra hàng đêm.
unolysampler

8
@unholysampler, không bao giờ có các bài kiểm tra bị hỏng, trừ khi chúng được đánh dấu rõ ràng là "nên" phá vỡ (bằng cách nằm trong một dự án khác). Mặt khác, chúng trở nên ồn ào và bạn không biết khi nào một bài kiểm tra nên vượt qua, đã bị phá vỡ. Nó hoàn toàn đánh bại mục đích Tích hợp liên tục và có UnitTests
CaffGeek 15/03/2016

2
@Chad: Tôi nghĩ rằng điều này đang đi vào ngữ nghĩa của các định nghĩa. Dựa trên OP, có vẻ như anh ta đang nói về việc tạo ra một bài kiểm tra hợp lệ thực hiện một lỗi. Tuy nhiên, lỗi có mức độ ưu tiên thấp và không có khả năng được khắc phục ngay lập tức. Bạn là người đã đưa ra Tích hợp liên tục, điều này đặt ra những hạn chế nghiêm ngặt hơn nhiều đối với quy trình tự động.
unolysampler

4
@unholysampler, CI hoặc không có CI, vấn đề là, khi bạn chạy thử nghiệm và quen với việc nhìn thấy một số Đèn đỏ, bạn sẽ quen với nó. Vậy, khi thứ gì đó màu xanh lá cây, chuyển sang màu đỏ ... làm sao bạn biết?!? Đó là một thực tế khủng khiếp, và một trong những lý do kiểm tra không được chấp nhận trong rất nhiều tổ chức.
CaffGeek

1

Gửi một lỗi cho mọi thất bại và lưu ý rằng trong kết quả kiểm tra. Sau đó, nếu bạn có được hành động của mình cùng nhau và sửa lỗi, bài kiểm tra của bạn sẽ vượt qua và bạn xóa nó khỏi kết quả kiểm tra. Không bao giờ chỉ bỏ qua vấn đề.


-3

Làm thế nào tôi thấy TDD được thực hiện với việc triển khai các thử nghiệm cho một mã chưa hoàn thành, trước tiên hãy viết thử nghiệm với thuộc tính [ExpectedException] hoặc tương tự. Điều này sẽ vượt qua ban đầu vì mã không hoàn chỉnh sẽ không có logic nào trong đó và viết mã Exception () mới trong đó. Mặc dù thông qua ngoại lệ là sai, nhưng điều này ít nhất sẽ làm cho các bài kiểm tra vượt qua ban đầu và phù hợp để kiểm tra. Chúng tôi có thể quên một bài kiểm tra bị bỏ qua nhưng chắc chắn có thể dọn dẹp hoặc điền mã không đầy đủ. Khi chúng tôi làm như vậy, tự động kiểm tra tương ứng đang mong đợi một đoạn trích bây giờ sẽ bắt đầu thất bại và báo cho bạn để sửa nó. Điều này có thể liên quan đến một sự thay đổi nhỏ của thử nghiệm để thoát khỏi ExpectException và thay vào đó hãy thực hiện các xác nhận thực sự. CI, Dev, người thử nghiệm và khách hàng đều hạnh phúc và một tình huống đôi bên cùng có lợi?


1
Điều này không trả lời câu hỏi. Nó không hỏi TDD là gì và tại sao kiểm tra các ngoại lệ dự kiến.
Andy Wiesendanger
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.