Kiểm thử đơn vị - đặc biệt là trong C ++ - yêu cầu từ mã được kiểm tra để thêm nhiều đường nối sẽ được gọi đúng cho một vấn đề nhất định.
Chỉ khi bạn không xem xét việc kiểm tra một phần không thể thiếu trong việc giải quyết vấn đề. Đối với bất kỳ vấn đề không cần thiết nào, nó phải là, không chỉ trong thế giới phần mềm.
Trong thế giới phần cứng, điều này đã được học từ lâu - một cách khó khăn. Các nhà sản xuất các thiết bị khác nhau đã học được qua nhiều thế kỷ từ vô số cây cầu rơi, xe nổ, CPU hút thuốc, v.v. những gì chúng ta đang học trong thế giới phần mềm. Tất cả họ xây dựng "các đường nối thêm" vào các sản phẩm của mình để làm cho chúng có thể kiểm tra được. Hầu hết các xe mới hiện nay đều có cổng chẩn đoán cho thợ sửa chữa để lấy dữ liệu về những gì đang diễn ra bên trong động cơ. Một phần đáng kể của các bóng bán dẫn trên mỗi CPU phục vụ mục đích chẩn đoán. Trong thế giới phần cứng, mỗi bit chi phí "thêm" và khi một sản phẩm được sản xuất bởi hàng triệu người, những chi phí này chắc chắn sẽ cộng thêm một khoản tiền lớn. Tuy nhiên, các nhà sản xuất sẵn sàng chi tất cả số tiền này cho khả năng kiểm tra.
Quay trở lại thế giới phần mềm, C ++ thực sự khó kiểm tra đơn vị hơn các ngôn ngữ sau này có tính năng tải lớp động, phản xạ, v.v. Tuy nhiên, hầu hết các vấn đề có thể được giảm thiểu ít nhất. Trong một dự án C ++ mà tôi đã sử dụng các bài kiểm tra đơn vị cho đến nay, chúng tôi đã không chạy các bài kiểm tra thường xuyên như trong một dự án Java - nhưng chúng vẫn là một phần của bản dựng CI của chúng tôi và chúng tôi thấy chúng hữu ích.
Là cách mà các Thử nghiệm đơn vị yêu cầu một để cấu trúc mã của ứng dụng "chỉ" có lợi cho các thử nghiệm đơn vị hay nó thực sự có lợi cho cấu trúc ứng dụng?
Theo kinh nghiệm của tôi, một thiết kế có thể kiểm tra là có lợi về tổng thể, không phải "chỉ" cho bản thân các bài kiểm tra đơn vị. Những lợi ích này đến ở các cấp độ khác nhau:
- Làm cho thiết kế của bạn có thể kiểm tra được sẽ buộc bạn chia nhỏ ứng dụng của mình thành các phần nhỏ, ít nhiều độc lập, chỉ có thể ảnh hưởng lẫn nhau theo những cách hạn chế và được xác định rõ - điều này rất quan trọng đối với tính ổn định và khả năng duy trì lâu dài của chương trình của bạn. Không có điều này, mã có xu hướng xấu đi thành mã spaghetti trong đó bất kỳ thay đổi nào được thực hiện trong bất kỳ phần nào của cơ sở mã có thể gây ra hiệu ứng không mong muốn trong các phần dường như không liên quan của chương trình. Không cần phải nói, là cơn ác mộng của mọi lập trình viên.
- Tự viết các bài kiểm tra theo kiểu TDD thực sự thực hiện các API, lớp và phương thức của bạn và đóng vai trò là một bài kiểm tra rất hiệu quả để phát hiện xem thiết kế của bạn có hợp lý hay không - nếu viết bài kiểm tra và giao diện cảm thấy khó xử hoặc khó khăn, bạn sẽ nhận được phản hồi sớm có giá trị vẫn dễ dàng định hình API. Nói cách khác, điều này bảo vệ bạn khỏi việc xuất bản API sớm.
- Mô hình phát triển được thực thi bởi TDD giúp bạn tập trung vào (các) nhiệm vụ cụ thể cần thực hiện và giúp bạn đạt mục tiêu, giảm thiểu khả năng bạn đi lang thang giải quyết các vấn đề khác ngoài nhiệm vụ bạn cần, thêm các tính năng bổ sung không cần thiết và phức tạp v.v.
- Phản hồi nhanh của các bài kiểm tra đơn vị cho phép bạn mạnh dạn trong việc tái cấu trúc mã, cho phép bạn liên tục điều chỉnh và phát triển thiết kế trong suốt vòng đời của mã, do đó ngăn chặn entropy mã một cách hiệu quả.
Tôi nhớ một quy tắc ngón tay cái nói rằng không khái quát cho đến khi bạn cần / cho đến khi có một vị trí thứ hai sử dụng mã. Với Bài kiểm tra đơn vị, luôn có một vị trí thứ hai sử dụng mã - cụ thể là bài kiểm tra đơn vị. Vậy lý do này có đủ để khái quát?
Nếu bạn có thể chứng minh rằng phần mềm của bạn thực hiện chính xác những gì nó phải làm - và chứng minh phần mềm đó một cách nhanh chóng, có thể lặp lại, rẻ tiền và đủ tính quyết định để làm hài lòng khách hàng của bạn - mà không cần khái quát hóa "thêm" bởi các bài kiểm tra đơn vị, hãy thử (và cho chúng tôi biết làm thế nào bạn làm điều đó, bởi vì tôi chắc chắn rất nhiều người trên diễn đàn này sẽ quan tâm như tôi :-)
Btw Tôi giả sử bằng cách "khái quát hóa", ý bạn là những thứ như giới thiệu một giao diện (lớp trừu tượng) và đa hình thay vì một lớp cụ thể - nếu không, xin vui lòng làm rõ.