การเขียนเทสอัตโนมัติ
ในบทความปี 1972 ของเขาที่ชื่อ “The Humble Programmer” Edsger W. Dijkstra กล่าวว่า “การทดสอบโปรแกรมเป็นวิธีที่มีประสิทธิภาพมากในการแสดงว่ามี bug อยู่ แต่ก็ไม่เพียงพออย่างยิ่งที่จะแสดงว่าไม่มี bug” นั่นไม่ได้แปลว่าเรา ไม่ควรพยายามทดสอบให้มากที่สุดเท่าที่ทำได้!
ความถูกต้อง (correctness) ของโปรแกรมคือระดับที่โค้ดของเราทำตามที่เรา ตั้งใจ Rust ถูกออกแบบโดยให้ความสำคัญกับความถูกต้องของโปรแกรมในระดับสูง แต่ความถูกต้องนั้นซับซ้อนและพิสูจน์ไม่ง่าย ระบบ type ของ Rust รับภาระส่วน ใหญ่ไป แต่ระบบ type จับทุกอย่างไม่ได้ ดังนั้น Rust จึงรวมการสนับสนุนสำหรับ การเขียนเทสซอฟต์แวร์อัตโนมัติเข้ามาด้วย
สมมติเราเขียนฟังก์ชัน add_two ที่บวก 2 เข้ากับตัวเลขใดก็ตามที่ส่งเข้ามา
signature ของฟังก์ชันนี้รับ integer เป็น parameter และ return integer
เป็นผลลัพธ์ เมื่อเรา implement และคอมไพล์ฟังก์ชันนั้น Rust ทำการตรวจสอบ
type และตรวจสอบ borrow ทั้งหมดที่คุณเรียนมาแล้ว เพื่อให้แน่ใจว่า ตัวอย่าง
เช่น เราไม่ได้ส่งค่า String หรือ reference ที่ไม่ valid เข้าฟังก์ชันนี้
แต่ Rust ตรวจสอบไม่ได้ ว่าฟังก์ชันนี้จะทำตามที่เราตั้งใจอย่างแน่นอน นั่น
คือ return parameter บวก 2 ไม่ใช่ — สมมติ — parameter บวก 10 หรือ
parameter ลบ 50! นั่นคือที่ที่เทสเข้ามามีบทบาท
เราเขียนเทสที่ assert ได้ ตัวอย่างเช่น ว่าเมื่อเราส่ง 3 เข้าฟังก์ชัน
add_two ค่าที่ return คือ 5 เรารันเทสเหล่านี้ได้ทุกครั้งที่เราแก้ไข
โค้ดของเรา เพื่อให้แน่ใจว่าพฤติกรรมที่ถูกต้องที่มีอยู่ไม่เปลี่ยนแปลง
การเทสเป็นทักษะที่ซับซ้อน — แม้เราจะครอบคลุมรายละเอียดทุกอย่างของวิธี เขียนเทสที่ดีในบทเดียวไม่ได้ ในบทนี้เราจะพูดถึงกลไกของเครื่องมือการเทสของ Rust เราจะพูดถึง annotation และ macro ที่ใช้ได้เมื่อคุณเขียนเทส พฤติกรรม เริ่มต้นและตัวเลือกที่มีให้สำหรับการรันเทส และวิธีจัดระเบียบเทสเป็น unit test และ integration test