Trong 1 bài diễn thuyết cho lập trình viên, Joe Rainsberger đã phát biểu 1 câu rất mạnh: "Intergrated Test là bọn lừa đảo. Tụi nó sẽ phá huỷ cuộc đời bạn và sẽ làm bạn phát điên." Tại sao Joe lại nói vậy khi mà bên cạnh Unit Test, Integrated Test là một công cụ căn bản nhất mà chúng ta từ trước đến nay vẫn hay dùng.

Định nghĩa

  • Intergrated test là những test mà có nhiều hơn 1 component liên hệ với nhau.
  • Trái ngược với Unit Test là những test được cô lập, chỉ test chức năng của 1 component duy nhất.

Và theo như Joe, mọi thứ tội tệ sẽ xảy ra là vì cái sự không độc lập giữa các component như thế này khi chúng ta test. Để nhấn mạnh hơn tầm quan trọng của việc cô lập này, Joe còn đề xuất đổi tên Unit Test thành Isolated Test

Tại sao Intergrated test lại ko tốt?

Trong 1 test mà có nhiều component của code nói chuyện với nhau, thì khi test đó fail thì chúng ta ko đủ thông tin để giải thích ngay rằng test fail vì cái gì. Lúc này test của chúng ta chỉ có 1 nhiệm vụ duy nhất là kiểm tra xem code có còn chạy được hay ko, chứ ko còn đúng với ý nghĩa của test trong TDD (Test Driven Development)

Nhiệm vụ quan trong nhất của TDD là giúp chúng ta thiết kế hệ thống tốt hơn (phân tách các module tốt hơn). Và thật sự thì Isolated test chính là công cụ giúp chúng ta đạt được điều này. Khi chúng ta bỏ quá nhiều thời gian để viết Intergrated Test, đồng nghĩa với sẽ còn ít thời gian hơn để viết Isolated Test, dẫn đến code của chúng ta sẽ không được thiết kế tốt, dẫn đến hệ thống sẽ dễ sinh ra bug hơn. Mà khi nhiều bug hơn thì ta lại viết nhiều Intergrated test hơn để đảm bảo là các bug đã được tìm ra ko xảy ra nữa. Thế là tạo thành 1 cái vòng luẩn quẩn.

Chúng ta ko thể nào cover hết tất cả các trường hợp của code bằng Intergrated Test được vì để làm được điều này chúng ta cần phải viết một số lượng O(n!) test, với n là số trường hợp trung bình của 1 component hệ thống. O(n!) là một con số cực kì lớn và không có cách nào chúng ta có thể cover hết được, và lẽ hiển nhiên là chúng ta không thể nào trông cậy hoàn toàn vào intergrated test để đảm bảo chất lượng cho sản phẩm được.

Vậy làm cách nào chúng ta có thể viết ít Intergrated Test hơn nhưng vẫn đảm bảo là hệ thống well-tested?

Câu trả lời là thay thế Intergrated Test bằng Contract Test và Collaboration Test, càng nhiều càng tốt !!!

Contract Test

Với mục tiêu là các component càng cô lập với nhau càng tốt, thì các component sẽ tương tác với thông qua 1 interface. Giả sử 1 ví dụ mà component C cần tương tác với component S. Lúc này S sẽ dựng lên 1 interface, trong ngôn ngữ lập trình sẽ là 1 nhóm các public method của S. C sẽ chỉ tương tác với S thông qua interface này.

Nhiệm vụ của S lúc này sẽ là đảm bảo interface này hoạt động đúng như nó hứa. Đây gọi là contract giữa S và các component sẽ sử dụng interface của nó.

Bằng cách viết 1 loạt Contract test, S sẽ đảm bảo là interface của nó sẽ luôn phục vụ đúng cho các component sử dụng.

Contract Test về bản chất sẽ giống như Unit Test, nó vẫn có tính cô lập cao, do đó test sẽ dễ viết và chạy nhanh.

Collaboration test

Sau khi component S giữ đúng lời hứa là interface của nó sẽ hoạt động đúng, thì chỉ cần component C sử dụng đúng interface này, thì mọi chuyện sẽ ổn thoả. Đây cũng chính là nhiệm vụ của Collaboration Test.

Chúng ta viết Collaboration Test những khi các component C cần sử dụng interface của component S. Collaboration Test giúp chúng ta đảm bảo là C sử dụng đúng interface này. Các trường hợp sử dụng ko đúng có thể là: gọi hàm với param sai, chỉ cần gọi hàm 1 lần nhưng hàm đó lại bị gọi tới 2 lần, thậm chí hàm đó ko được gọi luôn,...

Collaboration vẫn sẽ được cô lập nếu như chúng ta, dựa trên contract, biết trước kết quả của việc sự dụng interface này. Từ đây dẫn đến khái niệm stub object và mock object.

Kết luận

Bằng cách áp dụng Contract Test và Collaboration Test mỗi khi 2 component cần tương tác với nhau, chúng ta có thể lược bỏ rất nhiều trường hợp của intergration test mà vẫn đảm bảo được hệ thống vận hành đúng. Bên cạnh đó chúng ta cũng đạt được mục đích tối thượng: biến tất cả test thành isolated test.

http://r.grokking.org/video-integration-test-is-a-scam