Làm thế nào để kiểm tra tích hợp chỉ trích thiết kế?


38

Tôi đang đọc bài đăng trên blog của JB Rainsberger về các bài kiểm tra tích hợp và tự hỏi làm thế nào một bài kiểm tra tích hợp khắc nghiệt hơn với thiết kế của chúng tôi?

Chúng tôi viết các bài kiểm tra tích hợp nhiều hơn, lớn hơn và không chỉ trích thiết kế của chúng tôi gay gắt như các vi ống


3
Câu hỏi khó hiểu. "theo cách mà một bài kiểm tra tích hợp khắc nghiệt hơn" ... "các bài kiểm tra tích hợp, bài kiểm tra lớn hơn và không chỉ trích thiết kế của chúng tôi là khắc nghiệt" - bây giờ thì sao?
AnoE


"kiểm tra tích hợp"! = "kiểm tra tích hợp". Tôi biết. Tôi cũng không thích nó, nhưng đó là những gì những từ đó có nghĩa. "kiểm tra tích hợp" = "kiểm tra kiểm tra các điểm tích hợp (không tích hợp mọi thứ)", trong khi "kiểm tra tích hợp" = "(kiểm tra lớn hơn) kiểm tra tích hợp mọi thứ và kiểm tra toàn bộ tích hợp như một điều duy nhất". Theo cách này, các thuật ngữ này trở thành đối lập của nhau.
JB Rainsberger

Câu trả lời:


46

Microtests có thể giúp dẫn đến thiết kế tốt . Bằng cách viết các bài kiểm tra nhỏ tốt, bạn đang cố tình kiểm tra một lượng nhỏ mã và điền vào các khoảng trống của nó bằng các đối tượng giả . Điều này dẫn đến sự ghép đôi thấp (những thứ không phụ thuộc vào nhau) và độ gắn kết cao (những thứ thuộc về nhau ở cùng nhau). Theo cách đó, khi bạn quay lại và thực hiện các thay đổi, bạn sẽ dễ dàng tìm thấy những gì chịu trách nhiệm cho những gì bạn đang tìm kiếm và bạn ít có khả năng phá vỡ mọi thứ trong việc thực hiện thay đổi. Điều này sẽ không giải quyết tất cả các thiết kế của bạn nhưng nó có thể giúp đỡ.

Trong bối cảnh này, JB Rainsberger lưu ý rằng nếu bạn gặp khó khăn khi viết bài kiểm tra đơn vị, bạn có thể gặp sự cố với thiết kế của mình gây khó khăn và do đó các bài kiểm tra đang chỉ trích thiết kế ngầm. Ông cho rằng đây là một điều tốt, bởi vì nếu không có các thử nghiệm nhỏ giúp giữ cho kiến ​​trúc của bạn thẳng hàng thì rất dễ đi lạc khỏi các mẫu thiết kế tốt - điều mà các thử nghiệm tích hợp sẽ không nắm bắt được.

Cập nhật : như Rainsberger ghi chú bên dưới, anh ta không có ý định vi ống đồng nghĩa với các bài kiểm tra đơn vị. Anh ấy cũng cung cấp một câu trả lời chi tiết có thể giúp bạn hiểu sâu hơn về chính xác những gì anh ấy đang truyền đạt.


2
Tôi đồng ý với câu trả lời của bạn về nguyên tắc, nhưng không phải là cách bạn đang nói rõ nó. Một người đang hỏi câu hỏi đặc biệt này khó có thể biết các thuật ngữ "chế giễu", "khớp nối" và "gắn kết" nghĩa là gì và bạn chưa định nghĩa các thuật ngữ đó trong câu trả lời của mình.
Robert Harvey

3
Điều đó tốt hơn, nhưng bạn đang cho đơn vị kiểm tra tín dụng nhiều hơn tôi nghĩ họ thực sự đến hạn. Kiểm tra đơn vị chủ yếu thông báo khả năng kiểm tra mã của bạn. Không rõ liệu việc làm cho mã của bạn có thể kiểm tra được có tự động tạo ra các đặc tính liên kết và khớp nối tốt hơn hay không, mặc dù đó chắc chắn là một ảnh hưởng tích cực. Ngoài ra, tôi nghĩ rằng bạn có "sự gắn kết cao" nhầm lẫn với "nguyên tắc trách nhiệm duy nhất;" sự gắn kết có nghĩa là "những thứ thuộc về nhau" (xem bài viết trên Wikipedia ).
Robert Harvey

10
Cuối cùng, "kiểm tra vi mô" không phải là thuật ngữ ưa thích. Tôi thích nó khi các blogger tạo nên các thuật ngữ kỹ thuật của riêng họ.
Robert Harvey

2
@RubberDuck: Microtests (Khoảng 16.900 kết quả) so với các bài kiểm tra đơn vị (Khoảng 193.000.000 kết quả) . Thậm chí không gần gũi. Ngay cả khi bạn trộn đơn vị và kiểm tra cùng nhau, bạn vẫn nhận được 14 triệu kết quả.
Robert Harvey

5
Vui lòng không đánh đồng "microtest" và "bài kiểm tra đơn vị" (xem câu trả lời của tôi để biết một số chi tiết); mặt khác, tôi cảm thấy như bạn hiểu những gì tôi đã cố gắng để mô tả.
JB Rainsberger

28

Phiên bản cực ngắn: các thử nghiệm nhỏ hơn, vì chúng chạy các phần nhỏ hơn của hệ thống, hạn chế một cách tự nhiên những gì lập trình viên có thể viết, và do đó điều này tạo ra cơ hội cho phản hồi sắc nét hơn (dễ nhận thấy hơn / khó bỏ qua hơn). Hãy để tôi nói thêm rằng điều này không nhất thiết dẫn đến thiết kế tốt hơn, nhưng thay vào đó nó tạo ra cơ hội để nhận thấy rủi ro thiết kế sớm hơn.

Đầu tiên, để làm rõ, khi tôi nói "microtest" tôi có nghĩa là "một bài kiểm tra nhỏ" và không có gì nữa. Tôi sử dụng thuật ngữ này bởi vì tôi không có nghĩa là "kiểm tra đơn vị": Tôi không muốn bị lôi kéo vào các cuộc tranh luận về những gì cấu thành một "đơn vị". Tôi không quan tâm (ít nhất là không ở đây / bây giờ). Hai người có thể sẽ dễ dàng đồng ý về "nhỏ" hơn so với "đơn vị", vì vậy tôi dần dần quyết định chấp nhận "microtest" như một thuật ngữ tiêu chuẩn mới nổi cho ý tưởng này.

Các thử nghiệm lớn hơn, nghĩa là các thử nghiệm chạy các phần lớn hơn của hệ thống trong phần "hành động" của chúng, có xu hướng không chỉ trích thiết kế rõ ràng cũng như hoàn toàn như các thử nghiệm nhỏ hơn. Hãy tưởng tượng tập hợp tất cả các cơ sở mã có thể vượt qua một nhóm thử nghiệm nhất định, nghĩa là tôi có thể sắp xếp lại mã và nó vẫn sẽ vượt qua các thử nghiệm đó. Đối với các bài kiểm tra lớn hơn, bộ này lớn hơn; đối với các thử nghiệm nhỏ hơn, bộ này nhỏ hơn. Nói cách khác, các thử nghiệm nhỏ hơn hạn chế thiết kế nhiều hơn, do đó, ít thiết kế hơn có thể khiến chúng vượt qua. Bằng cách này, microtests có thể chỉ trích thiết kế nhiều hơn.

Tôi nói "gay gắt hơn" để gợi lên hình ảnh của một người bạn nói trực tiếp với bạn những gì bạn không muốn nghe, nhưng cần nghe, và ai la mắng bạn để truyền đạt sự khẩn cấp theo cách mà người khác có thể không cảm thấy thoải mái đang làm. Mặt khác, các bài kiểm tra tích hợp, giữ im lặng và chỉ gợi ý về các vấn đề chủ yếu là khi bạn không còn thời gian và năng lượng để giải quyết chúng. Các thử nghiệm tích hợp làm cho quá dễ dàng để quét các vấn đề thiết kế dưới tấm thảm.

Với các thử nghiệm lớn hơn (như các thử nghiệm tích hợp), các lập trình viên có xu hướng gặp rắc rối thông qua sự chậm chạp: họ có đủ tự do để viết mã bị rối bằng cách nào đó vượt qua các thử nghiệm, nhưng sự hiểu biết của họ về mã đó nhanh chóng biến mất ngay khi họ chuyển sang nhiệm vụ tiếp theo và những người khác gặp khó khăn không đáng có khi đọc thiết kế rối. Ở đây có nguy cơ dựa vào các bài kiểm tra tích hợp. Với các thử nghiệm nhỏ hơn (như microtest), các lập trình viên có xu hướng gặp rắc rối thông qua thông số kỹ thuật quá mức: họ hạn chế các thử nghiệm bằng cách thêm các chi tiết không liên quan, thường bằng cách sao chép / dán từ thử nghiệm trước đó và do đó họ tự vẽ tương đối nhanh vào một góc. Tin tốt: Tôi thấy dễ dàng và an toàn hơn nhiều khi loại bỏ các chi tiết không liên quan khỏi các bài kiểm tra vài giờ hoặc vài ngày sau khi tôi viết chúng hơn là tôi thấy nó để tách mã sản xuất bị rối vài tháng đến nhiều năm sau khi tôi viết nó. Khi sai lầm xảy ra, việc chỉ định quá mức sẽ gây ra thiệt hại ngày càng rõ ràng nhanh hơn và lập trình viên cảnh báo nhận thấy trước đó rằng họ cần sửa chữa mọi thứ. Tôi coi đây là một thế mạnh: Tôi nhận thấy các vấn đề sớm hơn và khắc phục chúng trước khi những vấn đề đó bóp nghẹt khả năng của chúng tôi để thêm các tính năng.


Bạn làm gì về vấn đề mà các bài kiểm tra đơn vị phụ thuộc nhiều vào giả của họ hơn là mã thực, dẫn đến vấn đề kiểm tra có vẻ vượt qua nhưng không thực sự hoạt động vì không ai giữ được các giả phù hợp với thực tế.
Zan Lynx

@ZanLynx Tôi đã viết về điều này từ lâu. Bắt đầu tại đây: blog.thecodewhisperer.com/series#integrated-tests-are-a-scam
JB Rainsberger

9

Ông có nghĩa là thiết kế phần mềm tốt được thông báo tốt hơn bằng các bài kiểm tra đơn vị so với kiểm tra tích hợp.

Đây là lý do tại sao. Viết bài kiểm tra đơn vị buộc bạn phải viết mã có thể kiểm tra được đơn vị. Mã kiểm thử đơn vị có xu hướng là một thiết kế tốt hơn mã không có kiểm tra đơn vị.

Kiểm tra tích hợp không thông báo mã của bạn theo cùng một cách vì bạn chỉ đang kiểm tra lớp bên ngoài của phần mềm, chứ không phải các giao diện bên trong kết nối phần mềm của bạn với nhau.

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.