Chỉ vì nó biên dịch không có nghĩa là nó chạy! Đó là bản chất của thử nghiệm đơn vị. Hãy thử mã.Hãy chắc chắn rằng nó đang làm những gì bạn nghĩ rằng nó đã làm.
Cho phép đối mặt với nó, nếu bạn chuyển đổi ma trận từ MATLAB, thật dễ dàng để làm hỏng dấu cộng hoặc dấu trừ ở đâu đó. Đó là loại điều khó thấy. Nếu không thử nó, bạn chỉ không biết liệu nó có hoạt động chính xác hay không. Gỡ lỗi 100 dòng mã dễ hơn rất nhiều so với việc gỡ lỗi 100.000 dòng mã.
Một số người coi đây là cực đoan. Họ cố gắng kiểm tra mọi điều có thể tưởng tượng được. Thử nghiệm trở thành một kết thúc cho chính nó.
Điều đó có thể hữu ích sau này trong các giai đoạn bảo trì. Bạn có thể nhanh chóng kiểm tra để đảm bảo cập nhật của bạn không bị hỏng.
Nhưng chi phí liên quan có thể làm tê liệt phát triển sản phẩm! Và những thay đổi trong tương lai làm thay đổi chức năng có thể bao gồm chi phí cập nhật kiểm tra rộng rãi.
(Nó cũng có thể nhận được lộn xộn đối với đa luồng và thực hiện lệnh tùy ý với.)
Cuối cùng, trừ khi có chỉ định khác, kiểm tra của tôi cố gắng để rơi xuống đất giữa.
Tôi tìm cách thử nghiệm ở mức chi tiết lớn hơn, cung cấp phương tiện xác minh chức năng cơ bản chung. Tôi không lo lắng quá nhiều về mọi tình huống hàng rào có thể xảy ra. (Đó là những gì các macro ASSERT dành cho.)
Ví dụ: Khi tôi viết mã để gửi/nhận tin nhắn qua UDP, tôi đã thử nghiệm nhanh để gửi/nhận dữ liệu bằng cách sử dụng lớp đó qua giao diện loopback. Không có gì lạ mắt. Nhanh chóng, nhanh chóng, & mã bẩn. Tôi chỉ muốn thử nó. Để chắc chắn rằng nó đã thực sự làm việc trước khi tôi xây dựng một cái gì đó trên đầu trang của nó.
Ví dụ khác: Đọc hình ảnh camera từ máy ảnh Firewire. Tôi đã ném nhanh & ứng dụng GTK bẩn để đọc hình ảnh, xử lý chúng và hiển thị chúng trong thời gian thực. Những người khác gọi đó là thử nghiệm tích hợp. Nhưng tôi có thể sử dụng nó để xác minh giao diện Firewire của mình, lớp hình ảnh của tôi, biến đổi RGB RGGB-> RGB của tôi, định hướng hình ảnh của tôi & căn chỉnh, ngay cả khi máy ảnh được lắp đặt lộn ngược một lần nữa. Thử nghiệm chi tiết hơn sẽ chỉ được bảo đảm nếu điều này đã chứng minh là không đủ.
Mặt khác, ngay cả đối với một cái gì đó đơn giản như:
template<class TYPE> inline TYPE MIN(const TYPE & x, const TYPE & y) { return x > y ? y : x; }
template<class TYPE> inline TYPE MAX(const TYPE & x, const TYPE & y) { return x < y ? y : x; }
Tôi đã viết một 1 dòng HIỂN THỊ vĩ mô để chắc chắn rằng tôi đã không sai lầm dấu:
SHOW(MIN(3,4)); SHOW(MAX(3,4));
Tất cả Tôi muốn làm là để xác minh rằng nó đã làm những gì nó nên làm trong trường hợp chung. Tôi lo lắng ít hơn về cách nó xử lý NaN/+ -Infinity/(double, int) hơn là một trong các đồng nghiệp đã quyết định thay đổi thứ tự đối số và goofed.
Công cụ khôn ngoan, có rất nhiều công cụ kiểm tra đơn vị trên mạng. Nếu nó giúp bạn, nhiều quyền lực hơn cho bạn. Nếu không, bạn không thực sự cần phải quá ưa thích.
tôi sẽ thường viết một chương trình thử nghiệm mà bãi dữ liệu vào và ra khỏi một lớp học, và sau đó in nó tất cả ra ngoài với một chương trình vĩ mô:
#define SHOW(X) std::cout << # X " = " << (X) << std::endl
(Ngoài ra, nhiều người trong lớp học của tôi có thể tự nhận in bằng một built-in hành < < (ostream &) phương pháp. Đây là một kỹ thuật khá hữu ích để gỡ lỗi cũng như để thử nghiệm!)
Makefiles có thể được trivially mở rộng để tự động tạo tập tin đầu ra từ các chương trình kiểm tra, và để tự động so sánh (diff) các tệp đầu ra này với kết quả đã biết (được xem xét).
Không ưa thích, có lẽ hơi kém thanh lịch hơn, nhưng khi kỹ thuật thực hiện điều này rất hiệu quả, nhanh chóng triển khai và chi phí rất thấp. (Điều nào có lợi thế khi người quản lý của bạn từ chối lãng phí thời gian vào công cụ kiểm tra đó.)
Một ý nghĩ cuối cùng tôi sẽ để lại cho bạn. Điều này sẽ làm cho tôi bị đánh dấu xuống, vì vậy KHÔNG làm điều đó!
Cách đây một thời gian, tôi cần một chương trình thử nghiệm. Đó là một yêu cầu có thể giao được. Bản thân chương trình phải xác minh rằng một lớp khác đang hoạt động đúng. Nhưng nó không thể truy cập datafiles bên ngoài. (Chúng tôi không thể dựa vào nơi chương trình sẽ được định vị liên quan đến bất kỳ thứ gì khác. Không có đường dẫn tuyệt đối.) Khuôn khổ kiểm thử đơn vị cho dự án không tương thích với trình biên dịch mà tôi đã được yêu cầu sử dụng. Nó cũng phải ở trong một tập tin. Hệ thống makefile của dự án không hỗ trợ liên kết nhiều tệp với nhau cho một chương trình thử nghiệm thấp. (Các chương trình ứng dụng, chắc chắn. Họ có thể sử dụng thư viện. Nhưng chỉ có một tập tin duy nhất cho mỗi chương trình thử nghiệm.)
Vì vậy, Thiên Chúa tha thứ cho tôi, tôi "đã phá vỡ các quy tắc" ...
< xấu hổ >
Tôi đã sử dụng các macro. Khi một macro #define được đặt, dữ liệu được ghi vào tệp .c thứ hai làm bộ khởi tạo cho mảng cấu trúc. Sau đó, khi phần mềm được biên dịch lại, và tệp .c thứ hai (với mảng cấu trúc) đã đượC#included và macro #define không được thiết lập, nó đã so sánh kết quả mới so với dữ liệu đã lưu trước đó. Có, tôi # bao gồm tệp .c. O 'sự xấu hổ của tất cả.
</xấu hổ >
Nhưng nó có thể được thực hiện ...