โมดูลทดสอบ

หน้านี้ให้ข้อมูลเบื้องต้นเกี่ยวกับวิธีสร้างrust_testโมดูลที่ใช้ชุดทดสอบ Rust

เขียนการทดสอบ Rust พื้นฐาน

ดูตัวอย่างการทดสอบ Rust บนอุปกรณ์และบนโฮสต์แบบเรียลไทม์ได้ที่ keystore2 Android.bp หรือค้นหาตัวอย่างในเคจจ์จำนวนมากในไดเรกทอรี external/rust/crates

โมดูล rust_test จะสร้างโดยใช้ Flag --test ของ rustc ซึ่งสร้างการทดสอบจากโค้ดที่มีการทำเครื่องหมายด้วยแอตทริบิวต์ #[test] ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบแอตทริบิวต์การทดสอบข้อมูลอ้างอิง Rust

กำหนดโมดูลทดสอบดังนี้

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 จะทำงานโดยค่าเริ่มต้นในการส่งล่วงหน้า เว้นแต่จะตั้งค่า unit_tests: เป็น false คุณจึงไม่จำเป็นต้องประกาศโมดูลเหล่านี้ใน TEST_MAPPING ไฟล์

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทํางานของพร็อพเพอร์ตี้ auto_gen_config และ test_suites ได้ที่ส่วนการตั้งค่าของเอกสารประกอบเวิร์กโฟลว์การพัฒนาการทดสอบ

พร็อพเพอร์ตี้การทดสอบ Rust ที่โดดเด่น

โมดูล rust_test จะรับพร็อพเพอร์ตี้จากโมดูล rust_binary ตามที่อธิบายไว้ในหน้าโมดูลไบนารี

พร็อพเพอร์ตี้ที่กําหนดไว้ในตารางด้านล่างนี้นอกเหนือจากพร็อพเพอร์ตี้ทั่วไปที่สําคัญซึ่งใช้กับข้อบังคับทั้งหมด รายการเหล่านี้มีความสำคัญอย่างยิ่งต่อโมดูลทดสอบ Rust หรือแสดงลักษณะการทำงานเฉพาะสำหรับประเภทโมดูล rust_test

  • test_harness: การใช้งานขั้นสูง โดยค่าเริ่มต้นจะเป็น "จริง"

ตั้งค่าเป็น "เท็จ" หาก rust_test ใช้สายทดสอบของตัวเองและไม่จำเป็นต้องใช้ชุดทดสอบ Rust ในตัว (กล่าวคือ การตั้งค่านี้เป็น "เท็จ" จะไม่ส่งแฟล็ก --test ไปยัง rustc)

หลีกเลี่ยงการซ้ำกันระหว่าง rust_library กับ rust_test

เมื่อใช้การทดสอบ Rust แบบแทรกผ่านโมดูลที่ฝังไว้ คุณจะได้รับข้อมูลซ้ำในไฟล์ Android.bp ปัญหาคือคุณต้องระบุรายการพึ่งพา 2 ครั้ง โดย 1 ครั้งสำหรับ rust_library และ 1 ครั้งสำหรับ 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 แต่ละโมดูลจะแสดงรายการทรัพยากร Dependency เดียวกันกับโมดูล 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"],
}

วิธีนี้จะทำให้ไลบรารีและโมดูลทดสอบใช้ทรัพยากรเดียวกันเสมอ