2008-10-14 18 views

Trả lời

8

Tuyên bố chung admonishing đơn vị xét nghiệm giòn áp dụng chủ yếu cho các cửa hàng chưa hoàn toàn chấp nhận thử nghiệm đơn vị. Ví dụ, khi cố gắng chuyển đổi từ không có thử nghiệm để có một bộ đầy đủ các bài kiểm tra đơn vị, hoặc khi dự án của bạn là dự án thí điểm thử nghiệm đơn vị. Trong những trường hợp này, các nhà phát triển đã quen với các kết quả dương tính giả từ các bài kiểm tra đơn vị và bắt đầu bỏ qua chúng. Sau đó, các bài kiểm tra đơn vị nằm sau mã sản xuất và bị bỏ lại phía sau hoặc yêu cầu một nỗ lực lớn để cập nhật.

Tôi cho rằng bạn nên luôn luôn nhắm đến các thử nghiệm ít giòn nhất mà bạn có thể kiểm tra đầy đủ chức năng/mô-đun của bạn, nhưng nếu bạn có 1 hoặc 2 là giòn bạn sẽ không sao trong hầu hết các trường hợp.

6

IMO, miễn là kiểm tra của bạn đảm bảo rằng mã ứng dụng của bạn thực hiện những gì cần làm và nếu thay đổi, các kiểm tra không thành công, thì thử nghiệm của bạn sẽ ổn. Bạn có thể định nghĩa chính xác ý bạn là "giòn"?

Chỉ cần đảm bảo rằng các thử nghiệm của bạn thực sự bao hàm mọi khía cạnh của mã ứng dụng của bạn. (Trong vòng suy luận).

12

Kiểm tra đơn vị phải phải giòn - nó phải có thể dễ dàng phá vỡ chúng. Nếu họ không phá vỡ, sau đó họ không phải là bài kiểm tra đơn vị ở tất cả; chúng là các bình luận mã.

...

hoặc tôi có thiếu điểm của câu hỏi không?


Chỉnh sửa: Tôi nên làm rõ câu trả lời trước đó.

Tôi đã có một chút hiểu biết về ngôn ngữ. "giòn" chỉ có nghĩa là "dễ phá vỡ". Thử nghiệm đơn vị nên có thể dễ dàng ngắt. Thuật ngữ "kiểm tra giòn" thực sự phải là "quá thử nghiệm nhỏ"; kiểm tra mà phá vỡ khi họ không nên. Mặc dù vậy, nó dễ dàng hơn nhiều, dễ dàng hơn để sửa một bài kiểm tra quá giòn hơn để sửa một lỗi trượt qua một bài kiểm tra dưới giòn, vì vậy hãy tiếp tục và viết các bài kiểm tra giòn của bạn!

+0

Tôi không đồng ý, việc sửa các thử nghiệm giòn có nghĩa là rất nhiều bảo trì. Một trong những mục đích của thử nghiệm đơn vị là giảm bảo trì. UnitTest chỉ có một lý do logic để thất bại. – Restuta

+1

@Restuta Mục đích của các bài kiểm tra đơn vị là để thực thi rằng hành vi hoặc phương pháp của họ vẫn nhất quán. Thực thi các biện pháp bảo vệ chống lại lỗi. Bắt các lỗi này sớm dẫn đến bảo trì ít hơn. Đừng nhầm lẫn mục đích có hiệu lực. – ArtB

+0

@Restuta Tôi nghĩ rằng bằng cách giòn tác giả có nghĩa là các bài kiểm tra đơn vị đã phá vỡ vì những lý do sai. Các bài kiểm tra chỉ nên phá vỡ nếu phương pháp thử nghiệm của bạn không đúng, nếu các bài kiểm tra dễ dàng phá vỡ vì những thay đổi/phụ thuộc khác thì chúng "dễ vỡ". –

5

Vì dysfunctor chỉ ra, các xét nghiệm đơn vị phải dễ vỡ ở chỗ chúng dễ bị vỡ. Tuy nhiên, tôi sẽ thêm rằng họ không nên giòn trong đó họ vượt qua hoặc thất bại ngẫu nhiên.

Điều này xảy ra rất nhiều trong các thử nghiệm liên quan đến chủ đề và ổ cắm. Các thử nghiệm nên sử dụng mutexes và các thiết bị "chờ" khác để tránh các thử nghiệm không đạt được trong các trường hợp không kiểm soát được, chẳng hạn như tải bộ vi xử lý cao.

Xác định "mùi" của một thử nghiệm ngẫu nhiên giòn là việc sử dụng hàm sleep() trong thử nghiệm.

+0

Tôi cho rằng các thử nghiệm của bạn nên mô phỏng socket hoặc luồng hoạt động thông qua việc sử dụng mocks. Kiểm tra giao tiếp socket thực tế là một thử nghiệm tích hợp. Một bài kiểm tra đơn vị nên kiểm tra rằng việc thực hiện làm việc như mong đợi với giả định rằng giao tiếp socket hoạt động. Bạn nói rằng việc sử dụng "ngủ" là dấu hiệu của mùi, nhưng trước khi bạn nói để sử dụng các thiết bị "chờ" khác, vậy đó là gì? Tôi nghĩ rằng bất kỳ việc sử dụng thiết bị "chờ đợi" nào là dấu hiệu cho thấy thử nghiệm này thực sự là một thử nghiệm tích hợp và hành vi phải được tách ra thành một thử nghiệm đơn vị với mocks. 2c của tôi. –

+0

Bởi thiết bị chờ đợi, tôi có nghĩa là bất kỳ cơ chế không bỏ phiếu - gọi lại, hoặc một mutex chờ đợi, lý tưởng. Hoặc chọn();) Tôi đồng ý nói chung rằng mocks chắc chắn nên được sử dụng bất cứ nơi nào có thể. – metao

3

Có, độ giòn của các thử nghiệm luôn luôn là một điều xấu. Nhưng nó có vẻ là một trong những điều mà chúng ta phải sống với để kiểm tra đầy đủ các lớp học của chúng ta. Nhiều lớp không thể được kiểm tra như các hộp đen lấy một số đầu vào và trả về một số đầu ra, giống như bạn có thể thấy với Math.cos(). Hầu hết trong số họ có tác dụng phụ trên các lớp khác hoặc các thực thể trong hệ thống và bạn phải kiểm tra rằng các thực thể đó đã được chế tác đúng cách bởi lớp đó. Điều đó có nghĩa là thử nghiệm phải biết chi tiết thực hiện về lớp đang được kiểm tra, tạo ra các lớp dễ vỡ.

Kiểm tra giòn giống như các kỳ thi proctology. Họ chắc chắn là những điều tồi tệ, khó chịu, nhưng chúng tôi phải đưa ra với họ bởi vì chúng tôi không có sự lựa chọn tốt hơn.

3

Khi một sự thay đổi mã có nghĩa là "nội bộ" tới lớp (tức là không thay đổi API), gây ra một thử nghiệm thất bại, có hai khả năng:

  1. Mã này đã một lỗi mới, OR
  2. Mã đúng, cần kiểm tra sửa chữa

Hãy thử giảm # 2. Đó là những thử nghiệm 'giòn'.

0

Kiểm tra đơn vị theo định nghĩa giòn. Chúng phá vỡ khi các mã liên quan (hệ thống được kiểm tra) thay đổi. Đó là do thiết kế. Đó là cách kiểm tra đơn vị cung cấp giá trị.

Những gì chúng tôi muốn tránh là các thử nghiệm sẽ phá vỡ khi mã thay đổi nhưng logic thì không. Ví dụ, có phần lớn các kiểm tra hiện có bị phá vỡ khi thêm một yêu cầu mới là không mong muốn.

Thật không may, tránh sự giòn không dễ như vậy. Trong tất cả, nhưng đơn giản nhất của các trường hợp, kiểm tra đơn vị sẽ có một số kiến ​​thức về việc thực hiện của hệ thống được thử nghiệm (ví dụ như các đối tượng giả). Miễn là điều đó đúng, kiểm tra sẽ giòn.

Cách tốt nhất để tránh vấn đề đó là tránh viết các lớp cần thay đổi. Điều này thực sự dễ dàng hơn âm thanh khi tuân thủ các nguyên tắc SOLID.

+1

* Tự quảng bá trắng trợn: * Tôi có một chuỗi chủ đề này trên blog của mình. Phần 1 là ở đây: http://www.readytorocksd.com/the-brittleness-of-unit-tests/. –

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