Unit Test, Integration Test และ Benchmark ด้วย Rust

Sharing is caring!

ในบทความนี้ เราจะมาเรียนรู้เกี่ยวกับเครื่องมือทดสอบใน 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 คุณภาพ

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *