Rust:
Tests Schreiben

Wie man:

Rusts integriertes Test-Framework unterstützt Einheits-, Integrations- und Dokumentationstests ohne die Notwendigkeit externer Bibliotheken. Tests werden mit #[test] annotiert, und jede so annotierte Funktion wird als Test kompiliert.

Schreiben eines Einheitstests:

Platzieren Sie Einheitstests im Modul, das sie testen, indem Sie ein tests Untermodul verwenden, das mit #[cfg(test)] markiert ist, um sicherzustellen, dass sie nur beim Testen kompiliert werden.

// lib.rs oder 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);
    }
}

Tests ausführen:

$ cargo test

Ausgabe:

   Kompilieren Ihres Paketnamens v0.1.0 (/Pfad/zu/Ihrem/Paket)
    Fertiggestellt test [unoptimiert + debuginfo] Ziel(e) in 0,00 Sek.
     Laufende Unittests src/lib.rs (oder src/main.rs)

1 Test wird ausgeführt
test tests::it_adds_two ... ok

Testergebnis: ok. 1 bestanden; 0 fehlgeschlagen; 0 ignoriert; 0 gemessen; 0 ausgefiltert

Schreiben von Integrationstests:

Integrationstests gehören in ein Tests-Verzeichnis auf der obersten Ebene Ihres Projekts, neben src. Jede .rs Datei in tests wird als eigene separate Crate kompiliert.

// tests/integration_test.rs
use your_package_name;

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

Testen mit beliebten Drittanbieter-Bibliotheken:

Für umfangreichere Testmöglichkeiten kann die Bibliothek proptest eine breite Palette von Eingaben erzeugen, um Funktionen zu testen.

Fügen Sie proptest als Entwicklungsabhängigkeit in Cargo.toml hinzu:

[dev-dependencies]
proptest = "1.0"

Verwenden Sie proptest, um den gleichen Test mit vielen automatisch generierten Eingaben auszuführen:

// innerhalb von tests/integration_test.rs oder eines #[cfg(test)] Moduls

use proptest::prelude::*;

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

Dies überprüft, dass add bei einer breiten Palette von i32 Eingaben nicht panisch wird.