เขียนตัวแบ่งการทดสอบ IRemoteTest Test Runner

เมื่อเขียนโปรแกรมวิ่งทดสอบ สิ่งสำคัญคือต้องคำนึงถึงความสามารถในการปรับขนาด ถามตัวเองว่า “ถ้านักวิ่งทดสอบของฉันต้องวิ่งทดสอบ 2 แสนเคส” จะใช้เวลานานแค่ไหน?

Sharding เป็นหนึ่งในคำตอบที่มีอยู่ในสหพันธ์การค้า จำเป็นต้องแยกการทดสอบทั้งหมดที่นักวิ่งต้องการออกเป็นหลายๆ ส่วนที่สามารถขนานกันได้

หน้านี้อธิบายวิธีทำให้ runner ของคุณชาร์ดได้สำหรับ Tradefed

อินเทอร์เฟซในการใช้งาน

อินเทอร์เฟซเดียวที่สำคัญที่สุดในการปรับใช้เพื่อพิจารณาว่าชาร์ดได้โดย TF คือ IShardableTest ซึ่งมีสองวิธี: split(int numShard) และ split()

หากการแบ่งส่วนข้อมูลของคุณจะขึ้นอยู่กับจำนวนของชาร์ดที่ร้องขอ คุณควรใช้ split(int numShard) มิฉะนั้นให้ใช้ split()

เมื่อคำสั่งทดสอบ TF ถูกดำเนินการด้วยพารามิเตอร์ --shard-count และ --shard-index TF จะวนซ้ำผ่าน IRemoteTest ทั้งหมดเพื่อค้นหาสิ่งที่ใช้ IShardableTest หากพบ ระบบจะเรียก split เพื่อรับอ็อบเจ็กต์ IRemoteTest ใหม่เพื่อเรียกใช้ชุดย่อยของกรณีทดสอบสำหรับชาร์ดเฉพาะ

ฉันควรรู้อะไรบ้างเกี่ยวกับการนำไปใช้แบบแยกส่วน

  • นักวิ่งสามารถชาร์ดได้ในบางเงื่อนไขเท่านั้น ในกรณีนั้นคืน null เมื่อคุณไม่ได้ชาร์ด
  • พยายามแยกแยะให้มากที่สุด: แบ่งนักวิ่งของคุณออกเป็นหน่วยของการดำเนินการที่เหมาะสม มันขึ้นอยู่กับนักวิ่งของคุณจริงๆ ตัวอย่างเช่น: HostTest ถูกชาร์ดที่ระดับคลาส คลาสการทดสอบแต่ละคลาสจะถูกจัดไว้ในชาร์ดแยกต่างหาก
  • ถ้ามันสมเหตุสมผล ให้เพิ่มตัวเลือกบางอย่างเพื่อควบคุมการแบ่งส่วนข้อมูลเล็กน้อย ตัวอย่างเช่น: AndroidJUnitTest มี ajur-max-shard เพื่อระบุจำนวนสูงสุดของชาร์ดที่สามารถแยกออกได้ โดยไม่คำนึงถึงจำนวนที่ร้องขอ

ตัวอย่างการใช้งานโดยละเอียด

นี่คือตัวอย่างข้อมูลโค้ดที่ใช้ IShardableTest คุณอ้างอิงได้ รหัสเต็มสามารถดูได้ที่ (https://android.googlesource.com/platform/tools/tradefederation/+/refs/heads/master/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;
    }
    ...
}

ตัวอย่างนี้สร้างอินสแตนซ์ใหม่ของตัวเองและตั้งค่าพารามิเตอร์ชาร์ด อย่างไรก็ตาม ตรรกะการแยกอาจแตกต่างไปจากการทดสอบแต่ละครั้ง และตราบใดที่มันเป็นตัวกำหนดและให้ผลส่วนย่อยที่ละเอียดถี่ถ้วนก็ไม่เป็นไร

อิสรภาพ

เศษชิ้นส่วนต้องเป็นอิสระ! ส่วนแบ่งข้อมูลสองส่วนที่สร้างขึ้นโดยการใช้ 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 ไม่ได้รวบรวมผลการทดสอบใดๆ สำหรับการเรียกใช้ชาร์ด คุณต้องแน่ใจว่าบริการการรายงานของคุณรองรับ