Tôi có cần kiểm tra đơn vị nếu tôi đã có kiểm tra tích hợp không?


47

Nếu tôi đã có bài kiểm tra tích hợp cho chương trình của mình và tất cả đều vượt qua, thì tôi có cảm giác tốt rằng nó sẽ hoạt động. Sau đó, những lý do để viết / thêm bài kiểm tra đơn vị là gì? Vì dù sao tôi cũng đã phải viết các bài kiểm tra tích hợp, tôi chỉ muốn viết bài kiểm tra đơn vị cho các phần không nằm trong các bài kiểm tra tích hợp.

Những gì tôi biết lợi ích của kiểm tra đơn vị so với kiểm tra tích hợp là

  • Nhỏ và do đó chạy nhanh (nhưng thêm đơn vị mới để kiểm tra thứ gì đó đã được kiểm tra bằng thử nghiệm tích hợp có nghĩa là tổng số bộ thử nghiệm của tôi sẽ lớn hơn và dài hơn để chạy)
  • Xác định vị trí lỗi dễ dàng hơn vì nó chỉ kiểm tra một thứ (nhưng tôi có thể bắt đầu viết kiểm tra đơn vị để xác minh từng phần riêng lẻ khi kiểm tra tích hợp của tôi không thành công)
  • Tìm lỗi có thể không bị bắt trong kiểm tra tích hợp. ví dụ: che giấu / bù đắp lỗi. (nhưng nếu tích hợp của tôi kiểm tra tất cả các lần vượt qua, điều đó có nghĩa là chương trình của tôi sẽ hoạt động ngay cả một số lỗi ẩn tồn tại. Vì vậy, tìm / sửa các lỗi này không thực sự ưu tiên cao trừ khi chúng bắt đầu phá vỡ các kiểm tra tích hợp trong tương lai hoặc gây ra vấn đề về hiệu năng)

Và chúng tôi luôn muốn viết ít mã hơn, nhưng viết các bài kiểm tra đơn vị cần nhiều mã hơn (chủ yếu là thiết lập các đối tượng giả). Sự khác biệt giữa một số bài kiểm tra đơn vị của tôi và kiểm tra tích hợp là trong các bài kiểm tra đơn vị, tôi sử dụng đối tượng giả và trong các bài kiểm tra tích hợp, tôi sử dụng đối tượng thực. Có nhiều sự trùng lặp và tôi không thích mã trùng lặp, ngay cả trong các thử nghiệm vì điều này thêm chi phí để thay đổi hành vi mã (công cụ tái cấu trúc không thể làm tất cả công việc mọi lúc).


Vì tò mò, các bài kiểm tra tích hợp của bạn có bao nhiêu? Ngoài ra, nếu bạn có một số logic phức tạp, các bài kiểm tra tích hợp của bạn có bao gồm tất cả chúng hay chỉ là một phần của nó và phần nào, quan trọng đối với doanh nghiệp hoặc ngẫu nhiên?
thường dân

Câu hỏi này có vẻ mơ hồ. Giả sử tôi có một phương thức điều khiển Rails gọi một trình tương tác ( github.com/collectiveidea/interactor ). Tôi đã quyết định viết các bài kiểm tra tích hợp cho phương thức điều khiển của mình (vì không có chúng tôi không thể tin tưởng rằng điểm cuối API của tôi hoạt động). Có ít nhất hai câu hỏi ở đây: (1) tôi cũng nên viết bài kiểm tra đơn vị cho các phương thức điều khiển của mình (nghĩa là tôi có nên viết bài kiểm tra đơn vị kiểm tra hành vi tương tự như bài kiểm tra tích hợp của tôi không) và (2) tôi cũng nên viết bài kiểm tra đơn vị cho người tương tác của tôi? Tôi sẽ trả lời hai câu hỏi này khác nhau trong các bối cảnh kinh doanh nhất định.
Daniel

Câu trả lời:


33

Bạn đã đưa ra các lập luận tốt cho và chống lại thử nghiệm đơn vị. Vì vậy, bạn phải tự hỏi : " Tôi có thấy giá trị trong các lý lẽ tích cực vượt xa chi phí trong các tiêu cực không? " Tôi chắc chắn làm:

  • Nhỏ và nhanh là một khía cạnh tốt đẹp của thử nghiệm đơn vị, mặc dù không có nghĩa là quan trọng nhất.
  • Định vị-bug [s] -easier là vô cùng quý giá. Nhiều nghiên cứu về phát triển phần mềm chuyên nghiệp đã chỉ ra rằng chi phí của một lỗi tăng lên nhanh chóng khi nó già đi và chuyển xuống đường ống phân phối phần mềm.
  • Tìm kiếm-mặt nạ-lỗi là có giá trị. Khi bạn biết rằng một thành phần cụ thể có tất cả các hành vi của nó được xác minh, bạn có thể sử dụng nó theo cách mà trước đây nó không được sử dụng, với sự tự tin. Nếu xác minh duy nhất là thông qua kiểm tra tích hợp, bạn chỉ biết rằng việc sử dụng hiện tại của nó hoạt động chính xác.
  • Mocking là tốn kém trong các trường hợp thực tế, và duy trì giả là gấp đôi như vậy. Trong thực tế, khi chế nhạo các đối tượng hoặc giao diện "thú vị", bạn thậm chí có thể cần các bài kiểm tra xác minh rằng các đối tượng giả của bạn mô hình chính xác các đối tượng thực của bạn!

Trong cuốn sách của tôi, những ưu điểm vượt trội hơn những nhược điểm.


2
Không chế giễu rẻ hơn trong các trường hợp thực tế? Bạn chỉ thiết lập những kỳ vọng về những thông điệp mà giả sẽ nhận được và chỉ định những gì nó sẽ trả lại.
Dogweather

10
@Dogweather Mocks hoạt động tốt khi lần đầu tiên được tạo. Khi thời gian trôi qua và đối tượng thực sự bị thay đổi, các giả thiết phải thay đổi theo nó. 10 năm và 6.000 bài kiểm tra đơn vị, rất khó để biết rằng các bài kiểm tra "thành công" của bạn thực sự thành công.
Ross Patterson

1
Bên cạnh đó, "10 năm và 6.000 bài kiểm tra đơn vị" là những con số từ kinh nghiệm cá nhân, không phải cường điệu.
Ross Patterson

3
Tôi đã bắt đầu viết các bài kiểm tra dành cho nhà phát triển tự động (đơn vị và tích hợp, nhưng chủ yếu là sau này) vào năm 2004 hoặc 2005 và đã phát triển một thư viện mô phỏng nâng cao cho Java. Nhiều lần tôi thấy nhiều bài kiểm tra tích hợp vi phạm với lý do tương tự (như một sự thay đổi trong DB, hoặc một sự thay đổi mạng), và đôi khi tôi viết bài kiểm tra tích hợp cho các thành phần tái sử dụng "hạ cấp", nhưng vẫn còn, tôi rất thích để chỉ có kiểm tra tích hợp. Các thử nghiệm đơn vị bị cô lập với chế độ chế giễu, hầu hết thời gian, chỉ là không đáng; Tôi chỉ áp dụng chế giễu như một sự trợ giúp cho các bài kiểm tra tích hợp.
Rogério

Điểm đạn cuối cùng của bạn dường như mâu thuẫn với lập luận bạn đang đưa ra. Trong gạch đầu dòng này, bạn đang thực hiện trường hợp chống lại việc viết các giả thiết không cần thiết, đó là một lập luận chống lại việc viết các bài kiểm tra đơn vị cho các phần đã được bao phủ bởi các bài kiểm tra tích hợp. Tuy nhiên, sự thúc đẩy của cuộc tranh luận của bạn là ủng hộ việc viết các bài kiểm tra đơn vị cho các phần đã được bao phủ bởi các bài kiểm tra tích hợp. Bạn có thể vui lòng làm rõ ý định của bạn ở đây @RossPatterson?
Daniel

8

Tôi không thấy nhiều giá trị trong việc thực hiện lại một testcase tích hợp hiện có là không đáng tin cậy.

Các kiểm tra tích hợp thường dễ dàng hơn nhiều để viết cho các ứng dụng kế thừa không phải vì thường các chức năng cần kiểm tra được kết hợp chặt chẽ để các đơn vị kiểm tra cách ly (= không đáng tin) có thể bị phân tán / tốn kém / không thể.

> Then what are the reasons to write/add unit tests?

Theo tôi, phát triển theo hướng kiểm thử là hiệu quả nhất nếu bạn viết các bài kiểm tra đơn vị trước mã thực tế. Bằng cách này, mã hoàn thành các bài kiểm tra trở nên tách biệt rõ ràng với tối thiểu các tham chiếu bên ngoài có thể kiểm tra dễ dàng.

Nếu mã đã tồn tại mà không có kiểm thử đơn vị thì thường phải viết thêm các bài kiểm tra đơn vị sau đó vì mã không được viết để kiểm tra dễ dàng.

Nếu bạn làm TDD, mã tự động rất dễ kiểm tra.


2
Nếu tôi có một ứng dụng kế thừa không có unit-testsvà tôi muốn đưa unit-testsvào một số phần nhất định, bạn có nghĩ rằng tốt hơn hết là trước tiên hãy viết mã integration testscho di sản. Một khi nó được viết, sau đó bạn có thể tách rời khớp nối chặt chẽ, và tạo các chức năng với các giao diện có thể được kiểm tra? Vì bạn integration-testđã viết rồi, nên bạn có thể xác minh ở mỗi bước tái cấu trúc, rằng phiên bản mới của mã vẫn hoạt động như mong muốn không?
alpha_989

2
@ alpha_989, đây là IMHO rất nhiều và tôi sẵn sàng nghe những ý tưởng khác, nhưng tôi thích Kiểm tra tích hợp hơn Kiểm tra đơn vị cho Mã kế thừa. Trong cả hai trường hợp, bạn sẽ phải chắc chắn rằng các phương thức đang hoạt động chính xác trước khi thêm bất kỳ loại thử nghiệm nào, nhưng Kiểm thử tích hợp đảm bảo rằng các kỳ vọng chung của các phương thức đang hoạt động trái ngược với các yếu tố mã riêng lẻ.
Britt Wescott

5

Kiểm tra tích hợp chỉ nên xác minh rằng một số thành phần đang hoạt động cùng nhau như mong đợi. Việc logic của các thành phần riêng lẻ có chính xác hay không nên được xác minh bằng các thử nghiệm đơn vị.
Hầu hết các phương thức có một số đường dẫn thực thi có thể; nghĩ về if-then-other, các biến đầu vào có giá trị sai bất ngờ hoặc đơn giản, v.v. Thông thường các nhà phát triển có xu hướng chỉ nghĩ về đường dẫn hạnh phúc: đường dẫn bình thường không sai. Nhưng theo như những đường dẫn khác có liên quan, bạn có hai tùy chọn: bạn có thể cho phép người dùng cuối khám phá những đường dẫn đó thông qua các hành động họ thực hiện trong UI và hy vọng họ không làm hỏng ứng dụng của bạn hoặc bạn có thể viết bài kiểm tra đơn vị khẳng định hành vi của những con đường khác và hành động khi cần thiết.


4

Một số lý do bạn đã chỉ ra trong câu hỏi của mình thực sự quan trọng và bản thân họ rất có thể đưa ra trường hợp có lợi cho thử nghiệm đơn vị, nhưng YMMV. Chẳng hạn, bạn có thường xuyên chạy bộ kiểm thử tích hợp của mình không? Kinh nghiệm của tôi với các bài kiểm tra tích hợp là sớm hay muộn chúng sẽ chậm đến mức bạn sẽ không chạy chúng mỗi khi bạn thực hiện thay đổi và thời gian giữa việc chèn và phát hiện lỗi sẽ tăng lên.

Ngoài ra, một sai lầm lớn bạn có thể mắc phải là tin tưởng rằng

Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.

không quan trọng. Bạn có mong đợi rằng người dùng của bạn tìm thấy các lỗi cho bạn? Theo tôi, bảo hiểm thu được từ các bài kiểm tra tích hợp rất nguy hiểm, bạn có thể dễ dàng nhận được phần trăm bảo hiểm cao nhưng thực tế bạn đang kiểm tra rất ít.

Tôi đoán tài liệu tham khảo chính tắc chống lại các bài kiểm tra tích hợp là bài đăng của JBrains:

http://www.jbrains.ca/permalink/integrated-tests-are-a-scam-part-1

trong trường hợp bạn chưa đọc chúng.

Cuối cùng, IMO phản hồi bạn có thể nhận được từ các bài kiểm tra đơn vị cho thiết kế của bạn là vô giá. Đánh giá một thiết kế bằng cảm giác ruột và dựa vào các bài kiểm tra tích hợp cũng có thể là một sai lầm.


Tôi không thực sự có được bài viết đó. Vì vậy, có rất nhiều đường dẫn mã và kiểm tra tích hợp không thể bao gồm tất cả ... vậy sao? Điều tương tự áp dụng cho các bài kiểm tra đơn vị trừ khi các đơn vị của bạn quá tầm thường đến mức vô nghĩa.
Casey

Điều đó giống như một cuộc tranh luận chống lại việc sửa lỗi về phạm vi bảo hiểm của mã hơn là một cuộc tranh luận mà bạn nên viết một tấn các bài kiểm tra đơn vị và tránh các bài kiểm tra tích hợp.
Casey

1

Nếu bạn muốn phải sửa đổi hoặc cấu trúc lại mã của mình, việc kiểm tra đơn vị là điều cần thiết. Các thử nghiệm đơn vị tồn tại không chỉ để chứng minh các lỗi tại thời điểm mã được viết, mà còn hiển thị khi các lỗi mới xuất hiện khi có nhiều mã được viết.

Vâng, tốt hơn hết là viết bài kiểm tra tích hợp và đơn vị của bạn trước, nhưng sẽ có rất nhiều giá trị để có chúng ngay cả khi chúng được viết sau.


3
Tôi không cảm thấy bạn đã làm cho trường hợp. Các thử nghiệm tích hợp cũng sẽ tiết lộ các lỗi trong mã và trên thực tế có khả năng bắt các lỗi mà các thử nghiệm đơn vị sẽ không xảy ra.
Casey
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.