เมื่อเขียนโปรแกรมดำเนินการทดสอบ คุณควรคำนึงถึงความสามารถในการปรับขนาด ถาม "ถ้าผู้ทดสอบของฉันต้อง ทำกรอบการทดสอบ 200,000 รายการ" ขั้นตอนนี้จะใช้เวลานานเท่าใด
ชาร์ดดิ้งเป็นหนึ่งในคำตอบที่มีในสหพันธ์การค้า ต้องการ แบ่งการทดสอบทั้งหมดที่ผู้วิ่งต้องการออกเป็นหลายๆ ส่วน โหลดพร้อมกัน
หน้านี้จะอธิบายวิธีทำให้รันเนอร์ของคุณชาร์ดสำหรับ Tradefed
อินเทอร์เฟซในการใช้งาน
อินเทอร์เฟซที่สำคัญที่สุดเดียวที่
สามารถนำไปใช้จะถือว่าชาร์ตได้โดย
TF คือ
IShardableTest
ซึ่งมี 2 วิธี ได้แก่ split(int numShard)
และ split()
หากชาร์ดขึ้นอยู่กับจำนวนชาร์ดที่ขอ คุณ
ควรใช้ split(int numShard)
หรือไม่เช่นนั้น ให้ใช้ split()
เมื่อเรียกใช้คำสั่งทดสอบ TF กับพารามิเตอร์ชาร์ดดิ้ง --shard-count
และ
--shard-index
จะทดสอบ IRemoteTest
ทั้งหมดเพื่อหาเมตริก
กำลังติดตั้งใช้งาน IShardableTest
หากพบแล้ว ระบบจะโทรหา split
ไปยัง
รับออบเจ็กต์ IRemoteTest
ใหม่เพื่อเรียกใช้กรอบการทดสอบสำหรับกรณีเฉพาะ
ชาร์ด
ฉันควรทราบอะไรบ้างเกี่ยวกับการใช้งานการแยก
- นักวิ่งของคุณอาจชาร์ดเมื่อเป็นไปตามเงื่อนไขบางอย่างเท่านั้น ในกรณีนี้ ให้แสดงผล
null
ตอนที่คุณยังไม่ได้ชาร์ด - ให้แบ่งนักวิ่งออกเป็นหน่วยต่างๆ ตามความเหมาะสม โดยแบ่งการวิ่งออกเป็น 1 หน่วย ที่เหมาะสมจริงๆ ขึ้นอยู่กับการวิ่งของคุณ สำหรับ ตัวอย่าง: HostTest จะมีการชาร์ดที่ระดับชั้นเรียน คลาสการทดสอบแต่ละชั้นจะอยู่ในชาร์ดแยกกัน
- ลองเพิ่มตัวเลือกบางอย่างเพื่อควบคุมการชาร์ดเล็กน้อยหากมีความเหมาะสม
ดังตัวอย่างต่อไปนี้
AndroidJUnitTest
มี
ajur-max-shard
เพื่อระบุจำนวนชาร์ดสูงสุดที่มีได้ โดยไม่คำนึงถึงจำนวนที่ขอ
ตัวอย่างการใช้งานโดยละเอียด
ตัวอย่างข้อมูลโค้ดที่ติดตั้งใช้งาน IShardableTest
มีดังนี้
ข้อมูลอ้างอิง โค้ดทั้งหมดสามารถดูได้ที่
(https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/main/test_framework/com/android/tradefed/testtype/InstalledInstrumentationsTest.java)
/**
* Runs all instrumentation found on current device.
*/
@OptionClass(alias = "installed-instrumentation")
public class InstalledInstrumentationsTest
implements IDeviceTest, IResumableTest, IShardableTest {
...
/** {@inheritDoc} */
@Override
public Collection<IRemoteTest> split(int shardCountHint) {
if (shardCountHint > 1) {
Collection<IRemoteTest> shards = new ArrayList<>(shardCountHint);
for (int index = 0; index < shardCountHint; index++) {
shards.add(getTestShard(shardCountHint, index));
}
return shards;
}
// Nothing to shard
return null;
}
private IRemoteTest getTestShard(int shardCount, int shardIndex) {
InstalledInstrumentationsTest shard = new InstalledInstrumentationsTest();
try {
OptionCopier.copyOptions(this, shard);
} catch (ConfigurationException e) {
CLog.e("failed to copy instrumentation options: %s", e.getMessage());
}
shard.mShardIndex = shardIndex;
shard.mTotalShards = shardCount;
return shard;
}
...
}
ตัวอย่างนี้เพียงแค่สร้างอินสแตนซ์ใหม่ของตัวเองและตั้งชาร์ด พารามิเตอร์ลงในพารามิเตอร์ อย่างไรก็ตาม ตรรกะการแยกอาจแตกต่างไปจาก test to test; และตราบใดที่สิ่งนั้นกำหนดได้ และก่อให้เกิดผลตอบแทนร่วมกัน เป็นชุดย่อยทั้งหมด ก็ไม่เป็นไร
ความเป็นอิสระ
ชาร์ดต้องแยกออกจากกัน ชาร์ด 2 รายการที่สร้างขึ้นโดยการใช้งาน
split
ในการวิ่งของคุณไม่ควรมีการพึ่งพากันหรือแชร์กัน
ที่ไม่ซับซ้อน
การแยกชาร์ดจำเป็นต้องมีการกำหนด ซึ่งเป็นการดำเนินการที่จำเป็นเช่นกัน เนื่องจาก
เงื่อนไขเดียวกัน วิธี split
ควรแสดงรายการของ
ในลำดับเดียวกัน
หมายเหตุ: เนื่องจากชาร์ดแต่ละรายการสามารถทำงานในอินสแตนซ์ TF ที่แตกต่างกัน จึงจำเป็นที่จะต้อง
เพื่อให้มั่นใจว่าตรรกะ split
จะให้ผลลัพธ์สับเซ็ตย่อยที่เกี่ยวข้องกัน และ
ทั้งหมดรวมกันในลักษณะที่กำหนด
ชาร์ดการทดสอบในเครื่อง
ในการชาร์ดการทดสอบใน TF ในเครื่อง ก็เพียงแค่เพิ่มตัวเลือก --shard-count
ไปยัง
บรรทัดคำสั่ง
tf >run host --class com.android.tradefed.UnitTests --shard-count 3
จากนั้น TF จะสร้างคำสั่งสำหรับชาร์ดแต่ละรายการโดยอัตโนมัติและเรียกใช้คำสั่งดังกล่าว
tf >l i
Command Id Exec Time Device State
3 0m:03 [null-device-2] running stub on build 0 (shard 1 of 3)
3 0m:03 [null-device-1] running stub on build 0 (shard 0 of 3)
3 0m:03 [null-device-3] running stub on build 0 (shard 2 of 3)
การรวมผลการทดสอบ
เนื่องจาก TF ไม่ได้รวบรวมผลการทดสอบใดๆ สำหรับการเรียกใช้ที่ชาร์ด ดังนั้น บริการการรายงานของคุณจำเป็นต้องรองรับ