Sử dụng tiêu chuẩn ASSERT/Q_ASSERT, nhưng hãy cẩn thận của khẳng định "không hợp lệ", đặc biệt là nếu bạn để lại chẩn đoán như vậy trong thử nghiệm bên ngoài (xây dựng mà không cần NDEBUG).
Câu chuyện nhỏ liên quan đến việc triển khai DBC (sử dụng xác nhận) trong dự án C++ và chính sách "gỡ lỗi luôn được bật".
Chúng tôi đã sử dụng các công cụ khá chuẩn (ASSERT()/Q_ASSERT()) để triển khai DBC cho đến khi chúng tôi đạt được tình huống sau trong thử nghiệm tích hợp: phiên bản mới nhất của chúng tôi không thành công ngay sau khi bắt đầu. Nó không phải là rất chuyên nghiệp để phát hành phiên bản như vậy (sau tuần nỗ lực QA nội bộ).
Vấn đề đã được giới thiệu như thế nào?
- Một nhà phát triển trái khẳng định sai (biểu Logic không hợp lệ) trong mã nguồn
- Tất cả chúng tôi trước khi phát hành bản xây dựng có assertions bật (để theo dõi lỗi trong các thử nghiệm tích hợp)
- nội QA có các cài đặt môi trường khác nhau so với các thử nghiệm tích hợp, do đó, "lỗi xác nhận" không hiển thị
Kết quả là poo r nhà phát triển bị đổ lỗi cho lỗi này (rõ ràng là không có ASSERT này sẽ không có sự cố) và chúng tôi phải phát hành hotfix để cho phép thử nghiệm tích hợp được tiếp tục.
Trước hết: Tôi cần assertions bật trong các thử nghiệm tích hợp để theo dõi tình trạng thất bại (các khẳng định càng nhiều càng tốt), mặt khác tôi không muốn các nhà phát triển để sợ rằng một số "phụ" ASSERT sẽ sụp đổ toàn bộ phần mềm ngăn xếp.
Tôi tìm thấy, có thể là giải pháp dựa trên C++ thú vị cho vấn đề này: xác nhận yếu. Ý tưởng là để không dừng toàn bộ ứng dụng trên xác nhận không thành công, nhưng để ghi lại stacktrace để phân tích sau này và tiếp tục. Chúng tôi có thể kiểm tra nhiều kỳ vọng như chúng tôi muốn mà không sợ bị lỗi và chúng tôi nhận phản hồi (stacktraces) từ tích hợp. Quá trình chạy đơn có thể cung cấp nhiều trường hợp xác nhận không thành công để phân tích thay vì chỉ một (vì không có hủy bỏ() được gọi).
Thực hiện ý tưởng này (sử dụng một số phép thuật LD_PRELOAD) được một thời gian ngắn mô tả ở đây: http://blog.aplikacja.info/2011/10/assert-to-abort-or-not-to-abort-thats-the-question/
Nguồn
2012-09-23 20:39:15
Bạn nên làm rõ điều gì khiến bạn không hài lòng về các cơ chế đơn giản với macro khẳng định (chữ thường). –
Xem thêm http://stackoverflow.com/questions/179723/what-is-the-best-way-of-implementing-assertion-checking-in-c –
Bạn vừa liên kết với thư viện thực hiện chính xác những gì bạn đang yêu cầu. Bạn mong đợi chúng ta nói gì? "Bạn có thể cung cấp cho http://www.codeproject.com/KB/cpp/DesignByContract.aspx một ảnh"? Nếu bạn muốn một cái gì đó nhiều hơn những gì mà thư viện cung cấp, sau đó không sử dụng nó như là một ví dụ về những gì bạn đang sau. Cho chúng tôi biết những gì bạn muốn mà nó không cung cấp. – jalf