cargo test în Rust

Cargo și rustup Cargo 1.0

Compilează proiectul în mod test și rulează toate testele: cele #[test], testele din tests/ și exemplele din documentație.

Sintaxă
cargo test                     # toate testele
cargo test text                # doar testele al căror nume conține „text”
cargo test -- --ignored        # doar testele marcate #[ignore]
cargo test -- --nocapture      # arată ce afișează testele
cargo test --doc               # doar exemplele din documentație

Ce face cargo test

cargo test compilează proiectul cu cfg(test) activ (deci și modulele #[cfg(test)]) și rulează, pe rând: testele unitare din src/, testele de integrare din tests/ și doctests (exemplele din comentariile ///). Pentru fiecare grup afișează rezultatul fiecărui test și un sumar.

Un argument simplu filtrează testele după nume: cargo test media rulează doar testele care conțin „media” în nume. Opțiunile de după -- sunt pentru programul de teste: --ignored rulează testele marcate #[ignore], --nocapture arată ce afișează testele cu println! (implicit este ascuns pentru testele care trec), --test-threads=1 rulează testele pe rând.

Comanda se termină cu cod de eroare dacă un test eșuează, deci poate fi folosită în CI (GitHub Actions, GitLab CI) ca să blocheze codul stricat.

Parametri

Parametru Descriere
filtru Rulează doar testele al căror nume conține textul dat.
--lib / --doc / --test nume Doar testele unitare / doar doctests / doar un fișier din tests/.
--release Rulează testele compilate cu optimizări.
-- --ignored Rulează testele marcate #[ignore].
-- --nocapture Afișează ieșirea testelor.

Exemple

Exemplul 1: Toate testele

Biblioteca calcule are trei teste unitare și un exemplu în documentație. Toate trec.

$ cargo test

Rezultat în terminal

   Compiling calcule v0.1.0 (/home/ana/proiecte/calcule)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.79s
     Running unittests src/lib.rs (target/debug/deps/calcule-1d1832a2b71fc82f)

running 3 tests
test tests::fara_note ... ok
test tests::media_simpla ... ok
test tests::promovat_la_limita ... ok

test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests calcule

running 1 test
test src/lib.rs - media (line 3) ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s

all doctests ran in 0.91s; merged doctests compilation took 0.67s

Exemplul 2: Doar testele care conțin un cuvânt

Filtrul „fara” păstrează un singur test; celelalte două apar ca „filtered out”. Proiectul nu s-a schimbat, deci nu a fost recompilat.

$ cargo test fara

Rezultat în terminal

    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running unittests src/lib.rs (target/debug/deps/calcule-1d1832a2b71fc82f)

running 1 test
test tests::fara_note ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.01s

Exemplul 3: Un test care eșuează

Valoarea așteptată în media_simpla a fost schimbată greșit în Some(9.5). Raportul arată linia testului, valoarea obținută (left) și cea așteptată (right), iar comanda se termină cu eroare.

$ cargo test

Rezultat în terminal

   Compiling calcule v0.1.0 (/home/ana/proiecte/calcule)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.32s
     Running unittests src/lib.rs (target/debug/deps/calcule-1d1832a2b71fc82f)

running 3 tests
test tests::promovat_la_limita ... ok
test tests::fara_note ... ok
test tests::media_simpla ... FAILED

failures:

---- tests::media_simpla stdout ----

thread 'tests::media_simpla' (14408074) panicked at src/lib.rs:26:9:
assertion `left == right` failed
  left: Some(9.0)
 right: Some(9.5)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace


failures:
    tests::media_simpla

test result: FAILED. 2 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

error: test failed, to rerun pass `--lib`

Greșeli frecvente

  • Scrii cargo test --ignored în loc de cargo test -- --ignored. Opțiunile programului de teste vin după --.
  • Te miri că println! din teste nu apare. Ieșirea testelor care trec este ascunsă; folosește cargo test -- --nocapture.
  • Scrii teste care folosesc același fișier sau aceeași variabilă globală: rulate în paralel, eșuează aleatoriu. Folosește date separate sau -- --test-threads=1.

Comenzi înrudite

  • teste (#[test]): O funcție marcată cu #[test] este un test automat: cargo test o rulează și raportează dacă a trecut sau a dat panică.
  • comentarii și documentație (//, ///, //!): // și /* */ sunt comentarii obișnuite; /// și //! scriu documentație Markdown, transformată în HTML de cargo doc și testată de cargo test.
  • assert_eq! și assert_ne!: Verifică dacă două valori sunt egale (assert_eq!) sau diferite (assert_ne!); la eșec, panica afișează ambele valori.
  • cargo check: Verifică dacă proiectul se compilează (tipuri, borrow checker) fără să producă executabilul. Este mult mai rapid decât cargo build.