Questa pagina fornisce informazioni di base su come creare un modulo rust_test
che utilizza il test harness Rust.
Scrivere un test Rust di base
Per un esempio pratico di un test Rust on-device e on-host, visualizza
keystore2 Android.bp,
o individuane uno in molte delle casse nella directory external/rust/crates
.
Un modulo rust_test
viene compilato utilizzando il flag --test
di rustc, che crea test
del codice contrassegnato dall'attributo #[test]
. Per saperne di più, consulta la documentazione relativa agli attributi di test di riferimento di Rust.
Definisci un modulo di test come segue:
rust_test {
name: "libfoo_inline_tests",
// Specify the entry point of your library or binary to run all tests
// specified in-line with the test attribute.
srcs: ["src/lib.rs"],
// Tradefed test suite to include this test in.
test_suites: ["general-tests"],
// Autogenerate the test config
auto_gen_config: true,
rustlibs: [
"libfoo",
],
}
Un file TEST_MAPPING
contiene un elenco di test. Sebbene non sia un requisito,
se crei un file TEST_MAPPING, i test che includi al suo interno verranno eseguiti
in test pre-invio e possono essere richiamati utilizzando atest
.
Per ulteriori informazioni, puoi fare riferimento alla documentazione di TEST_MAPPING, ma per l'esempio libfoo_inline_tests
, aggiungi quanto segue a presubmit per attivare le esecuzioni di test su TreeHugger:
{
"presubmit": [
{
"name": "libfoo_inline_tests",
},
]
}
Tieni presente che i moduli rust_test_host
vengono eseguiti per impostazione predefinita in presubmit, a meno che unit_tests:
non sia impostato su false
, quindi non è necessario dichiararli nei file TEST_MAPPING
.
Per ulteriori informazioni sul funzionamento delle proprietà auto_gen_config
e test_suites
, consulta la sezione Impostazioni della documentazione Flusso di lavoro per lo sviluppo di test.
Proprietà di test Rust importanti
I moduli rust_test
ereditano le proprietà dai moduli rust_binary
come descritto nella pagina Moduli binari.
Le proprietà definite nella tabella seguente si aggiungono alle
proprietà comuni importanti
che si applicano a tutti i moduli. Questi sono particolarmente importanti per i moduli di test Rust o presentano un comportamento unico specifico per il tipo di modulo rust_test
.
- test_harness: utilizzo avanzato, il valore predefinito è true.
Imposta questo valore su false se rust_test
implementa il proprio test di test e non è necessario utilizzare il sistema di test antiruggine integrato (in altre parole, l'impostazione su false non trasmetterà il flag --test
a rustc).
Evita la duplicazione tra rust_library e rust_test
Quando utilizzi i test Rust in linea tramite moduli nidificati, si verificano duplicazioni nel file Android.bp
. Il problema è che devi elencare le dipendenze
due volte, una per rust_library
e una per rust_test
:
rust_library {
name: "libfoo",
srcs: ["src/lib.rs"],
rustlibs: [
"libx",
"liby",
"libz",
],
}
rust_test {
name: "libfoo_inline_tests",
srcs: ["src/lib.rs"],
test_suites: ["general_tests"],
rustlibs: [
"libx",
"liby",
"libz",
],
}
Ogni modulo rust_test
finirà per elencare le stesse dipendenze del modulo rust_library
corrispondente. Per garantire la coerenza tra i moduli, puoi elencare le dipendenze una sola volta in un modulo rust_defaults
:
rust_defaults {
name: "libfoo_defaults",
srcs: ["src/lib.rs"],
rustlibs: [
"libx",
"liby",
"libz",
],
}
rust_library {
name: "libfoo",
defaults: ["libfoo_defaults"],
}
rust_test {
name: "libfoo_inline_tests",
defaults: ["libfoo_defaults"],
test_suites: ["general_tests"],
}
In questo modo, la libreria e il modulo di test utilizzeranno sempre le stesse dipendenze.