Questa pagina fornisce informazioni di base su come creare un modulo rust_test
che utilizza l'infrastruttura di test Rust.
Scrivere un test Rust di base
Per un esempio pratico di test Rust su dispositivo e host, visualizza
keystore2 Android.bp
o individua uno dei tanti crate nella directory external/rust/crates
.
Un modulo rust_test
viene creato utilizzando il flag --test
di rustc, che crea test
dal codice contrassegnato con l'attributo #[test]
. Per saperne di più, consulta la documentazione
The Rust Reference Testing Attributes.
Definisci un modulo di test nel seguente modo:
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 verranno eseguiti nei
test di pre-invio e possono essere richiamati utilizzando atest
.
Per ulteriori informazioni, puoi consultare la documentazione TEST_MAPPING, ma per l'esempio libfoo_inline_tests
, aggiungi questo codice 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 saperne di più sul funzionamento delle proprietà auto_gen_config
e test_suites
,
consulta la sezione Impostazioni
della documentazione Flusso di lavoro di sviluppo dei test.
Proprietà di test Rust degne di nota
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 mostrano 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 il tuo rust_test
implementa il proprio banco di prova e non
devi utilizzare il banco di prova Rust integrato (in altre parole, impostando questo valore su false
non verrà passato il flag --test
a rustc).
Evitare la duplicazione tra rust_library e rust_test
Quando utilizzi test Rust incorporati tramite moduli nidificati, si verifica una duplicazione
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.