ทดสอบการแมป

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

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

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

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

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

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

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

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

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

สำหรับเครื่องมือทดสอบของสหพันธ์การค้า เพื่อเรียกใช้โมดูลทดสอบสำหรับบิลด์ที่กำหนด โมดูลเหล่านี้ต้องมี ตั้งค่า test_suites สำหรับ Soong หรือ LOCAL_COMPATIBILITY_SUITE แล้ว สำหรับทำให้เป็นชุดใดชุดหนึ่งจาก 2 ชุดนี้

  • 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

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

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

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

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

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

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

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

ต่อไปนี้คือตัวอย่างไฟล์ 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": "CtsWindowManagerDeviceTestCases"
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

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

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

คุณสามารถตั้งชื่อโมดูลการทดสอบหรือการทดสอบการผสานรวมสหพันธ์การค้าได้ ชื่อ (เส้นทางทรัพยากรไปยังไฟล์ 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 ไฟล์หรือไดเรกทอรีย่อยมีการเปลี่ยนแปลง แบ็กสแลช "`" ต้องมีการกำหนดเป็นอักขระหลีกเนื่องจากอยู่ในไฟล์ 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 รายการ สำหรับการส่งล่วงหน้า (ก และ ข)

วิธีนี้เป็นวิธีที่ง่ายที่สุดในการดำเนินการทดสอบส่งล่วงหน้าใน TEST_MAPPING ไฟล์ในไดเรกทอรีการทำงานปัจจุบัน (CWD) และไดเรกทอรีระดับบน ล่าสุด ค้นหาและใช้ไฟล์ 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 รายการ ที่กำหนดให้มีอุปกรณ์และโรงภาพยนตร์ทำงานบนโฮสต์และไม่ต้องใช้อุปกรณ์ การทดสอบจะดำเนินการในชุดแยกกัน 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 และสหพันธ์การค้า ประมวลผล TEST_MAPPING ล่วงหน้าเป็นรูปแบบ JSON ที่ถูกต้องโดยไม่มีความคิดเห็น หากต้องการเก็บ ไฟล์ JSON สะอาดแล้ว เฉพาะความคิดเห็นในรูปแบบ // ระดับบรรทัดเท่านั้น ได้

ตัวอย่าง

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