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
ที่กว้าง