מודולים לבדיקה

בדף הזה מפורט מידע בסיסי על בניית מודול rust_test שמשתמש במערך הבדיקות של Rust.

כתיבה של בדיקה בסיסית ב-Rust

לדוגמה פעילה של בדיקת Rust במכשיר ובמארח, אפשר לעיין ב-keystore2 Android.bp, או לאתר בדיקה כזו באחד מה-crates הרבים בספרייה external/rust/crates.

מודול rust_test נוצר באמצעות הדגל --test של rustc, שיוצר בדיקות מקוד שמסומן במאפיין #[test]. למידע נוסף, עיינו במאמרי העזרה של מאפייני הבדיקה של Rust Reference.

מגדירים מודול בדיקה באופן הבא:

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",
    ],
}

קובץ TEST_MAPPING מכיל רשימה של בדיקות. אין צורך ליצור קובץ TEST_MAPPING, אבל אם תיצרו אותו, הבדיקות שתכללו בו יפעלו בבדיקות המקדימות לשליחת הקוד, ותוכלו להפעיל אותן באמצעות atest.

אפשר לעיין במסמכי התיעוד של TEST_MAPPING כדי לקבל מידע נוסף, אבל בדוגמה של libfoo_inline_tests, צריך להוסיף את הקטע הבא לקובץ presubmit כדי להפעיל את הרצת הבדיקות ב-TreeHugger:

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

חשוב לזכור שמודול rust_test_host פועל כברירת מחדל בשלב presubmit, אלא אם הערך של unit_tests: מוגדר כ-false. לכן אין צורך להצהיר עליו בקובצי TEST_MAPPING.

מידע נוסף על אופן הפעולה של המאפיינים auto_gen_config ו-test_suites מופיע בסעיף הגדרות במאמרי העזרה של תהליך העבודה של פיתוח בדיקה.

מאפייני בדיקה בולטים ב-Rust

המודולים של rust_test יורשים מאפיינים ממודולים של rust_binary כפי שמתואר בדף Binary Modules.

המאפיינים שמוגדרים בטבלה הבאה הם בנוסף למאפיינים משותפים חשובים שחלים על כל המודולים. הם חשובים במיוחד למודולים של בדיקות Rust, או שהם מציגים התנהגות ייחודית ספציפית לסוג המודול rust_test.

  • test_harness: שימוש מתקדם, ברירת המחדל היא true.

מגדירים את הערך הזה כ-false אם ב-rust_test מופעלת הטמעה של ערכת בדיקות משלו ואין צורך להשתמש בערכת הבדיקות המובנית של Rust (כלומר, הגדרת הערך הזה כ-false לא מעבירה את הדגל --test אל rustc).

הימנעות מכפילויות בין rust_library לבין rust_test

כשמשתמשים בבדיקות Rust מוטמעות באמצעות מודולים בתצוגת עץ, בסופו של דבר מתקבלות כפילויות בקובץ Android.bp. הבעיה היא שצריך לרשום את יחסי התלות פעמיים, פעם אחת עבור rust_library ופעם אחת עבור 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",
    ],
}

כל מודול rust_test יציג בסופו של דבר את אותן יחסי תלות כמו המודול rust_library התואם. כדי להבטיח עקביות בין המודולים, אפשר לרשום את יחסי התלות רק פעם אחת במודול 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"],
}

כך, הספרייה ומודול הבדיקה תמיד ישתמשו באותם יחסי תלות.