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