นี่เป็นข้อมูลเบื้องต้นเกี่ยวกับการแมปการทดสอบและคำอธิบายวิธีเริ่มต้นการกำหนดค่าการทดสอบในโปรเจ็กต์โอเพนซอร์ส Android (AOSP)
เกี่ยวกับการทดสอบการแมป
การแมปทดสอบเป็นวิธีที่อิงตาม Gerrit ซึ่งช่วยให้นักพัฒนาแอปสร้างกฎการทดสอบแบบส่งล่วงหน้าและหลังส่งได้โดยตรงในซอร์สโค้ด Android และปล่อยให้มีการทดสอบ Branch และอุปกรณ์กับโครงสร้างพื้นฐานทดสอบ
คําจํากัดความการแมปการทดสอบคือไฟล์ JSON ชื่อ TEST_MAPPING
ที่คุณวางไว้ในไดเรกทอรีต้นทางใดก็ได้
Atest สามารถใช้ไฟล์ TEST_MAPPING
เพื่อเรียกใช้การทดสอบก่อนส่งในไดเรกทอรีที่เกี่ยวข้อง การแมปการทดสอบช่วยให้คุณเพิ่มชุดการทดสอบเดียวกันในการตรวจสอบก่อนส่งได้โดยทำการเปลี่ยนแปลงเพียงเล็กน้อยในซอร์สโค้ด Android
ดูตัวอย่างต่อไปนี้
เพิ่มการทดสอบที่ส่งล่วงหน้าไปยัง
TEST_MAPPING
สำหรับservices.core
เพิ่มการทดสอบที่ส่งล่วงหน้าไปยัง
TEST_MAPPING
สำหรับtools/dexter
โดยใช้การนำเข้า
การแมปทดสอบใช้ตัวทดสอบสหพันธ์การค้า (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
วิธีเรียกใช้กฎการทดสอบก่อนส่งในเครื่อง
- ไปที่ไดเรกทอรีที่มีไฟล์
TEST_MAPPING
เรียกใช้คําสั่งต่อไปนี้
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"
}
]
}