Na tej stronie znajdziesz podstawowe informacje o tym, jak utworzyć moduł rust_test, który korzysta z platformy testowej Rust.
Pisanie podstawowego testu w języku Rust
Aby zobaczyć przykład testu w Rust przeprowadzony na urządzeniu i na hoście, otwórz plik keystore2 Android.bp lub znajdź go w jednym z wielu pakietów w katalogu external/rust/crates.
Moduł rust_test jest kompilowany za pomocą flagi --test rustc, która tworzy testy z kodu oznaczonego atrybutem #[test]. Więcej informacji znajdziesz w dokumentacji atrybutów testowania w Rust Reference.
Zdefiniuj moduł testowy w ten sposób:
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",
    ],
}
Plik TEST_MAPPING zawiera listę testów. Chociaż nie jest to wymagane, jeśli utworzysz plik TEST_MAPPING, testy w nim zawarte będą uruchamiane w ramach testów przed przesłaniem i można je wywołać za pomocą polecenia atest.
Więcej informacji znajdziesz w dokumentacji TEST_MAPPING. W przypadku libfoo_inline_tests przykładu dodaj ten kod do presubmit, aby włączyć uruchamianie testów w TreeHuggerze:
{
  "presubmit": [
    {
      "name": "libfoo_inline_tests",
    },
  ]
}
Pamiętaj, że moduły rust_test_host są domyślnie uruchamiane przed przesłaniem, chyba że unit_tests: ma wartość false, więc nie musisz deklarować tych modułów w plikach TEST_MAPPING.
Więcej informacji o działaniu właściwości auto_gen_config i test_suites znajdziesz w sekcji Ustawienia w dokumentacji Przebieg prac nad testem.
Ważne właściwości testów w Rust
Moduły rust_test dziedziczą właściwości modułów rust_binary zgodnie z opisem na stronie Moduły binarne.
Właściwości zdefiniowane w tabeli poniżej są dodatkiem do ważnych właściwości wspólnych, które mają zastosowanie do wszystkich modułów. Są one szczególnie ważne w przypadku modułów testowych Rust lub wykazują unikalne zachowanie charakterystyczne dla typu modułu rust_test.
- test_harness: zaawansowane użycie, domyślnie ma wartość „true”.
Ustaw tę wartość na false, jeśli rust_test implementuje własny zestaw testów i nie musisz używać wbudowanego zestawu testów Rust (innymi słowy, ustawienie tej wartości na false nie przekaże flagi --test do rustc).
Unikanie duplikowania między rust_library i rust_test
Jeśli używasz testów wbudowanych w Rust za pomocą zagnieżdżonych modułów, w pliku Android.bp pojawią się duplikaty. Problem polega na tym, że zależności trzeba wymienić dwukrotnie: raz dla rust_library i raz dla 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",
    ],
}
Każdy moduł rust_test będzie zawierać te same zależności co odpowiadający mu moduł rust_library. Aby zapewnić spójność między modułami, możesz wymienić zależności tylko raz w moduł 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"],
}
Dzięki temu biblioteka i moduł testowy będą zawsze używać tych samych zależności.
