Một điều về kiểm thử tự động là nó yêu cầu bạn phải viết mã để có thể kiểm tra được. Bản thân đây không phải là một điều xấu (thực tế là nó tốt vì nó không khuyến khích nhiều thực tiễn mà theo quy tắc nên tránh), nhưng nếu bạn đang cố gắng áp dụng thử nghiệm đơn vị cho mã hiện tại thì có khả năng là không đã được viết một cách có thể kiểm chứng.
Những thứ như singletons, phương thức tĩnh, đăng ký, định vị dịch vụ, v.v ... giới thiệu các phụ thuộc rất khó để chế giễu. Vi phạm Luật Demeter có nghĩa là quá nhiều phần trong cơ sở mã của bạn biết quá nhiều về cách các phần khác của chức năng cơ sở mã của bạn, đưa ra các phụ thuộc ẩn khác có thể khó phá vỡ. Tất cả những điều này gây khó khăn cho việc cô lập một mô-đun khỏi phần còn lại của cơ sở mã và nếu bạn không thể kiểm tra các mô-đun của mình một cách riêng lẻ thì các kiểm tra đơn vị sẽ mất rất nhiều giá trị của chúng. Nếu thử nghiệm thất bại là do lỗi trong thiết bị được thử nghiệm hoặc do lỗi ở một trong các phụ thuộc của nó, hoặc có thể là do dữ liệu được kéo qua nguồn dữ liệu phụ thuộc không phải là điều mà người viết thử nghiệm mong đợi ? Nếu bạn có thể'
Hầu hết các cơ sở mã hóa mà tôi thấy rằng không được xây dựng với kiểm thử đơn vị có xu hướng không thể kiểm chứng được, vì các lập trình viên có xu hướng tập trung vào làm cho mã hoạt động như họ mong muốn thay vì thực hiện công việc cần thiết để giữ cho khớp nối lỏng lẻo và phụ thuộc rõ ràng . Mã được viết với thử nghiệm đơn vị trong tâm trí có xu hướng trông rất khác nhau.
Rất nhiều người áp dụng cách tiếp cận ngây thơ để thử nghiệm đơn vị khi họ bắt đầu thực hiện lần đầu tiên, họ nghĩ rằng họ chỉ có thể viết một loạt các thử nghiệm cho một cơ sở mã hiện tại và tất cả sẽ tốt, nhưng nó không bao giờ hoạt động theo cách đó vì các vấn đề nêu trên. Họ bắt đầu phát hiện ra rằng họ phải điều chỉnh số lượng thiết lập trong các bài kiểm tra đơn vị để khiến chúng chạy hoàn toàn, và kết quả thường bị nghi ngờ bởi vì thiếu mã tách biệt có nghĩa là bạn không thể theo dõi điều gì gây ra lỗi kiểm tra. Họ cũng có xu hướng bắt đầu thử viết các bài kiểm tra "thông minh" thể hiện một số khía cạnh trừu tượng cao về cách hệ thống nên hoạt động. Điều này có xu hướng thất bại bởi vì một bài kiểm tra đơn vị "thông minh" là một nguồn tiềm năng của lỗi. Đã thử nghiệm thất bại vì một lỗi trong mô-đun thử nghiệm, hoặc vì một lỗi trong bài kiểm tra? Một bài kiểm tra rất đơn giản đến nỗi rõ ràng không có khả năng một lỗi có thể ẩn trong đó. Trong thực tế, các bài kiểm tra tốt nhất hiếm khi dài hơn 2 dòng, dòng đầu tiên hướng dẫn đơn vị được kiểm tra thực hiện điều gì đó, lần thứ hai khẳng định rằng những gì nó đã làm là những gì được mong đợi.
Nếu nhóm của bạn nghiêm túc về việc áp dụng thử nghiệm đơn vị thì sẽ không khôn ngoan khi bắt đầu với một dự án hiện có. Các dự án hiện tại của nhóm bạn có thể không thể thực hiện được nếu không tái cấu trúc lớn. Tốt hơn hết là bạn nên sử dụng một dự án mới làm cơ sở để tìm hiểu về kiểm thử đơn vị, vì bạn có một bảng xếp hạng rõ ràng để làm việc. Bạn có thể thiết kế cơ sở mã mới để ưu tiên tiêm phụ thuộc vào singletons, đăng ký và các phụ thuộc ẩn khác, bạn có thể viết nó để phụ thuộc vào giao diện thay vì triển khai, v.v. Bạn cũng có thể (và nên) viết các bài kiểm tra bên cạnh mã đang được kiểm tra, vì việc viết các bài kiểm tra sau đó dẫn đến các bài kiểm tra đơn vị để đảm bảo mô-đun được kiểm tra thực hiện những gì bạn nghĩ nó có thể làm thay vì kiểm tra mà nó thực hiện. những gì các thông số kỹ thuật nói nó nên làm.
Khi bạn đã có được sự tự tin với thử nghiệm đơn vị, nhóm của bạn có thể sẽ bắt đầu nhận ra các lỗ hổng trong mã hiện tại của họ sẽ là trở ngại cho các thử nghiệm đơn vị. Đây là khi bạn có thể bắt đầu làm việc để cấu trúc lại mã hiện có để làm cho nó dễ kiểm tra hơn. Đừng tham vọng và cố gắng làm tất cả điều này cùng một lúc, hoặc cố gắng thay thế một hệ thống hoạt động với một hệ thống hoàn toàn mới, chỉ cần bắt đầu bằng cách tìm các bit của cơ sở mã có thể dễ dàng kiểm tra (những hệ thống không có bất kỳ phụ thuộc hoặc nơi phụ thuộc là rõ ràng) và viết bài kiểm tra cho những người phụ thuộc. Tôi biết tôi đã nói viết một bài kiểm tra bên cạnh mã tốt hơn là viết các bài kiểm tra sau đó, nhưng ngay cả một bài kiểm tra được viết sau đó vẫn có giá trị như một điểm khởi đầu. Viết các bài kiểm tra như thể bạn không biết gì về cách lớp hoạt động ngoài những thông số kỹ thuật của nó nói nó nên làm. Khi bạn chạy thử nghiệm và gặp thất bại, thì thông số kỹ thuật hoặc việc thực hiện là sai. Kiểm tra kỹ cả hai để xác định cái nào sai và cập nhật kiểm tra hoặc mã cho phù hợp.
Khi bạn đã chọn trái cây treo thấp, công việc thực sự của bạn bắt đầu. Bạn cần bắt đầu tìm các phụ thuộc ẩn trong cơ sở mã của mình và sửa chúng từng cái một. Tại thời điểm này, đừng quá tham vọng, chỉ cần thực hiện một mô-đun tại một thời điểm hoặc thậm chí chỉ một vấn đề duy nhất trong một mô-đun, cho đến khi các trở ngại để kiểm tra được khắc phục và bạn có thể chuyển sang bit tiếp theo.
TL: DR: Hầu hết mọi người nghĩ rằng kiểm tra là dễ dàng và bạn có thể cải thiện các kiểm tra thành mã hiện có một cách dễ dàng. Cả hai giả định này đều sai. Nếu bạn bắt tay vào một dự án để đưa thử nghiệm đơn vị vào các dự án của bạn với cả hai sự thật này, bạn sẽ có nhiều khả năng thành công hơn.