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 decargo 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ștecargo 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.