Trái với các câu trả lời khác, điều quan trọng cần lưu ý là một số cách kiểm tra có thể trở nên mong manh khi hệ thống được kiểm tra (SUT) được tái cấu trúc, nếu thử nghiệm là whitebox.
Nếu tôi đang sử dụng khung mô phỏng để xác minh thứ tự của các phương thức được gọi trên các giả (khi thứ tự không liên quan vì các cuộc gọi không có tác dụng phụ); sau đó nếu mã của tôi sạch hơn với các lệnh gọi phương thức đó theo một thứ tự khác và tôi cấu trúc lại, thì thử nghiệm của tôi sẽ bị hỏng. Nói chung, giả có thể giới thiệu sự mong manh cho các bài kiểm tra.
Nếu tôi đang kiểm tra trạng thái bên trong SUT của mình bằng cách hiển thị các thành viên riêng tư hoặc được bảo vệ của nó (chúng ta có thể sử dụng "bạn bè" trong cơ bản trực quan hoặc tăng mức độ truy cập "nội bộ" và sử dụng "internalsvisibleto" trong c #; trong nhiều ngôn ngữ OO, bao gồm cả c # a " phân lớp cụ thể kiểm tra " có thể được sử dụng) sau đó đột nhiên trạng thái bên trong của lớp sẽ có vấn đề - bạn có thể tái cấu trúc lớp dưới dạng hộp đen, nhưng kiểm tra hộp trắng sẽ thất bại. Giả sử một trường duy nhất được sử dụng lại có nghĩa là những thứ khác nhau (không phải là thông lệ tốt!) Khi SUT thay đổi trạng thái - nếu chúng ta chia nó thành hai trường, chúng ta có thể cần phải viết lại các bài kiểm tra bị hỏng.
Các lớp con đặc thù kiểm thử cũng có thể được sử dụng để kiểm tra các phương thức được bảo vệ - điều này có thể có nghĩa là một bộ tái cấu trúc theo quan điểm của mã sản xuất là một sự thay đổi đột phá từ quan điểm của mã kiểm thử. Di chuyển một vài dòng vào hoặc ra khỏi một phương thức được bảo vệ có thể không có tác dụng phụ sản xuất, nhưng phá vỡ một thử nghiệm.
Nếu tôi sử dụng " móc thử nghiệm " hoặc bất kỳ mã biên dịch cụ thể hoặc kiểm tra cụ thể nào khác, có thể khó đảm bảo rằng các thử nghiệm không bị phá vỡ do phụ thuộc mong manh vào logic bên trong.
Vì vậy, để ngăn các bài kiểm tra trở nên kết hợp với các chi tiết bên trong thân mật của SUT, có thể giúp:
Tất cả các điểm trên là ví dụ về khớp nối hộp trắng được sử dụng trong các thử nghiệm. Vì vậy, để tránh hoàn toàn việc tái cấu trúc các thử nghiệm phá vỡ, hãy sử dụng thử nghiệm hộp đen của SUT.
Tuyên bố miễn trừ trách nhiệm: Với mục đích thảo luận về tái cấu trúc ở đây, tôi đang sử dụng từ rộng hơn một chút để bao gồm thay đổi triển khai nội bộ mà không có bất kỳ tác động bên ngoài rõ ràng nào. Một số người theo chủ nghĩa thuần túy có thể không đồng ý và chỉ đề cập đến cuốn sách Tái cấu trúc của Martin Fowler và Kent Beck - mô tả các hoạt động tái cấu trúc nguyên tử.
Trong thực tế, chúng ta có xu hướng thực hiện các bước không phá vỡ lớn hơn một chút so với các hoạt động nguyên tử được mô tả ở đó và đặc biệt những thay đổi khiến mã sản xuất hoạt động giống hệt từ bên ngoài có thể không để các thử nghiệm đi qua. Nhưng tôi nghĩ thật công bằng khi bao gồm "thuật toán thay thế cho một thuật toán khác có hành vi giống hệt nhau" như một công cụ tái cấu trúc và tôi nghĩ Fowler đồng ý. Chính Martin Fowler nói rằng tái cấu trúc có thể phá vỡ các bài kiểm tra:
Khi bạn viết một bài kiểm tra giả, bạn đang kiểm tra các cuộc gọi đi của SUT để đảm bảo nó nói đúng với các nhà cung cấp của nó. Một thử nghiệm cổ điển chỉ quan tâm đến trạng thái cuối cùng - không phải là trạng thái đó được bắt nguồn như thế nào. Do đó, các thử nghiệm giả lập được kết hợp chặt chẽ hơn với việc thực hiện một phương pháp. Thay đổi bản chất của các cuộc gọi đến cộng tác viên thường khiến một bài kiểm tra giả bị phá vỡ.
[...]
Khớp nối với việc thực hiện cũng can thiệp vào tái cấu trúc, vì các thay đổi triển khai có nhiều khả năng phá vỡ các thử nghiệm hơn so với thử nghiệm cổ điển.
Fowler - Mocks không cuống