ทดสอบการทำแผนที่

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

นี่คือบทนำสั้นๆ ของการทำแผนที่ทดสอบและคำอธิบายเกี่ยวกับวิธีเริ่มต้นการกำหนดค่าการทดสอบอย่างง่ายดายใน Android Open Source Project (AOSP)

การทำแผนที่ทดสอบคืออะไร?

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

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

ดูตัวอย่างเหล่านี้:

เพิ่มการทดสอบล่วงหน้าไปที่ TEST_MAPPING สำหรับ services.core

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

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

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

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

กฎสคริปต์การสร้างบรรจุภัณฑ์

เพื่อให้ Trade Federation Test Harness เรียกใช้โมดูลทดสอบของ Test Mapping สำหรับบิลด์ที่กำหนด โมดูลเหล่านี้ต้องมีชุด test_suite สำหรับ Soong หรือชุด LOCAL_COMPATIBILITY_SUITE สำหรับ Make เป็นหนึ่งในสองชุดต่อไปนี้:

  • การทดสอบทั่วไป - การ ทดสอบที่ไม่ขึ้นอยู่กับฟังก์ชันเฉพาะของอุปกรณ์ (เช่น ฮาร์ดแวร์เฉพาะของผู้จำหน่ายที่อุปกรณ์ส่วนใหญ่ไม่มี) การทดสอบส่วนใหญ่ควรอยู่ในชุดการทดสอบทั่วไป แม้ว่าจะเจาะจงสำหรับ ABI หรือ bitness หรือคุณลักษณะของฮาร์ดแวร์อย่าง HWASan (มี test_suites เป้าหมายแยกต่างหากสำหรับ ABI แต่ละรายการ) และแม้ว่าจะต้องทำงานบนอุปกรณ์ก็ตาม
  • การทดสอบอุปกรณ์ - การ ทดสอบที่ขึ้นอยู่กับฟังก์ชันเฉพาะของอุปกรณ์ โดยทั่วไปการทดสอบเหล่านี้จะอยู่ภายใต้ vendor/ เนื่องจาก "เฉพาะอุปกรณ์" ไม่ได้หมายถึงฟังก์ชัน ABI หรือ SoC ที่อุปกรณ์อื่นอาจมีหรือไม่มี แต่หมายถึง ฟังก์ชัน เฉพาะสำหรับอุปกรณ์เท่านั้น จึงใช้กับการทดสอบ 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": "CtsWindowManagerDeviceTestCases"
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

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

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

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

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

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

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

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

หากต้องการรับรายการตัวเลือกทั้งหมดสำหรับการทดสอบที่กำหนด ให้เรียกใช้:

tradefed.sh run commandAndExit [test_module] --help

โปรดดูที่การ จัดการตัวเลือกของ TradeFed สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของออปชั่น

ทำการทดสอบกับ Atest

ในการดำเนินการกฎการทดสอบล่วงหน้าในเครื่อง:

  1. ไปที่ไดเร็กทอรีที่มีไฟล์ TEST_MAPPING
  2. เรียกใช้คำสั่ง:
atest

การทดสอบก่อนส่งทั้งหมดที่กำหนดค่าไว้ในไฟล์ TEST_MAPPING ของไดเร็กทอรีปัจจุบันและไดเร็กทอรีหลักจะถูกรัน Atest จะค้นหาและเรียกใช้การทดสอบสองครั้งสำหรับการส่งล่วงหน้า (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 ในไดเร็กทอรีนั้น คำสั่งต่อไปนี้จะเรียกใช้การทดสอบสองครั้ง (A, B)

atest --test-mapping src/project_1

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

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

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

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

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

atest [--test-mapping] --host

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

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

หรือคุณสามารถใช้ :all เพื่อรันการทดสอบทั้งหมดโดยไม่คำนึงถึงกลุ่ม คำสั่งต่อไปนี้รันการทดสอบสี่ครั้ง (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 จะทำการทดสอบสองครั้ง (A, B)

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

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

ตัวอย่าง:

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