टेस्ट मॉड्यूल

इस पेज पर, Rust टेस्ट हार्नेस का इस्तेमाल करने वाले rust_test मॉड्यूल बनाने के बारे में बुनियादी जानकारी दी गई है.

Rust में बुनियादी टेस्ट लिखना

डिवाइस पर और होस्ट पर किए गए रस्ट टेस्ट का लाइव उदाहरण देखने के लिए, keystore2 Android.bp देखें. इसके अलावा, external/rust/crates डायरेक्ट्री में मौजूद कई क्रेट में से किसी एक में भी इसे देखा जा सकता है.

rust_test मॉड्यूल, rustc के --test फ़्लैग का इस्तेमाल करके बनाया जाता है. यह #[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 दस्तावेज़ पढ़ें. हालांकि, libfoo_inline_tests उदाहरण के लिए, इसे प्रीसबमिट में जोड़ें, ताकि TreeHugger पर टेस्ट रन किए जा सकें:

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

ध्यान दें कि rust_test_host को false पर सेट न किए जाने पर, rust_test_host मॉड्यूल डिफ़ॉल्ट रूप से प्रीसबमिट में चलते हैं. इसलिए, आपको इन्हें TEST_MAPPING फ़ाइलों में एलान करने की ज़रूरत नहीं है.unit_tests:

auto_gen_config और test_suites प्रॉपर्टी के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, टेस्ट डेवलपमेंट वर्कफ़्लो दस्तावेज़ का सेटिंग सेक्शन देखें.

Rust टेस्ट की ज़रूरी प्रॉपर्टी

rust_test मॉड्यूल, rust_binary मॉड्यूल से प्रॉपर्टी इनहेरिट करते हैं. इसके बारे में बाइनरी मॉड्यूल पेज पर बताया गया है.

नीचे दी गई टेबल में बताई गई प्रॉपर्टी के अलावा, सामान्य तौर पर इस्तेमाल होने वाली ज़रूरी प्रॉपर्टी भी होती हैं. ये प्रॉपर्टी सभी मॉड्यूल पर लागू होती हैं. ये Rust टेस्ट मॉड्यूल के लिए खास तौर पर ज़रूरी हैं या rust_test मॉड्यूल टाइप के लिए खास व्यवहार दिखाते हैं.

  • test_harness: ऐडवांस इस्तेमाल के लिए, डिफ़ॉल्ट रूप से true पर सेट होता है.

अगर आपका rust_test अपना टेस्ट हार्नेस लागू करता है और आपको Rust के बिल्ट-इन टेस्ट हार्नेस का इस्तेमाल नहीं करना है, तो इसे false पर सेट करें. दूसरे शब्दों में, इसे false पर सेट करने से, --test फ़्लैग, rustc को नहीं भेजा जाएगा.

rust_library और rust_test के बीच डुप्लीकेट होने से बचें

नेस्ट किए गए मॉड्यूल के ज़रिए इनलाइन रस्ट टेस्ट का इस्तेमाल करने पर, आपकी 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"],
}

इस तरह, लाइब्रेरी और टेस्ट मॉड्यूल हमेशा एक ही डिपेंडेंसी का इस्तेमाल करेंगे.