Esta página fornece informações básicas sobre como construir um módulo rust_test
que usa o equipamento de teste Rust.
Escrevendo um teste básico de Rust
Para obter um exemplo ao vivo de um teste Rust no dispositivo e no host, visualize keystore2 Android.bp ou localize uma das muitas caixas no diretório external/rust/crates
.
Um módulo rust_test
é construído usando o sinalizador --test do --test
, que cria testes fora do código marcado com o atributo #[test]
. Para obter mais informações, consulte a documentação The Rust Reference Testing Attributes .
Defina um módulo de teste da seguinte forma:
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",
],
}
Um arquivo TEST_MAPPING
contém uma lista de testes. Embora não seja um requisito, se você criar um arquivo TEST_MAPPING, os testes incluídos nele serão executados em testes de pré-envio e poderão ser invocados usando atest
.
Você pode consultar a documentação TEST_MAPPING para obter mais informações, mas para o exemplo libfoo_inline_tests
, adicione isto para pré-enviar para habilitar suas execuções de teste no TreeHugger:
{
"presubmit": [
{
"name": "libfoo_inline_tests",
},
]
}
Observe que os módulos rust_test_host
são executados por padrão em presubmit, a menos que unit_tests:
esteja definido como false
, portanto, você não precisa declará-los nos arquivos TEST_MAPPING
.
Para obter mais informações sobre como as propriedades auto_gen_config
e test_suites
funcionam, consulte a seção Configurações da documentação do Fluxo de trabalho de desenvolvimento de teste .
Propriedades notáveis do teste de ferrugem
Os módulos rust_test
herdam propriedades dos módulos rust_binary
conforme descrito na página Módulos Binários .
As propriedades definidas na tabela abaixo são adicionais às propriedades comuns importantes que se aplicam a todos os módulos. Eles são particularmente importantes para os módulos de teste Rust ou exibem um comportamento exclusivo específico para o tipo de módulo rust_test
.
- test_harness : uso avançado, o padrão é true.
Defina isso como false se o seu rust_test
implementar seu próprio equipamento de teste e você não precisar usar o equipamento de teste Rust integrado (em outras palavras, definir isso como false não passará o sinalizador --test
para rustc).
Evitando a duplicação entre rust_library
e rust_test
Quando você usa testes de Rust embutidos por meio de módulos aninhados, você acaba com duplicação em seu arquivo Android.bp
. O problema é que você tem que listar as dependências duas vezes, uma para rust_library
e outra para 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",
],
}
Cada módulo rust_test
acabará listando as mesmas dependências que o módulo rust_library
correspondente. Para garantir a consistência entre os módulos, você pode listar as dependências apenas uma vez em um módulo 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"],
}
Dessa forma, a biblioteca e o módulo de teste sempre usarão as mesmas dependências.