Rust:
Pisanie testów
Jak to zrobić:
Wbudowany framework testowy Rusta wspiera testy jednostkowe, integracyjne oraz dokumentacyjne bez potrzeby korzystania z zewnętrznych bibliotek. Testy są oznaczane za pomocą #[test], a każda funkcja tak oznaczona jest kompilowana jako test.
Pisząc test jednostkowy:
Umieść testy jednostkowe w module, który testują, używając podmodułu tests, oznaczonego za pomocą #[cfg(test)], aby zapewnić, że będą kompilowane tylko podczas testowania.
// lib.rs lub 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);
}
}Uruchamianie testów:
$ cargo testWynik:
Compiling your_package_name v0.1.0 (/ścieżka/do/twojego_pakietu)
Finished test [unoptimized + debuginfo] target(s) in 0.00 secs
Running unittests src/lib.rs (lub src/main.rs)
running 1 test
test tests::it_adds_two ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered outPisząc testy integracyjne:
Testy integracyjne umieszcza się w katalogu tests na najwyższym poziomie projektu, obok src. Każdy plik .rs w tests jest kompilowany jako oddzielny crate.
// tests/integration_test.rs
use your_package_name;
#[test]
fn it_adds_two() {
assert_eq!(your_package_name::add(2, 2), 4);
}Testowanie z popularnymi bibliotekami innych firm:
Dla bardziej zaawansowanych możliwości testowania, biblioteka proptest może generować szeroki zakres danych wejściowych do testowania funkcji.
Dodaj proptest jako zależność deweloperską w Cargo.toml:
[dev-dependencies]
proptest = "1.0"Użyj proptest do uruchomienia tego samego testu z wieloma automatycznie wygenerowanymi danymi wejściowymi:
// wewnątrz tests/integration_test.rs lub modułu #[cfg(test)]
use proptest::prelude::*;
proptest! {
#[test]
fn doesnt_crash(a: i32, b:i32) {
your_package_name::add(a, b);
}
}To sprawdza, czy add nie powoduje paniki dla szerokiego zakresu danych wejściowych i32.