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