ในบทความนี้ เราจะมาเรียนรู้เกี่ยวกับเครื่องมือทดสอบใน Rust ไม่ว่าจะเป็น Unit Test, Integration Test และ Benchmark ซึ่งช่วยให้โค้ดของเรามีคุณภาพ เชื่อถือได้ และวัดประสิทธิภาพได้อย่างแม่นยำ
Unit Test: ทดสอบแต่ละฟังก์ชัน
Rust มี framework ทดสอบในตัว โดยใช้ annotation #[test]
สำหรับฟังก์ชันที่ต้องการทดสอบ
โค้ดตัวอย่าง
fn add(a: i32, b: i32) -> i32 { a + b } #[cfg(test)] mod tests { use super::*; #[test] fn test_add() { assert_eq!(add(2, 3), 5); } #[test] #[should_panic] fn test_panic() { panic!("ทดสอบการ fail"); } }
รันทดสอบ
cargo test

Integration Test: ทดสอบระบบรวม
ไฟล์ integration test ควรอยู่ใน tests/
directory โดยแยกจากโมดูลหลัก และมักใช้กับ public API
ตัวอย่างโครงสร้าง
my_crate/ ├── src/ │ └── lib.rs ├── tests/ │ └── integration_test.rs
ตัวอย่างไฟล์
// tests/integration_test.rs use my_crate::add; #[test] fn test_add_integration() { assert_eq!(add(10, 5), 15); }
การใช้ assert macro
assert_eq!(a, b)
– ตรวจสอบว่าค่าเท่ากันassert_ne!(a, b)
– ตรวจสอบว่าไม่เท่ากันassert!(condition)
– ตรวจสอบ boolean
Benchmark: ทดสอบความเร็ว
ตั้งแต่ Rust 1.36 เป็นต้นมา จำเป็นต้องใช้ external crate เช่น criterion
สำหรับ benchmark
เพิ่ม dependency
# Cargo.toml
[dev-dependencies]
criterion = “0.5”
สร้างไฟล์ benchmark
// benches/my_bench.rs use criterion::{criterion_group, criterion_main, Criterion}; fn fibonacci(n: u64) -> u64 { match n { 0 => 0, 1 => 1, _ => fibonacci(n - 1) + fibonacci(n - 2), } } fn bench_fib(c: &mut Criterion) { c.bench_function("fib 20", |b| b.iter(|| fibonacci(20))); } criterion_group!(benches, bench_fib); criterion_main!(benches);
รัน Benchmark
cargo bench

Mocking และ Testing Async
- ใช้
tokio::test
สำหรับ async fn - ใช้ crate เช่น
mockall
,httpmock
สำหรับ mocking external dependency
#[tokio::test] async fn test_async_fn() { let result = my_async_function().await; assert!(result.is_ok()); }
Best Practices
- แยก unit test กับ integration test อย่างชัดเจน
- เขียน test สำหรับ edge case เสมอ
- ใช้ benchmark สำหรับ logic ที่ซับซ้อนหรือ critical
- ทดสอบ async function ให้ครอบคลุม
สรุป
การเขียน test และ benchmark ที่ดีจะทำให้โค้ดมีคุณภาพสูง และช่วยให้ระบบเติบโตได้อย่างมั่นคง Rust มีเครื่องมือในตัวที่ทรงพลัง และ ecosystem ที่สนับสนุนการทดสอบอย่างครบถ้วน เหมาะสำหรับโปรเจกต์ขนาดเล็กไปจนถึงระบบขนาดใหญ่
บทความโดย poolsawat.com – แชร์ความรู้ Rust และแนวทางการพัฒนา Software คุณภาพ