Trong khi, tất cả tôi đều dành cho thử nghiệm đơn vị, đôi khi tôi tự hỏi liệu hình thức phát triển thử nghiệm đầu tiên này có thực sự mang lại lợi ích hay không ...
Các bài kiểm tra nhỏ, tầm thường như thế này có thể là "con chim hoàng yến trong mỏ than" cho cơ sở mã của bạn, cảnh báo nguy hiểm trước khi quá muộn. Các thử nghiệm nhỏ rất hữu ích để duy trì vì chúng giúp bạn thực hiện đúng các tương tác.
Ví dụ: hãy nghĩ về một thử nghiệm nhỏ được thực hiện để thăm dò cách sử dụng API mà bạn không quen thuộc. Nếu kiểm tra đó có bất kỳ liên quan nào đến những gì bạn đang làm trong mã sử dụng API "cho thực tế", thì việc duy trì kiểm tra đó sẽ rất hữu ích. Khi API phát hành phiên bản mới và bạn cần nâng cấp. Bây giờ bạn có các giả định về cách bạn mong đợi API hoạt động được ghi lại ở định dạng thực thi mà bạn có thể sử dụng để bắt các hồi quy.
... [I] na là quy trình thực, bạn có 3-4 lớp phía trên mã của mình (Yêu cầu kinh doanh, Tài liệu yêu cầu, Tài liệu kiến trúc), trong đó quy tắc kinh doanh được xác định thực tế (Giá chiết khấu là Giá - Chiết khấu) có thể được xác định sai. Nếu đó là tình huống, bài kiểm tra đơn vị của bạn không có ý nghĩa gì đối với bạn.
Nếu bạn đã viết mã trong nhiều năm mà không viết các bài kiểm tra, bạn có thể không thấy ngay rằng có bất kỳ giá trị nào. Nhưng nếu bạn có suy nghĩ rằng cách tốt nhất để làm việc là "phát hành sớm, phát hành thường xuyên" hoặc "nhanh nhẹn" trong đó bạn muốn khả năng triển khai nhanh / liên tục, thì thử nghiệm của bạn chắc chắn có ý nghĩa. Cách duy nhất để làm điều này là hợp pháp hóa mọi thay đổi bạn thực hiện đối với mã bằng một bài kiểm tra. Bất kể thử nghiệm nhỏ đến mức nào, một khi bạn có bộ thử nghiệm xanh, về mặt lý thuyết, bạn có thể triển khai. Xem thêm "sản xuất liên tục" và "phiên bản beta vĩnh viễn."
Bạn cũng không cần phải "kiểm tra đầu tiên" để có được tư duy này, nhưng đó nói chung là cách hiệu quả nhất để đạt được điều đó. Khi bạn thực hiện TDD, bạn tự nhốt mình vào chu kỳ Tái cấu trúc màu xanh đỏ nhỏ từ hai đến ba phút. Chẳng có lúc nào bạn không thể dừng lại và rời đi và có một mớ hỗn độn hoàn chỉnh trên tay mà bạn sẽ mất một giờ để gỡ lỗi và lắp lại.
Ngoài ra, bài kiểm tra đơn vị của bạn là một điểm thất bại khác ...
Một bài kiểm tra thành công là một bài kiểm tra chứng tỏ sự thất bại trong hệ thống. Một bài kiểm tra không đạt sẽ cảnh báo bạn về một lỗi trong logic của bài kiểm tra hoặc trong logic của hệ thống của bạn. Mục tiêu của các bài kiểm tra là phá vỡ mã của bạn hoặc chứng minh một kịch bản hoạt động.
Nếu bạn đang viết các bài kiểm tra sau khi viết mã, bạn sẽ có nguy cơ viết một bài kiểm tra "xấu" bởi vì để thấy rằng bài kiểm tra của bạn thực sự hoạt động, bạn cần phải xem nó bị hỏng và hoạt động. Khi bạn đang viết các bài kiểm tra sau mã, điều này có nghĩa là bạn phải "giăng bẫy" và đưa một lỗi vào mã để kiểm tra không thành công. Hầu hết các nhà phát triển không chỉ không thoải mái về điều này mà còn cho rằng đó là một sự lãng phí thời gian.
Chúng ta đạt được gì ở đây?
Chắc chắn có một lợi ích khi làm mọi thứ theo cách này. Michael Feathers định nghĩa "mã kế thừa" là "mã chưa được kiểm tra". Khi bạn thực hiện phương pháp này, bạn hợp pháp hóa mọi thay đổi bạn thực hiện đối với cơ sở mã của mình. Nó khắt khe hơn việc không sử dụng các bài kiểm tra, nhưng khi nói đến việc duy trì một cơ sở mã lớn, nó sẽ tự trả tiền.
Nói về Feathers, có hai tài nguyên tuyệt vời mà bạn nên kiểm tra về vấn đề này:
Cả hai điều này đều giải thích cách thực hiện các loại thực hành và kỷ luật này vào các dự án không phải là "Greenfield". Họ cung cấp các kỹ thuật để viết các bài kiểm tra xung quanh các thành phần được kết hợp chặt chẽ, phụ thuộc có dây cứng và những thứ mà bạn không nhất thiết phải kiểm soát. Đó là tất cả về việc tìm kiếm "đường nối" và thử nghiệm xung quanh chúng.
[Tôi] nếu giá chiết khấu là sai, nhóm thử nghiệm vẫn sẽ tìm ra vấn đề, làm thế nào mà thử nghiệm đơn vị đã tiết kiệm được bất kỳ công việc nào?
Những thói quen như thế này giống như một khoản đầu tư. Lợi nhuận không ngay lập tức; chúng tích tụ theo thời gian. Giải pháp thay thế cho việc không thử nghiệm về cơ bản là gánh nợ không thể bắt các hồi quy, giới thiệu mã mà không sợ lỗi tích hợp hoặc quyết định thiết kế. Cái hay là bạn hợp pháp hóa mọi thay đổi được đưa vào codebase của bạn.
Tôi còn thiếu gì ở đây? Xin hãy dạy tôi yêu TDD, vì tôi đang rất khó chấp nhận nó là hữu ích cho đến nay. Tôi cũng muốn, vì tôi muốn tiếp tục tiến bộ, nhưng nó không có ý nghĩa gì đối với tôi.
Tôi xem đó như một trách nhiệm nghề nghiệp. Đó là một lý tưởng để phấn đấu. Nhưng nó rất khó để làm theo và tẻ nhạt. Nếu bạn quan tâm đến nó và cảm thấy bạn không nên tạo ra mã không được kiểm tra, bạn sẽ có thể tìm thấy sức mạnh ý chí để học các thói quen kiểm tra tốt. Một điều mà tôi làm rất nhiều bây giờ (cũng như những người khác) là tự mình đặt hộp thời gian một giờ để viết mã mà không cần bất kỳ bài kiểm tra nào, sau đó có kỷ luật để vứt bỏ nó. Điều này có vẻ lãng phí nhưng thực sự không phải vậy. Nó không giống như việc tập thể dục tiêu tốn tài liệu vật chất của công ty. Nó giúp tôi hiểu được vấn đề và cách viết mã theo cách có chất lượng cao hơn và có thể kiểm tra được.
Lời khuyên của tôi cuối cùng sẽ là nếu bạn thực sự không có mong muốn trở thành người giỏi nó, thì đừng làm điều đó. Các bài kiểm tra kém không được duy trì, không hoạt động tốt, v.v. có thể tồi tệ hơn là không có bất kỳ bài kiểm tra nào. Thật khó để tự học và có thể bạn sẽ không yêu thích nó, nhưng bạn sẽ không thể học được nếu bạn không có mong muốn thực hiện nó hoặc không thể thấy đủ giá trị của nó để đảm bảo đầu tư thời gian.
Một số người vẫn đề cập rằng thử nghiệm giúp thực thi thông số kỹ thuật. Theo kinh nghiệm của tôi, thông số kỹ thuật cũng bị sai, thường xuyên hơn là không ...
Bàn phím của một nhà phát triển là nơi mà cao su gặp mặt đường. Nếu thông số kỹ thuật sai và bạn không giơ cờ về nó, thì rất có thể bạn sẽ bị đổ lỗi cho nó. Hoặc ít nhất mã của bạn sẽ. Kỷ luật và sự nghiêm ngặt liên quan đến thử nghiệm rất khó tuân thủ. Nó không dễ dàng chút nào. Nó cần thực hành, rất nhiều học hỏi và rất nhiều sai lầm. Nhưng cuối cùng nó cũng được đền đáp. Trong một dự án có nhịp độ nhanh, thay đổi nhanh chóng, đó là cách duy nhất để bạn có thể ngủ vào ban đêm, bất kể nó có làm bạn chậm lại hay không.
Một điều khác cần suy nghĩ ở đây là các kỹ thuật về cơ bản giống như kiểm thử đã được chứng minh là hoạt động trong quá khứ: "phòng sạch" và "thiết kế theo hợp đồng" đều có xu hướng tạo ra các loại cấu trúc "meta" -code giống nhau. kiểm tra thực hiện và thực thi chúng ở các điểm khác nhau. Không có kỹ thuật nào trong số này là những viên đạn bạc và sự khắt khe cuối cùng sẽ khiến bạn phải trả giá trong phạm vi các tính năng mà bạn có thể cung cấp về thời gian đưa ra thị trường. Nhưng đó không phải là những gì nó về. Đó là về khả năng duy trì những gì bạn cung cấp. Và điều đó rất quan trọng đối với hầu hết các dự án.