Testowanie modułów

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ć na żywo przykład testu w języku Rust 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 tworzony za pomocą flagi --test kompilatora rustc, która tworzy testy z kodu oznaczonego atrybutem #[test]. Więcej informacji znajdziesz w dokumentacji The Rust Reference Testing Attributes.

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. Nie jest to wymagane, ale jeśli utworzysz plik TEST_MAPPING, testy w nim zawarte będą uruchamiane w testach wstępnych i można je wywołać za pomocą atest.

Więcej informacji znajdziesz w dokumentacji TEST_MAPPING, ale w przypadku przykładu libfoo_inline_tests dodaj to do presubmit, aby włączyć uruchamianie testów w TreeHugger:

{
  "presubmit": [
    {
      "name": "libfoo_inline_tests",
    },
  ]
}

Pamiętaj, że moduły rust_test_host są domyślnie uruchamiane w testach wstępnych, chyba że unit_tests: jest ustawione na false, więc nie musisz deklarować ich w plikach TEST_MAPPING.

Więcej informacji o tym, jak działają właściwości auto_gen_config i test_suites, znajdziesz w sekcji Ustawienia w dokumentacji Przepływ pracy przy tworzeniu testów.

Ważne właściwości testów w języku Rust

Moduły rust_test dziedziczą właściwości z modułów rust_binary, jak opisano 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 w języku Rust lub wykazują unikalne zachowanie charakterystyczne dla typu modułu rust_test.

  • test_harness: zaawansowane użycie, domyślnie ustawione na true.

Ustaw tę wartość na false, jeśli moduł rust_test implementuje własną platformę testową i nie musisz używać wbudowanej platformy testowej Rust (innymi słowy, ustawienie tej wartości na false nie spowoduje przekazania flagi --test do kompilatora rustc).

Unikanie duplikowania między rust_library a rust_test

Gdy używasz testów w języku Rust wbudowanych w moduły zagnieżdżone, w pliku Android.bp dochodzi do duplikowania. Problem polega na tym, że musisz dwukrotnie wymienić zależności – raz w przypadku rust_library i raz w przypadku 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 module 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.