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

בדף הזה מוסבר איך לבנות מודול rust_test שמשתמש ב-Rust test harness.

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

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

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

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

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 כדי לקבל מידע נוסף, אבל כדי להפעיל את ריצות הבדיקה ב-TreeHugger, צריך להוסיף את הקוד הבא ל-presubmit בדוגמה libfoo_inline_tests:

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

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

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

מאפייני בדיקה חשובים ב-Rust

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

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

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