Viết kiểm thử tự động
Trong bài tiểu luận “The Humble Programmer” năm 1972, Edsger W. Dijkstra nói rằng “Kiểm thử chương trình có thể là một cách rất hiệu quả để chỉ ra sự tồn tại của các lỗi, nhưng nó không đủ để khẳng định sự vắng mặt của chúng.” Điều đó không có nghĩa là chúng ta không nên thử kiểm tra càng nhiều càng tốt!
Tính chính xác trong các chương trình là mức độ mà code thực hiện những gì chúng ta muốn nó thực hiện. Rust được thiết kế với mức độ quan tâm cao về tính chính xác của các chương trình, nhưng tính chính xác thì rất phức tạp và không dễ để chứng minh. Hệ thống type của Rust gánh một phần lớn gánh nặng này, nhưng hệ thống type không thể kiểm tra được mọi thứ. Vì lý do đó, Rust hỗ trợ viết kiểm thử phần mềm tự động.
Giả sử chúng ta viết một hàm add_two thực hiện cộng 2 vào bất kỳ số nào được truyền cho nó. Hàm này chấp nhận một tham số là số nguyên và kết quả trả về cũng là một số nguyên. Khi chúng ta triển khai và biên dịch hàm đó, Rust sẽ thực hiện tất cả việc kiểm tra kiểu dữ liệu và kiểm tra borrow để đảm bảo tham số được truyền vào đúng, chẳng hạn, chúng ta sẽ không truyền một giá trị String hoặc một tham chiếu không hợp lệ vào hàm này. Nhưng Rust không thể kiểm tra xem hàm này có thực hiện chính xác như những gì chúng ta dự tính hay không, đó là trả về tham số cộng thêm 2 thay vì tham số cộng 10 hoặc tham số trừ 50! Đó là vai trò của kiểm thử.
Ví dụ, chúng ta có thể viết kiểm thử để khẳng định rằng khi chúng ta truyền giá trị 3 vào hàm add_two, giá trị được trả về là 5. Chúng ta có thể chạy lại kiểm thử này bất cứ khi nào chúng ta thực hiện các thay đổi trên code để đảm bảo các hành vi đúng hiện có không bị thay đổi.
Kiểm thử là một kỹ năng phức tạp: chúng ta không thể trình bày chi tiết làm sao để viết kiểm thử tốt trong một chương, nhưng chúng ta sẽ thảo luận về cơ chế hoạt động của kiểm thử trong Rust. Chúng ta sẽ nói về các annotation và macro được hỗ trợ khi viết kiểm thử, hành vi mặc định và các tùy chọn được cung cấp để chạy kiểm thử, cũng như cách sắp xếp các đoạn mã kiểm thử thành đơn vị kiểm thử và kiểm thử tích hợp.