เขียนโปรแกรมรันไทม์การทดสอบ IRemoteTest แบบแยกกลุ่ม

เมื่อเขียนโปรแกรมรันทดสอบ คุณควรคำนึงถึงความยืดหยุ่น ถามตัวเองว่า "หากโปรแกรมรันทดสอบต้องเรียกใช้ชุดทดสอบ 200,000 ชุด" โปรแกรมจะใช้เวลานานเท่าใด

การแยกกลุ่มเป็นคำตอบอย่างหนึ่งที่มีอยู่ใน Trade Federation โดยจะต้องแบ่งการทดสอบทั้งหมดที่รันเนอร์ต้องการออกเป็นหลายกลุ่มที่สามารถทำงานพร้อมกันได้

หน้านี้จะอธิบายวิธีทำให้รันเนอร์ของคุณแบ่งกลุ่มได้สำหรับ Tradefed

อินเทอร์เฟซที่จะติดตั้งใช้งาน

อินเทอร์เฟซที่สำคัญที่สุดอย่างหนึ่งในการใช้งานเพื่อให้ 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/android16-release/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 ไม่ได้รวมผลการทดสอบสําหรับการเรียกใช้ที่มีการแบ่งกลุ่ม คุณจึงต้องตรวจสอบว่าบริการการรายงานรองรับการเรียกใช้ดังกล่าว