Có bao nhiêu sự chế giễu là đúng?


10

Tôi đã đặt tiêu đề cho câu hỏi một cách đùa cợt bởi vì tôi chắc chắn rằng "nó phụ thuộc", nhưng tôi có một số câu hỏi cụ thể.

Làm việc trong phần mềm có nhiều lớp phụ thuộc sâu, nhóm của tôi đã quen với việc sử dụng chế độ nhạo báng khá rộng rãi để tách từng mô-đun mã khỏi các phụ thuộc bên dưới nó.

Do đó, tôi đã rất ngạc nhiên khi Roy Osherove gợi ý trong video này rằng bạn chỉ nên sử dụng chế độ chế giễu khoảng 5%. Tôi đoán rằng chúng ta đang ngồi ở đâu đó giữa 70-90%. Thỉnh thoảng tôi cũng thấy hướng dẫn tương tự khác .

Tôi nên xác định những gì tôi coi là hai loại "kiểm thử tích hợp" khác biệt đến mức chúng thực sự phải được đặt tên khác nhau: 1) Các thử nghiệm trong quá trình tích hợp nhiều mô-đun mã và 2) Thử nghiệm ngoài quy trình nói chuyện đến cơ sở dữ liệu, hệ thống tệp, dịch vụ web, v.v. Đây là loại số 1 mà tôi quan tâm, các thử nghiệm tích hợp nhiều mô-đun mã tất cả trong quá trình.

Phần lớn các hướng dẫn cộng đồng mà tôi đã đọc gợi ý rằng bạn nên ưu tiên một số lượng lớn các bài kiểm tra đơn vị hạt mịn, tách biệt và một số ít các bài kiểm tra tích hợp đầu cuối hạt thô, bởi vì các bài kiểm tra đơn vị cung cấp cho bạn phản hồi chính xác về nơi hồi quy có thể đã được tạo, nhưng các bài kiểm tra thô, rất khó cài đặt, thực sự xác minh thêm chức năng đầu cuối của hệ thống.

Vì điều này, có vẻ như cần phải sử dụng chế độ chế nhạo khá thường xuyên để cô lập các đơn vị mã riêng biệt này.

Cho một mô hình đối tượng như sau:

nhập mô tả hình ảnh ở đây

... Cũng xem xét rằng độ sâu phụ thuộc của ứng dụng của chúng tôi đi sâu hơn nhiều so với mức tôi có thể phù hợp với hình ảnh này, do đó có nhiều lớp N nằm giữa lớp 2-4 và lớp 5-13.

Nếu tôi muốn kiểm tra một số quyết định logic đơn giản được đưa ra ở đơn vị số 1 và nếu mọi phụ thuộc được đưa vào hàm xây dựng vào mô-đun mã phụ thuộc vào nó, thì, 2, 3 và 4 là hàm tạo được đưa vào mô-đun 1 trong hình ảnh, tôi rất muốn tiêm giả 2, 3 và 4 vào 1.

Mặt khác, tôi sẽ cần xây dựng các trường hợp cụ thể của 2, 3 và 4. Điều này có thể khó khăn hơn so với việc chỉ cần gõ thêm. Thường thì 2, 3 và 4 sẽ có các yêu cầu của nhà xây dựng có thể gây khó khăn để đáp ứng và theo biểu đồ (và theo thực tế của dự án của chúng tôi), tôi sẽ cần xây dựng các trường hợp cụ thể từ N đến 13 để đáp ứng các nhà xây dựng của 2, 3 và 4.

Tình huống này trở nên khó khăn hơn khi tôi cần 2, 3 hoặc 4 để hành xử theo một cách nào đó để tôi có thể kiểm tra quyết định logic đơn giản trong # 1. Tôi có thể cần phải hiểu và "lý luận về mặt tinh thần" về toàn bộ biểu đồ / cây đối tượng cùng một lúc để có được 2, 3 hoặc 4 để hành xử theo cách cần thiết. Việc làm myMockOfModule2.Setup (x => x.GoLeftOrRight ()) có vẻ dễ dàng hơn nhiều. Trả về (new Right ()); để kiểm tra mô-đun 1 đáp ứng như mong đợi khi mô-đun 2 bảo nó đi đúng.

Nếu tôi thử nghiệm các trường hợp cụ thể của 2 ... N ... 13 tất cả cùng nhau, các thiết lập thử nghiệm sẽ rất lớn và chủ yếu là trùng lặp. Thất bại thử nghiệm có thể không làm rất tốt việc xác định chính xác các vị trí của thất bại hồi quy. Các xét nghiệm sẽ không độc lập ( một liên kết hỗ trợ khác ).

Cấp, thường là hợp lý để thực hiện kiểm tra dựa trên trạng thái, thay vì dựa trên tương tác, của lớp dưới cùng, vì các mô-đun hiếm khi có bất kỳ sự phụ thuộc nào nữa. Nhưng có vẻ như việc chế nhạo là gần như cần thiết theo định nghĩa để cô lập bất kỳ mô-đun nào trên mức thấp nhất.

Với tất cả những điều này, bất cứ ai cũng có thể cho tôi biết những gì tôi có thể thiếu? Là đội của chúng tôi lạm dụng giả? Hoặc có lẽ có một số giả định trong hướng dẫn kiểm thử đơn vị điển hình rằng các lớp phụ thuộc trong hầu hết các ứng dụng sẽ đủ nông để kiểm tra tất cả các mô-đun mã được tích hợp với nhau (làm cho trường hợp của chúng tôi trở nên "đặc biệt")? Hoặc có lẽ khác nhau, là nhóm của chúng tôi không giới hạn bối cảnh bị ràng buộc của chúng tôi đầy đủ?


Nghe có vẻ như ứng dụng của bạn có thể được hưởng lợi từ việc ghép lỏng hơn. vi.wikipedia.org/wiki/Loose_coupling
Robert Harvey

1
Or is there perhaps some assumption in typical unit testing guidance that the layers of dependency in most applications will be shallow enough that it is indeed reasonable to test all of the code modules integrated together (making our case "special")? <- Cái này.
Robert Harvey

Cũng đáng chú ý: Mục đích của kiểm tra hồi quy (đặc biệt là kiểm tra tích hợp) là để chứng minh rằng phần mềm của bạn vẫn hoạt động, không nhất thiết phải xác định nơi nó bị hỏng. Bạn có thể làm điều đó với khắc phục sự cố, khắc phục sự cố và sau đó khắc phục sự cố cụ thể bằng các thử nghiệm đơn vị bổ sung.
Robert Harvey

Tôi nên rõ ràng hơn trong bài viết gốc, để nói rằng mô-đun 1 chỉ biết về I2, I3 và I4. Mô-đun 2 chỉ biết về I5, I6 và I7. Đó chỉ là mục tiêu đáng nghi ngờ của việc thử nghiệm mà không sử dụng giả mà tôi sẽ cung cấp cụ thể 2, 3 và 4 đến 1, dẫn đến những thách thức tôi mô tả. Mặt khác, chúng tôi kết thúc bằng cách sử dụng giả hơn 5% thời gian.
ardave

Tôi đã nói đùa về trường hợp của chúng tôi là "đặc biệt" sau khi đọc một bài đăng trên blog về nhiều đội bất chấp các quy ước có giá trị vì họ cảm thấy không chính xác tình huống của họ là "đặc biệt". Nhưng nếu đây thực sự là trường hợp của chúng tôi, điều này sẽ giải thích sự chênh lệch giữa một số hướng dẫn cộng đồng mà tôi đã đọc và một số kinh nghiệm thực tế của nhóm tôi. (5% so với 70-90%)
ardave

Câu trả lời:


4

Là đội của chúng tôi lạm dụng giả?

Không phải thoạt nhìn.

Nếu bạn có 1..13 mô-đun, thì mỗi mô-đun nên có các thử nghiệm đơn vị riêng và tất cả các phụ thuộc (không tầm thường, không đáng tin cậy) nên được thay thế bằng các phiên bản thử nghiệm. Điều đó có thể có nghĩa là giả, nhưng một số người mang tính mô phạm với việc đặt tên, vì vậy hàng giả, miếng chêm, vật thể rỗng ... một số người gọi tất cả các cài đặt thử nghiệm là "giả". Đây có thể là nguồn gốc của sự nhầm lẫn về mức độ "đúng".

Cá nhân, tôi chỉ gọi tất cả các đối tượng thử nghiệm là "giả" vì việc phân biệt giữa sự đa dạng của chúng thường không hữu ích. Miễn là họ giữ cho đơn vị của tôi kiểm tra nhanh, tách biệt và kiên cường ... Tôi không quan tâm họ được đặt tên gì.


Tôi sẽ tự hỏi nếu có bất kỳ hướng dẫn chung nào về việc khi nào thì tốt nhất để kiểm tra các mô-đun mã riêng rẽ so với thử nghiệm nhiều hơn một mô-đun mã, được tích hợp với nhau. Có vẻ như ngay khi tôi tích hợp bất kỳ hai mô-đun nào mà tôi có thể bị cô lập, tôi tự mở ra một loạt các vấn đề không mong muốn: Thiếu xác định chính xác nguyên nhân hồi quy / nhiều thử nghiệm thất bại cho một hồi quy đơn, thiết lập thử nghiệm quá mức, v.v. Tôi có ý thức trực quan của riêng mình ("lắng nghe các bài kiểm tra") nhưng điều này đã khiến tôi ở mức giả 70-90%.
ardave

1
@nono - Theo kinh nghiệm của tôi, bạn nên kiểm tra mọi thứ một cách cô lập, vì những lý do bạn đề cập. Những thứ duy nhất bạn không kiểm tra đơn vị một cách cô lập là những thứ bạn không thể làm được vì chúng đi ngược lại với một số hệ thống tệp hoặc tài nguyên bên ngoài khác ( rốt cuộc phải làm điều đó).
Telastyn

Sau khi nhai điều này trong vài ngày, bạn có vẻ như là lời giải thích tốt nhất có thể: Nếu người ta sử dụng định nghĩa nghiêm ngặt của "giả" như một loại kiểm tra kép được sử dụng để xác minh tương tác / kiểm tra hành vi, trái ngược với kiểm tra giả đôi hoặc một thử nghiệm kép được cấu hình trước để mô phỏng một số hành vi nhất định, sau đó, tôi có thể thấy cuộn dây ở mức 5%.
ardave
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.