Módulos de teste

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.