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 test

Wynik:

   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 out

Piszą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.