เมื่อเขียนโปรแกรมดำเนินการทดสอบ คุณควรคำนึงถึงความสามารถในการปรับขนาด ถามตัวเองว่า "หากโปรแกรมรันทดสอบต้องเรียกใช้ชุดทดสอบ 200,000 ชุด" โปรแกรมจะใช้เวลานานเท่าใด
การแยกข้อมูลเป็นกลุ่มเป็นหนึ่งในคำตอบที่มีให้ใช้งานใน Trade Federation โดยจะต้องแบ่งการทดสอบทั้งหมดที่รันเนอร์ต้องการออกเป็นหลายกลุ่มที่สามารถทำงานพร้อมกันได้
หน้านี้จะอธิบายวิธีทำให้รันเนอร์ของคุณชาร์ดสำหรับ Tradefed
อินเทอร์เฟซที่จะติดตั้งใช้งาน
อินเทอร์เฟซที่สำคัญที่สุดเดียวที่ TF จะจัดเตรียมให้ TF พิจารณาว่าสามารถชาร์ดได้คือ IShardableTest ซึ่งประกอบด้วย 2 วิธี ได้แก่ split(int numShard)
และ split()
หากการชาร์ดจะขึ้นอยู่กับจำนวนชาร์ดที่ขอ คุณควรใช้ split(int numShard)
หรือติดตั้งใช้งาน split()
เมื่อเรียกใช้คําสั่งทดสอบ TF ด้วยพารามิเตอร์การแยกกลุ่ม --shard-count
และ --shard-index
แล้ว TF จะวนผ่าน IRemoteTest
ทั้งหมดเพื่อค้นหารายการที่ใช้ IShardableTest
หากพบ ระบบจะเรียก split
เพื่อรับออบเจ็กต์ IRemoteTest
ใหม่เพื่อเรียกใช้ชุดย่อยของเฟรมเวิร์กการทดสอบสำหรับกลุ่มที่เฉพาะเจาะจง
ฉันควรทราบอะไรบ้างเกี่ยวกับการติดตั้งใช้งานแบบแยก
- รันเนอร์อาจแบ่งตามเงื่อนไขบางรายการเท่านั้น ในกรณีนี้ ให้แสดงผล
null
เมื่อคุณไม่ได้แบ่ง - พยายามแยกให้มากที่สุดเท่าที่จะทำได้ โดยแยก Runner ออกเป็นหน่วยการดําเนินการที่เหมาะกับ Runner นั้นๆ ขึ้นอยู่กับผู้ดำเนินการ ตัวอย่างเช่น 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;
}
...
}
ตัวอย่างนี้สร้างอินสแตนซ์ใหม่ของอินสแตนซ์เองและตั้งค่าพารามิเตอร์กลุ่มให้ อย่างไรก็ตาม ตรรกะการแยกอาจแตกต่างจากการทดสอบไปยังการทดสอบโดยสิ้นเชิง และตราบใดที่เป็นการระบุและได้ข้อมูลชุดย่อยที่ครบถ้วนสมบูรณ์ ก็ไม่เป็นปัญหา
ความเป็นอิสระ
ข้อมูลพร็อพเพอร์ตี้ต้องแยกกัน ข้อมูลพร็อพเพอร์ตี้ 2 รายการที่สร้างจากการติดตั้งใช้งาน split
ใน Runner ไม่ควรมีการพึ่งพาซึ่งกันและกันหรือแชร์ทรัพยากร
การแยกกลุ่มต้องเป็นแบบกำหนดได้ การดำเนินการนี้ยังเป็นสิ่งที่ต้องทำด้วยเช่นกัน เมื่อให้เงื่อนไขเดียวกัน เมธอด 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 ไม่ได้รวบรวมผลการทดสอบใดๆ สำหรับการเรียกใช้แบบชาร์ด คุณจึงต้องตรวจสอบว่าบริการการรายงานของคุณรองรับการเรียกใช้ดังกล่าว