TL; DR
Viết các bài kiểm tra tốt, hữu ích là khó, và có chi phí cao trong C ++. Bạn có thể phát triển kinh nghiệm chia sẻ lý do của bạn về những gì và khi nào cần kiểm tra?
Câu chuyện dài
Tôi đã từng thực hiện phát triển dựa trên thử nghiệm, trên thực tế, toàn bộ nhóm của tôi, nhưng nó không hoạt động tốt cho chúng tôi. Chúng tôi có nhiều thử nghiệm, nhưng dường như chúng không bao giờ bao gồm các trường hợp chúng tôi có lỗi và hồi quy thực tế - thường xảy ra khi các đơn vị tương tác, không phải từ hành vi biệt lập của chúng.
Điều này thường rất khó kiểm tra ở cấp độ đơn vị đến nỗi chúng tôi đã ngừng thực hiện TDD (ngoại trừ các thành phần thực sự tăng tốc độ phát triển), và thay vào đó đầu tư nhiều thời gian hơn để tăng phạm vi kiểm tra tích hợp. Trong khi các thử nghiệm đơn vị nhỏ không bao giờ bắt gặp bất kỳ lỗi thực sự nào và về cơ bản chỉ là bảo trì trên không, các thử nghiệm tích hợp đã thực sự đáng nỗ lực.
Bây giờ tôi đã kế thừa một dự án mới và đang tự hỏi làm thế nào để thử nghiệm nó. Đây là một ứng dụng C ++ / OpenGL riêng, vì vậy các bài kiểm tra tích hợp không thực sự là một lựa chọn. Nhưng kiểm thử đơn vị trong C ++ khó hơn một chút so với Java (bạn phải tạo ra công cụ một cách rõ ràng virtual
) và chương trình không hướng đối tượng nhiều, vì vậy tôi không thể chế giễu / bỏ đi một số thứ.
Tôi không muốn tách ra và OO-ize toàn bộ chỉ để viết một số bài kiểm tra vì mục đích viết bài kiểm tra. Vì vậy, tôi đang hỏi bạn: Tôi nên viết bài kiểm tra để làm gì? ví dụ:
- Chức năng / Lớp học mà tôi mong đợi sẽ thay đổi thường xuyên?
- Chức năng / Lớp khó kiểm tra thủ công hơn?
- Chức năng / Lớp dễ kiểm tra chưa?
Tôi bắt đầu điều tra một số cơ sở mã C ++ đáng kính để xem họ tiến hành thử nghiệm như thế nào. Ngay bây giờ tôi đang xem xét mã nguồn Chromium, nhưng tôi thấy thật khó để trích xuất lý do thử nghiệm của họ từ mã. Nếu bất cứ ai có một ví dụ hay bài đăng về cách người dùng C ++ phổ biến (những người trong ủy ban, tác giả sách, Google, Facebook, Microsoft, ...) tiếp cận điều này, điều đó sẽ rất hữu ích.
Cập nhật
Tôi đã tìm kiếm theo cách của tôi xung quanh trang web này và web kể từ khi viết này. Tìm thấy một số thứ tốt:
- Khi nào thì thích hợp để không kiểm tra đơn vị?
- /programming/109432/what-not-to-test-when-it- results-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
Đáng buồn thay, tất cả những thứ này khá là Java / C # centric. Viết nhiều bài kiểm tra bằng Java / C # không phải là một vấn đề lớn, vì vậy lợi ích thường vượt xa chi phí.
Nhưng như tôi đã viết ở trên, nó khó hơn trong C ++. Đặc biệt nếu cơ sở mã của bạn không phải là OO, bạn phải làm rối tung mọi thứ để có được phạm vi kiểm tra đơn vị tốt. Ví dụ: Ứng dụng tôi được kế thừa có một Graphics
không gian tên là một lớp mỏng phía trên OpenGL. Để kiểm tra bất kỳ thực thể nào - tất cả đều sử dụng trực tiếp các chức năng của nó - tôi phải biến nó thành một giao diện và một lớp và đưa nó vào tất cả các thực thể. Đó chỉ là một ví dụ.
Vì vậy, khi trả lời câu hỏi này, xin lưu ý rằng tôi phải đầu tư khá lớn cho bài kiểm tra viết.