اختبار الوحدات

تقدّم هذه الصفحة معلومات أساسية حول كيفية إنشاء وحدة rust_test تستخدم إطار اختبار Rust.

كتابة اختبار Rust أساسي

للاطّلاع على مثال مباشر لاختبار Rust على الجهاز والمضيف، يمكنك عرض keystore2 Android.bp أو العثور على مثال في العديد من الحِزم في الدليل 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 يتم تشغيلها تلقائيًا في عملية التحقّق المسبق ما لم يتم ضبط 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. المشكلة هي أنّه عليك إدراج التبعيات مرتين، مرة واحدة لـ 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"],
}

بهذه الطريقة، ستستخدم المكتبة ووحدة الاختبار دائمًا التبعيات نفسها.