นี่คือการแนะนำการแมปการทดสอบโดยย่อและคำอธิบายวิธีเริ่มต้นกำหนดค่าการทดสอบใน Android Open Source Project (AOSP)
เกี่ยวกับการเชื่อมโยงการทดสอบ
การทดสอบแมปเป็นแนวทางที่ใช้ Gerrit ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์สร้างกฎการทดสอบก่อนส่ง
และหลังส่งได้โดยตรงในโครงสร้างแหล่งที่มาของ Android และปล่อยให้
โครงสร้างพื้นฐานการทดสอบเป็นผู้กำหนดสาขาและอุปกรณ์ที่จะทดสอบ
คำจำกัดความการแมปการทดสอบคือไฟล์ JSON ที่ชื่อ TEST_MAPPING
ซึ่งคุณวางไว้ในไดเรกทอรีแหล่งที่มาใดก็ได้
Atest สามารถใช้ไฟล์ TEST_MAPPING
เพื่อเรียกใช้การทดสอบก่อนส่งในไดเรกทอรีที่เชื่อมโยงได้ การแมปการทดสอบช่วยให้คุณเพิ่มชุดการทดสอบเดียวกันลงในการตรวจสอบก่อนส่งได้โดยมีการเปลี่ยนแปลงน้อยที่สุดภายในโครงสร้างแหล่งที่มาของ Android
ดูตัวอย่างต่อไปนี้
การทดสอบการแมปอาศัย ชุดทดสอบของสหพันธ์การค้า (TF) สำหรับ การดำเนินการทดสอบและการรายงานผลลัพธ์
กำหนดกลุ่มทดสอบ
ทดสอบการทดสอบกลุ่มการแมปด้วยกลุ่มทดสอบ ชื่อกลุ่มทดสอบต้องเป็นสตริง ใดก็ได้ เช่น presubmit อาจเป็นชื่อของกลุ่มการทดสอบที่จะ เรียกใช้เมื่อตรวจสอบการเปลี่ยนแปลง และ postsubmit อาจเป็นการทดสอบที่ใช้เพื่อตรวจสอบ บิลด์หลังจากผสานรวมการเปลี่ยนแปลงแล้ว
กฎสคริปต์การสร้างแพ็กเกจ
หากต้องการให้ Trade Federation test harness
เรียกใช้โมดูลทดสอบสำหรับบิลด์ที่กำหนด โมดูลเหล่านี้ต้องมี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"/>
สร้างไฟล์การจับคู่ทดสอบ
สำหรับไดเรกทอรีที่ต้องมีการทดสอบ ให้เพิ่ม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
จะทำงานใน Presubmit ก็ต่อเมื่อไฟล์ Java
ขึ้นต้นด้วย Window
หรือ Activity
ซึ่งอยู่ในไดเรกทอรีเดียวกับไฟล์
TEST_MAPPING
หรือไดเรกทอรีย่อยใดๆ ต้องหลีกเลี่ยงการใช้แบ็กสแลช (\) เนื่องจากอยู่ในไฟล์ JSON
แอตทริบิวต์ imports
ช่วยให้คุณรวมการทดสอบในไฟล์ TEST_MAPPING
อื่นๆ
ได้โดยไม่ต้องคัดลอกเนื้อหา ระบบจะรวมTEST_MAPPING
ไฟล์ในไดเรกทอรีหลัก
ของเส้นทางที่นำเข้าด้วย การทดสอบการแมปช่วยให้สามารถนำเข้าแบบซ้อนได้ ซึ่งหมายความว่าไฟล์ TEST_MAPPING
2 ไฟล์สามารถนำเข้าซึ่งกันและกันได้ และการทดสอบการแมปจะผสานรวมการทดสอบที่รวมไว้ได้
แอตทริบิวต์ options
มีตัวเลือกบรรทัดคำสั่ง Tradefed เพิ่มเติม
หากต้องการดูรายการตัวเลือกทั้งหมดที่ใช้ได้สำหรับการทดสอบที่ต้องการ ให้เรียกใช้คำสั่งต่อไปนี้
tradefed.sh run commandAndExit [test_module] --help
ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของตัวเลือกได้ที่ การจัดการตัวเลือกใน Tradefed
เรียกใช้การทดสอบด้วย 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"
}
]
}