Rust:
การเขียนการทดสอบ

วิธีการ:

กรอบการทดสอบของ Rust ที่มาพร้อมกับตัวมันรองรับการทดสอบ unit, integration, และเอกสารโดยไม่ต้องใช้ไลบรารี่ภายนอก เทสถูกทำเครื่องหมายด้วย #[test], และฟังก์ชันใดๆ ที่ถูกทำเครื่องหมายดังกล่าวจะถูกคอมไพล์เป็นเทส

การเขียน Unit Test:

วาง unit tests ในโมดูลที่กำลังทดสอบโดยใช้ tests ย่อยโมดูลที่ทำเครื่องหมายด้วย #[cfg(test)] เพื่อให้แน่ใจว่ามันจะถูกคอมไพล์เมื่อกำลังทดสอบเท่านั้น

// lib.rs หรือ main.rs
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_adds_two() {
        assert_eq!(add(2, 2), 4);
    }
}

การรันเทส:

$ cargo test

ผลลัพธ์:

   Compiling ชื่อแพ็คเกจของคุณ v0.1.0 (/path/to/your_package)
    Finished test [unoptimized + debuginfo] target(s) in 0.00 secs
     Running unittests src/lib.rs (หรือ src/main.rs)

running 1 test
test tests::it_adds_two ... ok

ผลการทดสอบ: ok. 1 ผ่าน; 0 ล้มเหลว; 0 ถูกละเลย; 0 ถูกวัด; 0 ถูกกรองออก

การเขียน Integration Tests:

Integration tests อยู่ในไดเร็กทอรี่ tests ที่ชั้นบนสุดของโปรเจ็กต์ของคุณ ถัดจาก src ไฟล์ .rs แต่ละไฟล์ใน tests จะถูกคอมไพล์เป็น crate แยกต่างหาก

// tests/integration_test.rs
use your_package_name;

#[test]
fn it_adds_two() {
    assert_eq!(your_package_name::add(2, 2), 4);
}

การทดสอบด้วยไลบรารี่ยอดนิยมจากบุคคลที่สาม:

สำหรับคุณสมบัติการทดสอบที่กว้างขึ้น, ไลบรารี่ proptest สามารถสร้างช่วงข้อมูลนำเข้าที่หลากหลายเพื่อทดสอบฟังก์ชัน

เพิ่ม proptest ในฐานะ dev dependency ใน Cargo.toml:

[dev-dependencies]
proptest = "1.0"

ใช้ proptest เพื่อรันการทดสอบเดียวกันกับข้อมูลนำเข้าที่ถูกสร้างขึ้นอัตโนมัติจำนวนมาก:

// ภายใน tests/integration_test.rs หรือโมดูลที่ #[cfg(test)]

use proptest::prelude::*;

proptest! {
    #[test]
    fn doesnt_crash(a: i32, b:i32) {
        your_package_name::add(a, b);
    }
}

สิ่งนี้ตรวจสอบว่า add ไม่ panic สำหรับช่วงของข้อมูลนำเข้า i32 ที่กว้าง