AOSP มีเทมเพลตการทดสอบสําหรับโมดูลการทดสอบที่ไม่ใช่คลาสย่อย Python ฝั่งโฮสต์ของ BaseTest ของโปรแกรมรันไทม์ VTS
นักพัฒนาซอฟต์แวร์สามารถใช้เทมเพลตเหล่านี้เพื่อลดความพยายามในการผสานรวมการทดสอบดังกล่าว ส่วนนี้จะกล่าวถึงการกำหนดค่าและการใช้เทมเพลตการทดสอบ (อยู่ในไดเรกทอรี testcases/template ของ VTS) และแสดงตัวอย่างเทมเพลตที่ใช้กันโดยทั่วไป
เทมเพลต BinaryTest
ใช้เทมเพลต BinaryTest เพื่อผสานรวมการทดสอบที่ดำเนินการในอุปกรณ์เป้าหมายใน VTS การทดสอบฝั่งเป้าหมาย ได้แก่
- การทดสอบที่ใช้ C++ คอมไพล์และพุชไปยังอุปกรณ์
- การทดสอบ Python ฝั่งเป้าหมายที่คอมไพล์เป็นไบนารี
- สคริปต์ Shell ที่เรียกใช้ได้ในอุปกรณ์
การทดสอบเหล่านี้ผสานรวมเข้ากับ VTS ได้โดยมีหรือไม่มีเทมเพลต BinaryTest ก็ได้
ผสานรวมการทดสอบฝั่งเป้าหมายกับเทมเพลต BinaryTest
เทมเพลต BinaryTest ออกแบบมาเพื่อช่วยนักพัฒนาซอฟต์แวร์ผสานรวมการทดสอบฝั่งเป้าหมายได้อย่างง่ายดาย ในกรณีส่วนใหญ่ คุณสามารถเพิ่มการกําหนดค่า 2-3 บรรทัดง่ายๆ ใน AndroidTest.xml
ตัวอย่างการกําหนดค่าจาก VtsDeviceTreeEarlyMountTest
<configuration description="Config for VTS VtsDeviceTreeEarlyMountTest."> ... <test class="com.android.tradefed.testtype.VtsMultiDeviceTest"> <option name="test-module-name" value="VtsDeviceTreeEarlyMountTest"/> <option name="binary-test-source" value="_32bit::DATA/nativetest/dt_early_mount_test/dt_early_mount_test" /> <option name="binary-test-source" value="_64bit::DATA/nativetest64/dt_early_mount_test/dt_early_mount_test" /> <option name="test-timeout" value="5m"/> </test> </configuration>
ในการกำหนดค่านี้
binary-test-source
และbinary-test-type
จะใช้ได้กับเทมเพลตเท่านั้น- การระบุเส้นทางโฮสต์แบบสัมพัทธ์ของแหล่งที่มาของไฟล์ไบนารีทดสอบช่วยให้เทมเพลตจัดการการเตรียม การพุชไฟล์ การดำเนินการทดสอบ การแยกวิเคราะห์ผลลัพธ์ และการล้างข้อมูลได้
- เทมเพลตมีเมธอดที่เกี่ยวข้องกับการสร้างชุดทดสอบเพื่อให้คลาสย่อยลบล้าง
- เทมเพลตจะถือว่าแต่ละโมดูลไบนารีทดสอบมีเฟรมเวิร์กการทดสอบ 1 รายการ และระบบจะใช้ชื่อไฟล์ต้นทางไบนารีเป็นชื่อเฟรมเวิร์กการทดสอบโดยค่าเริ่มต้น
ตัวเลือกการกําหนดค่า
เทมเพลต BinaryTest รองรับตัวเลือกการกําหนดค่าต่อไปนี้
ชื่อตัวเลือก | ประเภทค่า | คำอธิบาย |
---|---|---|
binary-test-source | สตริง | เส้นทางแหล่งที่มาของการทดสอบแบบไบนารีซึ่งสัมพันธ์กับไดเรกทอรี Test Case ของ vts ในโฮสต์ ตัวอย่าง: DATA/nativetest/test |
binary-test-working-directory | สตริง | ไดเรกทอรีที่ทำงาน (เส้นทางฝั่งอุปกรณ์) ตัวอย่าง: /data/local/tmp/testing/ |
binary-test-envp | สตริง | ตัวแปรสภาพแวดล้อมสําหรับไบนารี ตัวอย่าง: PATH=/new:$PATH |
binary-test-args | สตริง | ทดสอบอาร์กิวเมนต์หรือ Flag ตัวอย่าง: --gtest_filter=test1 |
binary-test-ld-library-path | สตริง | ตัวแปรสภาพแวดล้อม LD_LIBRARY_PATH ตัวอย่าง: /data/local/tmp/lib |
binary-test-disable-framework | บูลีน | เรียกใช้ adb stop เพื่อปิดเฟรมเวิร์ก Android ก่อนการทดสอบ
ตัวอย่าง: true |
binary-test-stop-native-servers | บูลีน | หยุดเซิร์ฟเวอร์เนทีฟที่กําหนดค่าอย่างถูกต้องทั้งหมดระหว่างการทดสอบ ตัวอย่าง:
true |
binary-test-type | สตริง | ประเภทเทมเพลต เทมเพลตประเภทอื่นๆ จะขยายมาจากเทมเพลตนี้ แต่คุณไม่จำเป็นต้องระบุตัวเลือกนี้สำหรับเทมเพลตนี้เนื่องจากคุณได้ระบุ binary-test-source ไว้แล้ว |
สําหรับตัวเลือกที่มีประเภทค่าเป็น strings
คุณสามารถเพิ่มค่าหลายค่าได้ด้วยการระบุตัวเลือกซ้ำในการกําหนดค่า เช่น ตั้งค่า
binary-test-source
2 ครั้ง (ดังที่แสดงในตัวอย่าง
VtsDeviceTreeEarlyMountTest
)
แท็กทดสอบ
คุณสามารถเพิ่มแท็กทดสอบได้โดยใส่คำนำหน้าแท็กเป็นตัวเลือกที่มีค่า strings
ใช้ ::
เป็นตัวคั่น แท็กทดสอบจะมีประโยชน์อย่างยิ่งเมื่อรวมแหล่งที่มาของไบนารีที่มีชื่อเดียวกันแต่มีจำนวนบิตหรือไดเรกทอรีหลักต่างกัน เช่น หากต้องการหลีกเลี่ยงการพุชไฟล์หรือชื่อผลลัพธ์ที่ทับซ้อนกันสำหรับแหล่งที่มาที่มีชื่อเดียวกันแต่มาจากไดเรกทอรีแหล่งที่มาที่แตกต่างกัน คุณสามารถระบุแท็กที่แตกต่างกันสำหรับแหล่งที่มาเหล่านี้
ดังที่แสดงในตัวอย่าง VtsDeviceTreeEarlyMountTest
ที่มีแหล่งที่มา dt_early_mount_test
2 แหล่ง แท็กทดสอบคือส่วนหน้า _32bit::
และ _64bit::
ใน binary-test-source
แท็กที่ลงท้ายด้วย 32bit
หรือ 64bit
จะทําเครื่องหมายการทดสอบว่าพร้อมใช้งานสำหรับ ABI แบบ 1 บิตโดยอัตโนมัติ กล่าวคือ การทดสอบที่มีแท็ก _32bit
จะไม่ทํางานบน ABI แบบ 64 บิต การไม่ระบุแท็กจะเท่ากับการใช้แท็กที่มีสตริงว่าง
ระบบจะจัดกลุ่มตัวเลือกที่มีแท็กเดียวกันไว้แยกจากแท็กอื่นๆ ตัวอย่างเช่น binary-test-args
ที่มีแท็ก _32bit
จะมีผลกับ binary-test-source
ที่มีแท็กเดียวกันเท่านั้น และทํางานใน binary-test-working-directory
ที่มีแท็กเดียวกัน ตัวเลือก binary-test-working-directory
ไม่บังคับสําหรับการทดสอบแบบไบนารี ซึ่งช่วยให้คุณระบุไดเรกทอรีทํางานเดียวสําหรับแท็กได้ เมื่อไม่ได้ระบุตัวเลือก binary-test-working-directory
ระบบจะใช้ไดเรกทอรีเริ่มต้นสําหรับแท็กแต่ละรายการ
ระบบจะเพิ่มชื่อแท็กต่อท้ายชื่อเฟรมทดสอบในรายงานผลลัพธ์โดยตรง
เช่น เฟรมทดสอบ testcase1
ที่มีแท็ก _32bit
จะปรากฏเป็น testcase1_32bit
ในรายงานผลลัพธ์
ผสานรวมการทดสอบฝั่งเป้าหมายโดยไม่ต้องใช้เทมเพลต BinaryTest
ใน VTS รูปแบบการทดสอบเริ่มต้นคือการทดสอบ Python ฝั่งโฮสต์ที่ขยายมาจาก BaseTest ในโปรแกรมรันไทม์ VTS หากต้องการผสานรวมการทดสอบฝั่งเป้าหมาย คุณต้องพุชไฟล์ทดสอบไปยังอุปกรณ์ก่อน จากนั้นเรียกใช้การทดสอบโดยใช้คําสั่ง Shell แล้วแยกวิเคราะห์ผลลัพธ์โดยใช้สคริปต์ Python ฝั่งโฮสต์
พุชไบนารีทดสอบ
เราขอแนะนำให้พุชไฟล์โดยใช้VtsFilePusher
เครื่องมือเตรียมเป้าหมาย
ตัวอย่าง
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher"> <option name="push" value="DATA/test->/data/local/tmp/test"/> </target_preparer>
VtsFilePusher
จะทําสิ่งต่อไปนี้
- ตรวจสอบการเชื่อมต่ออุปกรณ์
- กำหนดเส้นทางสัมบูรณ์ของไฟล์ต้นทาง
- พุชไฟล์โดยใช้คําสั่ง
adb push
- ลบไฟล์หลังจากการทดสอบเสร็จสมบูรณ์
หรือจะพุชไฟล์ด้วยตนเองโดยใช้สคริปต์ทดสอบ Python ฝั่งโฮสต์ซึ่งทําตามขั้นตอนที่คล้ายกันก็ได้
เรียกใช้การทดสอบ
หลังจากพุชไฟล์ไปยังอุปกรณ์แล้ว ให้เรียกใช้การทดสอบโดยใช้คำสั่ง Shell ในสคริปต์ทดสอบ Python ฝั่งโฮสต์ ตัวอย่าง
device = self.android_devices[0] res = device.shell.Execute(["chmod a+x /data/local/tmp/test", "/data/local/tmp/test"]) asserts.AssertFalse(any(res[return_codes]))
เทมเพลต GtestBinaryTest
เทมเพลต GtestBinaryTest จะโฮสต์ไบนารีทดสอบ GTest ซึ่งแต่ละรายการมักจะมีเฟรมเวิร์กการทดสอบหลายรายการ เทมเพลตนี้จะขยายเทมเพลต BinaryTest โดยการลบล้างการตั้งค่า การสร้างเทสเคส และการแยกวิเคราะห์ผลลัพธ์ ดังนั้นการกําหนดค่า BinaryTest ทั้งหมดจึงรับค่ามา
GtestBinaryTest เพิ่มตัวเลือก gtest-batch-mode
ดังนี้
ชื่อตัวเลือก | ประเภทค่า | คำอธิบาย |
---|---|---|
binary-test-type | สตริง | ประเภทเทมเพลต ใช้ค่า gtest |
gtest-batch-mode | บูลีน | เรียกใช้ไบนารี Gtest ในโหมดแบตช์ ตัวอย่าง: true |
โดยทั่วไป การตั้งค่า gtest-batch-mode
เป็น true
จะเพิ่มประสิทธิภาพในขณะที่ลดความน่าเชื่อถือลงเล็กน้อย ในการทดสอบการปฏิบัติตามข้อกําหนดของ VTS โมดูลจํานวนมากใช้โหมดแบตช์เพื่อปรับปรุงประสิทธิภาพ อย่างไรก็ตาม หากไม่ได้ระบุโหมด ระบบจะใช้โหมดที่ไม่ใช่กลุ่มเป็นค่าเริ่มต้นเพื่อความน่าเชื่อถือ
โหมดที่ไม่ใช่การประมวลผลเป็นกลุ่ม
โหมดที่ไม่ใช่การประมวลผลเป็นกลุ่มจะเรียกใช้ไบนารี GTest แต่ละรายการสำหรับแต่ละเฟรมทดสอบ ตัวอย่างเช่น หากไบนารี GTest มีเทสเคส 10 รายการ (หลังจากกรองตามการกำหนดค่าฝั่งโฮสต์) ระบบจะเรียกใช้ไบนารี 10 ครั้งในเชลล์ของอุปกรณ์แต่ละครั้งโดยใช้ตัวกรองการทดสอบที่แตกต่างกัน สําหรับแต่ละกรณีทดสอบ ระบบจะสร้างเอาต์พุต XML ของผลการทดสอบ GTest ที่ไม่ซ้ำกันและแยกวิเคราะห์โดยเทมเพลต
ข้อดีของการใช้โหมดที่ไม่ใช่การประมวลผลเป็นกลุ่มมีดังนี้
- การแยกกรณีทดสอบ ข้อขัดข้องหรือการค้างในกรอบการทดสอบหนึ่งจะไม่ส่งผลต่อกรอบการทดสอบอื่นๆ
- ความละเอียด รับการวัดผลโปรไฟล์/ความครอบคลุม การติดตามระบบ รายงานข้อบกพร่อง logcat และอื่นๆ ของแต่ละเฟรมการทดสอบได้ง่ายขึ้น ระบบจะดึงข้อมูลผลลัพธ์การทดสอบและบันทึกทันทีที่เฟรมการทดสอบแต่ละรายการเสร็จสิ้น
ข้อเสียของการใช้โหมดที่ไม่ใช่การประมวลผลแบบเป็นกลุ่มมีดังนี้
- การโหลดซ้ำ ทุกครั้งที่มีการเรียกใช้ไบนารี GTest ระบบจะโหลดไลบรารีที่เกี่ยวข้องและทำการตั้งค่าคลาสเริ่มต้น
- ค่าใช้จ่ายเพิ่มเติมในการสื่อสาร หลังจากการทดสอบเสร็จสิ้น โฮสต์และอุปกรณ์เป้าหมายจะสื่อสารกันเพื่อแยกวิเคราะห์ผลลัพธ์และคำสั่งถัดไป (อาจเพิ่มประสิทธิภาพในอนาคตได้)
โหมดการประมวลผลแบบเป็นกลุ่ม
ในโหมดแบตช์ของ GTest ระบบจะเรียกใช้ไบนารีทดสอบเพียงครั้งเดียวด้วยค่าตัวกรองการทดสอบที่ยาวซึ่งมีกรณีทดสอบทั้งหมดที่กรองตามการกำหนดค่าฝั่งโฮสต์ (วิธีนี้จะช่วยหลีกเลี่ยงปัญหาการโหลดซ้ำในโหมดที่ไม่ใช่แบตช์) คุณสามารถแยกวิเคราะห์ผลการทดสอบสําหรับ GTest โดยใช้ output.xml หรือใช้เอาต์พุตของเทอร์มินัล
เมื่อใช้ output.xml (ค่าเริ่มต้น)
ระบบจะแยกวิเคราะห์ผลการทดสอบผ่านไฟล์ XML เอาต์พุตของ GTest เช่นเดียวกับในโหมดที่ไม่ใช่การทดสอบเป็นกลุ่ม อย่างไรก็ตาม เนื่องจากระบบจะสร้าง XML เอาต์พุตหลังจากการทดสอบทั้งหมดเสร็จสมบูรณ์แล้ว หากเฟรมเวิร์กทดสอบทำให้ไบนารีหรืออุปกรณ์ขัดข้อง ระบบจะไม่สร้างไฟล์ XML ผลลัพธ์
เมื่อใช้เอาต์พุตของเทอร์มินัล
ขณะที่ GTest ทำงานอยู่ ระบบจะพิมพ์บันทึกการทดสอบและความคืบหน้าไปยังเทอร์มินัลในรูปแบบที่เฟรมเวิร์กสามารถแยกวิเคราะห์สถานะการทดสอบ ผลลัพธ์ และบันทึกได้
ข้อดีของการใช้โหมดการประมวลผลแบบเป็นกลุ่มมีดังนี้
- การแยกกรณีทดสอบ ให้การแยกกรณีทดสอบในระดับเดียวกับโหมดที่ไม่ใช่แบทช์หากเฟรมเวิร์กเริ่มการทำงานของไบนารี/อุปกรณ์อีกครั้งหลังจากเกิดข้อขัดข้องด้วยตัวกรองการทดสอบที่ลดลง (ไม่รวมกรณีทดสอบที่เสร็จสมบูรณ์และข้อขัดข้อง)
- ความละเอียด ให้รายละเอียดของเคสทดสอบเหมือนกับโหมดที่ไม่ใช่การทดสอบเป็นกลุ่ม
ข้อเสียของการใช้โหมดกลุ่มมีดังนี้
- ค่าบำรุงรักษา หากรูปแบบการบันทึกของ GTest เปลี่ยนแปลง การทดสอบทั้งหมดจะใช้งานไม่ได้
- ความสับสน เทสเคสสามารถพิมพ์ข้อมูลคล้ายกับรูปแบบความคืบหน้าของ GTest ซึ่งอาจทำให้สับสนกับรูปแบบ
ด้วยเหตุนี้ เราจึงนำตัวเลือกในการใช้เอาต์พุตบรรทัดคำสั่งออกชั่วคราว เราจะกลับมาดูตัวเลือกนี้อีกครั้งในอนาคตเพื่อปรับปรุงความน่าเชื่อถือของฟังก์ชันนี้
เทมเพลต HostBinaryTest
เทมเพลต HostBinaryTest มีไฟล์ปฏิบัติการฝั่งโฮสต์ที่ไม่มีอยู่ในไดเรกทอรีอื่นๆ หรือในสคริปต์ Python การทดสอบเหล่านี้ ได้แก่
- ไฟล์ไบนารีทดสอบที่คอมไพล์แล้วซึ่งสามารถเรียกใช้ได้บนโฮสต์
- สคริปต์ที่เรียกใช้ได้ในเชลล์, Python หรือภาษาอื่นๆ
ตัวอย่างหนึ่งคือ VTS การทดสอบด้านโฮสต์ของนโยบาย SELinux ด้านความปลอดภัย
<configuration description="Config for VTS Security SELinux policy host-side test cases"> ... <test class="com.android.tradefed.testtype.VtsMultiDeviceTest"> <option name="test-module-name" value="VtsSecuritySelinuxPolicyHost"/> <option name="binary-test-source" value="out/host/linux-x86/bin/VtsSecuritySelinuxPolicyHostTest" /> <option name="binary-test-type" value="host_binary_test"/> </test> </configuration>
HostBinaryTest ไม่ได้ขยายเทมเพลต BinaryTest แต่ใช้การกําหนดค่าการทดสอบที่คล้ายกัน ในตัวอย่างข้างต้น ตัวเลือก binary-test-source
จะระบุเส้นทางแบบสัมพัทธ์ฝั่งโฮสต์ไปยังไฟล์ปฏิบัติการทดสอบ และ binary-test-type
คือ host_binary_test
ระบบจะใช้ชื่อไฟล์ไบนารีเป็นชื่อชุดทดสอบโดยค่าเริ่มต้น ซึ่งคล้ายกับเทมเพลต BinaryTest
ขยายเทมเพลตที่มีอยู่
คุณสามารถใช้เทมเพลตในการกําหนดค่าการทดสอบได้โดยตรงเพื่อรวมการทดสอบที่ไม่ใช่ Python หรือขยายเทมเพลตในคลาสย่อยเพื่อจัดการข้อกําหนดการทดสอบที่เฉพาะเจาะจง เทมเพลตในรีโป VTS จะมีนามสกุลต่อไปนี้
เราขอแนะนำให้นักพัฒนาแอปขยายเทมเพลตที่มีอยู่เพื่อข้อกำหนดการทดสอบที่เฉพาะเจาะจง สาเหตุที่พบบ่อยในการขยายเทมเพลต ได้แก่
- ขั้นตอนการตั้งค่าการทดสอบพิเศษ เช่น การเตรียมอุปกรณ์ด้วยคำสั่งพิเศษ
- การสร้างชุดทดสอบและชื่อทดสอบที่แตกต่างกัน
- แยกวิเคราะห์ผลลัพธ์โดยการอ่านเอาต์พุตของคำสั่งหรือใช้เงื่อนไขอื่นๆ
เทมเพลตมีเมธอดที่เชี่ยวชาญด้านฟังก์ชันการทำงานแต่ละอย่างเพื่อให้ขยายเทมเพลตที่มีอยู่ได้ง่ายขึ้น หากคุณมีการออกแบบที่ปรับปรุงแล้วสำหรับเทมเพลตที่มีอยู่ เราขอแนะนำให้คุณมีส่วนร่วมในฐานโค้ด VTS