ทดสอบการแมป

นี่เป็นข้อมูลเบื้องต้นเกี่ยวกับการแมปการทดสอบและคำอธิบายวิธีเริ่มต้นการกำหนดค่าการทดสอบในโปรเจ็กต์โอเพนซอร์ส Android (AOSP)

เกี่ยวกับการทดสอบการแมป

การแมปทดสอบเป็นวิธีที่อิงตาม Gerrit ซึ่งช่วยให้นักพัฒนาแอปสร้างกฎการทดสอบแบบส่งล่วงหน้าและหลังส่งได้โดยตรงในซอร์สโค้ด Android และปล่อยให้มีการทดสอบ Branch และอุปกรณ์กับโครงสร้างพื้นฐานทดสอบ คําจํากัดความการแมปการทดสอบคือไฟล์ JSON ชื่อ TEST_MAPPING ที่คุณวางไว้ในไดเรกทอรีต้นทางใดก็ได้

Atest สามารถใช้ไฟล์ TEST_MAPPING เพื่อเรียกใช้การทดสอบก่อนส่งในไดเรกทอรีที่เกี่ยวข้อง การแมปการทดสอบช่วยให้คุณเพิ่มชุดการทดสอบเดียวกันในการตรวจสอบก่อนส่งได้โดยทำการเปลี่ยนแปลงเพียงเล็กน้อยในซอร์สโค้ด Android

ดูตัวอย่างต่อไปนี้

การแมปทดสอบใช้ตัวทดสอบสหพันธ์การค้า (TF) สำหรับการดำเนินการทดสอบและการรายงานผลลัพธ์

กำหนดกลุ่มทดสอบ

ทดสอบการแมปกลุ่มด้วยกลุ่มทดสอบ ชื่อของกลุ่มทดสอบ จะเป็นสตริงใดก็ได้ ตัวอย่างเช่น ส่งล่วงหน้าอาจเป็นชื่อของกลุ่มการทดสอบที่จะเรียกใช้เมื่อตรวจสอบการเปลี่ยนแปลง และ postsubmit อาจเป็นการทดสอบที่ใช้เพื่อตรวจสอบบิลด์หลังจากผสานการเปลี่ยนแปลงแล้ว

กฎสคริปต์บิลด์แพ็กเกจ

ชุดทดสอบของ Trade Federation ต้องตั้งค่า test_suites สำหรับ Soong หรือ LOCAL_COMPATIBILITY_SUITE สำหรับ Make เป็นชุดใดชุดหนึ่งต่อไปนี้จึงจะเรียกใช้โมดูลทดสอบสำหรับบิลด์หนึ่งๆ ได้

  • general-tests สำหรับทดสอบที่ไม่ขึ้นอยู่กับความสามารถเฉพาะอุปกรณ์ (เช่น ฮาร์ดแวร์เฉพาะของผู้ให้บริการที่อุปกรณ์ส่วนใหญ่ไม่มี) การทดสอบส่วนใหญ่ควรอยู่ในชุด general-tests แม้ว่าจะเจาะจงสำหรับ ABI หรือจำนวนบิตหรือฟีเจอร์ฮาร์ดแวร์อย่าง HWASan ก็ตาม (มีเป้าหมาย test_suites แยกต่างหากสำหรับ ABI แต่ละรายการ) และแม้ว่าจะต้องทำงานบนอุปกรณ์ก็ตาม
  • device-tests สำหรับทดสอบที่ขึ้นอยู่กับความสามารถเฉพาะของอุปกรณ์ โดยปกติแล้วการทดสอบเหล่านี้จะอยู่ในส่วน vendor/ เฉพาะอุปกรณ์หมายถึงความสามารถที่มีเฉพาะในอุปกรณ์เท่านั้น ดังนั้นการทดสอบนี้จะมีผลกับการทดสอบ JUnit และการทดสอบ GTest (ซึ่งปกติแล้วควรทำเครื่องหมายเป็น general-tests แม้ว่าจะเป็น ABI ที่เฉพาะเจาะจงก็ตาม)

ตัวอย่าง

Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests

กำหนดค่าการทดสอบที่จะเรียกใช้ในชุดทดสอบ

หากต้องการทำการทดสอบภายในชุดทดสอบ การทดสอบจะมีลักษณะดังนี้

  • ต้องไม่มีผู้ให้บริการบิลด์
  • ต้องล้างข้อมูลหลังจากการทดสอบเสร็จสิ้น เช่น ลบไฟล์ชั่วคราวที่สร้างขึ้นระหว่างการทดสอบ
  • ต้องเปลี่ยนการตั้งค่าระบบเป็นค่าเริ่มต้นหรือค่าเดิม
  • ไม่ควรถือว่าอุปกรณ์อยู่ในสถานะหนึ่งๆ เช่น พร้อมใช้งานรูท การทดสอบส่วนใหญ่ไม่จําเป็นต้องใช้สิทธิ์รูทในการเรียกใช้ หากการทดสอบต้องใช้ root จะต้องระบุด้วย RootTargetPreparer ใน AndroidTest.xml ดังตัวอย่างต่อไปนี้

    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
    

สร้างไฟล์การแมปทดสอบ

สําหรับไดเรกทอรีที่ต้องใช้การครอบคลุมการทดสอบ ให้เพิ่มTEST_MAPPINGไฟล์ JSON ที่มีลักษณะคล้ายกับตัวอย่าง กฎเหล่านี้ช่วยให้มั่นใจได้ว่าการทดสอบจะทำงานในการตรวจสอบก่อนส่งเมื่อมีการแก้ไขไฟล์ในไดเรกทอรีนั้นหรือไดเรกทอรีย่อยใดๆ

ทำตามตัวอย่าง

ต่อไปนี้คือตัวอย่างไฟล์ TEST_MAPPING (เป็นไฟล์รูปแบบ JSON แต่รองรับความคิดเห็น)

{
  "presubmit": [
    // JUnit test with options and file patterns.
    {
      "name": "CtsWindowManagerDeviceTestCases",
      "options": [
        {
          "include-annotation": "android.platform.test.annotations.RequiresDevice"
        }
      ],
      "file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
    },
    // Device-side GTest with options.
    {
      "name" : "hello_world_test",
      "options": [
        {
          "native-test-flag": "\"servicename1 servicename2\""
        },
        {
          "native-test-timeout": "6000"
        }
      ]
    }
    // Host-side GTest.
    {
      "name" : "net_test_avrcp",
      "host" : true
    }
  ],
  "postsubmit": [
    {
      "name": "CtsDeqpTestCases",
      "options": [
        {
          // Use regex in include-filter which is supported in AndroidJUnitTest
          "include-filter": "dEQP-EGL.functional.color_clears.*"
        }
      ]
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

ตั้งค่าแอตทริบิวต์

ในตัวอย่าง presubmit และ postsubmit คือชื่อของกลุ่มทดสอบแต่ละกลุ่ม ดูข้อมูลเพิ่มเติมเกี่ยวกับกลุ่มทดสอบได้ที่กําหนดกลุ่มทดสอบ

คุณสามารถตั้งชื่อโมดูลทดสอบหรือการทดสอบการผสานรวม Trade Federation (เช่น เส้นทางทรัพยากรไปยังไฟล์ XML ทดสอบ uiautomator/uiautomator-demo) ในค่าของแอตทริบิวต์ name โปรดทราบว่าช่อง name ใช้คลาส name หรือเมธอดทดสอบ name ไม่ได้ หากต้องการจำกัดการทดสอบที่จะทํา ให้ใช้ตัวเลือก เช่น include-filter ดูตัวอย่างการใช้งาน include-filter

การตั้งค่า host ของการทดสอบจะระบุว่าการทดสอบเป็นการทดสอบแบบไม่มีอุปกรณ์ที่ทำงานบนโฮสต์หรือไม่ ค่าเริ่มต้นคือ false ซึ่งหมายความว่าการทดสอบต้องใช้อุปกรณ์ ประเภทการทดสอบที่รองรับ ได้แก่ HostGTest สําหรับไฟล์ไบนารี GTest และ HostTest สําหรับการทดสอบ JUnit

แอตทริบิวต์ file_patterns ช่วยให้คุณตั้งค่ารายการสตริงนิพจน์ทั่วไปเพื่อจับคู่เส้นทางแบบสัมพัทธ์ของไฟล์ซอร์สโค้ด (สัมพัทธ์กับไดเรกทอรีที่มีไฟล์ TEST_MAPPING) ในตัวอย่างนี้ การทดสอบ CtsWindowManagerDeviceTestCases จะทำงานใน "ก่อนส่ง" เฉพาะเมื่อไฟล์ Java ขึ้นต้นด้วย Window หรือ Activity ซึ่งอยู่ในไดเรกทอรีเดียวกับไฟล์ TEST_MAPPING หรือไดเรกทอรีย่อยของไฟล์ TEST_MAPPING โดยแบ็กสแลช (\) จะต้องกำหนดเป็นอักขระหลีกเหมือนอยู่ในไฟล์ JSON

แอตทริบิวต์ imports ช่วยให้คุณรวมการทดสอบไว้ในไฟล์ TEST_MAPPING อื่นๆ ได้โดยไม่ต้องคัดลอกเนื้อหา รวมถึงไฟล์ TEST_MAPPING ในไดเรกทอรีระดับบนสุดของเส้นทางที่นำเข้าด้วย การแมปทดสอบอนุญาตการนำเข้าที่ซ้อนกัน ซึ่งหมายความว่าไฟล์ TEST_MAPPING 2 ไฟล์นำเข้าต่อกันได้ และการแมปทดสอบจะผสานการทดสอบที่รวมอยู่ได้

แอตทริบิวต์ options มีตัวเลือกบรรทัดคำสั่งของ Tradefed เพิ่มเติม

หากต้องการดูรายการตัวเลือกทั้งหมดที่ใช้ได้สําหรับการทดสอบหนึ่งๆ ให้เรียกใช้คำสั่งต่อไปนี้

tradefed.sh run commandAndExit [test_module] --help

ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของตัวเลือกต่างๆ ได้ที่การจัดการตัวเลือกในการแลกซื้อเครื่องใหม่

เรียกใช้การทดสอบด้วย Atest

วิธีเรียกใช้กฎการทดสอบก่อนส่งในเครื่อง

  1. ไปที่ไดเรกทอรีที่มีไฟล์ TEST_MAPPING
  2. เรียกใช้คําสั่งต่อไปนี้

    atest
    

ระบบจะเรียกใช้การทดสอบก่อนส่งทั้งหมดที่กำหนดค่าไว้ในไฟล์ TEST_MAPPING ของไดเรกทอรีปัจจุบันและไดเรกทอรีหลัก Atest จะค้นหาและทำการทดสอบ 2 รายการสําหรับการส่งก่อน (A และ B)

วิธีนี้เป็นวิธีที่ตรงที่สุดในการเรียกใช้การทดสอบก่อนส่งในTEST_MAPPING ไฟล์ในไดเรกทอรีทํางานปัจจุบัน (CWD) และไดเรกทอรีหลัก Atest จะค้นหาและใช้ไฟล์ TEST_MAPPING ใน CWD และไดเรกทอรีหลักทั้งหมด

ซอร์สโค้ดของโครงสร้าง

ตัวอย่างนี้แสดงวิธีกำหนดค่าไฟล์ TEST_MAPPING ในซอร์สโค้ด

src
├── project_1
│   └── TEST_MAPPING
├── project_2
│   └── TEST_MAPPING
└── TEST_MAPPING

เนื้อหาของ src/TEST_MAPPING:

{
  "presubmit": [
    {
      "name": "A"
    }
  ]
}

เนื้อหาของ src/project_1/TEST_MAPPING:

{
  "presubmit": [
    {
      "name": "B"
    }
  ],
  "postsubmit": [
    {
      "name": "C"
    }
  ],
  "other_group": [
    {
      "name": "X"
    }
  ]}

เนื้อหาของ src/project_2/TEST_MAPPING

{
  "presubmit": [
    {
      "name": "D"
    }
  ],
  "import": [
    {
      "path": "src/project_1"
    }
  ]}

ระบุไดเรกทอรีเป้าหมาย

คุณสามารถระบุไดเรกทอรีเป้าหมายเพื่อเรียกใช้การทดสอบในไฟล์ TEST_MAPPING ในไดเรกทอรีนั้นได้ คำสั่งต่อไปนี้เรียกใช้การทดสอบ 2 รายการ (A, B)

atest --test-mapping src/project_1

เรียกใช้กฎการทดสอบหลังการส่ง

คุณยังใช้คำสั่งนี้เพื่อเรียกใช้กฎการทดสอบหลังการส่งที่กําหนดไว้ใน TEST_MAPPING ใน src_path (ค่าเริ่มต้นคือ CWD) และไดเรกทอรีหลักได้ด้วย

atest [--test-mapping] [src_path]:postsubmit

เรียกใช้การทดสอบที่ไม่ต้องใช้อุปกรณ์เท่านั้น

คุณสามารถใช้ตัวเลือก --host สำหรับ Atest เพื่อเรียกใช้เฉพาะการทดสอบที่กำหนดค่าไว้กับโฮสต์ที่ไม่ต้องใช้อุปกรณ์ หากไม่มีตัวเลือกนี้ Atest จะเรียกใช้ทั้งการทดสอบที่ต้องใช้อุปกรณ์และการทดสอบที่ทำงานบนโฮสต์ที่ไม่ต้องใช้อุปกรณ์ การทดสอบจะทําในชุดทดสอบแยกกัน 2 ชุด ดังนี้

atest [--test-mapping] --host

ระบุกลุ่มทดสอบ

คุณสามารถระบุกลุ่มทดสอบในคําสั่ง Atest คำสั่งต่อไปนี้จะเรียกใช้การทดสอบ postsubmit ทั้งหมดที่เกี่ยวข้องกับไฟล์ในไดเรกทอรี src/project_1 ซึ่งมีเพียงการทดสอบเดียว (C)

หรือจะใช้ :all เพื่อเรียกใช้การทดสอบทั้งหมดโดยไม่คำนึงถึงกลุ่มก็ได้ คำสั่งต่อไปนี้เรียกใช้การทดสอบ 4 รายการ (A, B, C, X)

atest --test-mapping src/project_1:all

รวมไดเรกทอรีย่อย

โดยค่าเริ่มต้น การเรียกใช้การทดสอบใน TEST_MAPPING ด้วย Atest จะเรียกใช้เฉพาะการทดสอบก่อนส่งที่กําหนดค่าไว้ในไฟล์ TEST_MAPPING ใน CWD (หรือไดเรกทอรีที่ระบุ) และไดเรกทอรีหลัก หากต้องการเรียกใช้การทดสอบในไฟล์ TEST_MAPPING ทั้งหมดในไดเรกทอรีย่อย ให้ใช้ตัวเลือก --include-subdir เพื่อบังคับให้ Atest รวมการทดสอบเหล่านั้นไว้ด้วย

atest --include-subdir

หากไม่มีตัวเลือก --include-subdir โปรแกรม Atest จะเรียกใช้เฉพาะการทดสอบ A เมื่อใช้ตัวเลือก --include-subdir โปรแกรม Atest จะทำการทดสอบ 2 รายการ (A, B)

รองรับความคิดเห็นระดับบรรทัด

คุณสามารถเพิ่มความคิดเห็นเกี่ยวกับรูปแบบ // ระดับบรรทัดเพื่อขยายรายละเอียดของTEST_MAPPINGไฟล์พร้อมคำอธิบายการตั้งค่าที่ตามมา ATest และ Trade Federation จะประมวลผล TEST_MAPPING ล่วงหน้าให้เป็นรูปแบบ JSON ที่ถูกต้องโดยไม่มีความคิดเห็น ระบบจะรองรับเฉพาะความคิดเห็นรูปแบบ // ระดับบรรทัดเท่านั้นเพื่อให้ไฟล์ JSON สะอาด

ตัวอย่าง

{
  // For presubmit test group.
  "presubmit": [
    {
      // Run test on module A.
      "name": "A"
    }
  ]
}