샤드 테스트

테스트 자료가 크거나 실행 시간이 너무 길어지면 여러 기기에 걸쳐 테스트를 분할할 수 있는 가능성 즉, 샤딩 기능이 제공됩니다.

테스트 실행기에서 샤딩을 지원하려면 전제조건을 충족해야 합니다.

기본 테스트 실행기의 대부분은 이미 샤딩을 지원하기 때문에 추가 작업이 필요 없습니다. 계측 테스트, 호스트 측 기반 테스트 및 GTest에서는 이미 샤딩을 지원합니다.

Google은 Tradefed에서 로컬 및 분산, 이렇게 두 가지 유형의 샤딩을 지원합니다. 두 유형에 몇 가지 유사점이 있는 만큼 두 유형 간의 공통된 특성과 각 유형에 해당하는 특수한 특성을 설명하겠습니다.

공통된 특성

두 샤딩 형식 모두 테스트 실행기에서 동일한 특성을 가정합니다. 즉, 샤드는 독립적이고 확정적이어야 합니다. 두 가지 유형 모두 첫 번째 단계는 완벽하게 순서가 지정된 테스트 목록을 빌드한 다음 여러 그룹/샤드로 이를 분할하는 것입니다.

두 샤딩 형식의 주된 차이점은 테스트를 실행하는 방식에 있습니다. 자세한 내용은 아래 섹션을 참조하세요.

로컬 샤딩

로컬 샤딩이란 샤딩된 호출의 실행과 관련된 모든 기기가 동일한 물리적 호스트에 연결되어 있음을 의미합니다.

실행

로컬 샤딩은 실행이 필요한 테스트로 이루어진 풀을 생성하고 각 기기가 유휴 상태일 때 테스트를 폴링하도록 하여 동일한 호스트에 연결되어 있는 모든 기기를 활용합니다(이전 테스트와 유사). 이를 통해 기기 활용을 최적화할 수 있습니다. 로컬 샤딩은 동적 샤딩이라고도 합니다.

옵션

--shard-count XX

분산 샤딩

분산 샤딩이란 샤딩된 호출의 실행과 관련된 모든 기기가 어디에나 있을 수 있고 서로 다른 물리적 호스트에 연결될 수 있음을 의미합니다.

실행

분산 샤딩은 테스트 목록을 빌드하면 발생하며, 각 샤드의 콘텐츠는 현재 요청된 샤드만 계속해서 실행합니다. 따라서 모든 분산된 샤드는 먼저 동일한 목록을 빌드한 다음 상호 배타적인 하위 집합을 실행합니다. 이를 통해 모든 테스트가 실행됩니다.

이 형식의 주요 특성은 샤드가 서로를 완전히 인식하지 못하고 개별적으로 실패할 수 있다는 것입니다.

주요 단점은 샤드 길이가 반드시 균형을 이루지는 않는다는 것입니다. 각 샤드에서 각 테스트의 런타임을 미리 예측할 수 없기 때문입니다. 각 샤드에 거의 같은 수의 테스트 사례가 있도록 분산이 이루어집니다.

옵션

--shard-count XX --shard-index XX

토큰 샤딩

토큰 샤딩은 로컬 샤딩에만 사용할 수 있습니다. 이 플래그는 로컬 외 샤딩 사용 사례에 사용할 수 없습니다. 간혹 샤딩에 사용된 기기 중 하나가 다른 기기에는 없는 특별한 리소스(예: SIM 카드)를 보유할 때가 있습니다. 일부 테스트는 이 특별한 리소스가 제공되는 경우에만 작동할 수 있으며, 그렇지 않은 경우 실패합니다.

토큰 샤딩은 이러한 사용 사례에 관한 Google의 해결책입니다. 테스트 모듈은 AndroidTest.xml에 어떤 특별한 리소스가 필요한지 선언할 수 있으며, Tradefed는 이 리소스가 있는 기기로 테스트를 라우팅합니다.

XML 구성

<option name="config-descriptor:metadata" key="token" value="SIM_CARD" />

토큰의 value는 Tradefed의 TokenProperty와 일치하며, TokenProviderHelper의 핸들러에 연결됩니다.

이렇게 하면 제대로 테스트를 실행할 수 있는 기기에 테스트 모듈을 실행할 수 있습니다.

테스트를 실행할 수 있는 기기가 없는 경우에는 어떻게 해야 할까요?

테스트 모듈과 일치하는 리소스를 가진 기기가 없는 경우에는 테스트 모듈이 제대로 실행될 수 없으므로 실패하고 건너뛰게 됩니다.

예를 들어 테스트 모듈에서 실행할 SIM 카드를 요청한 경우에는 기기에 SIM 카드가 없으면 테스트 모듈이 실패합니다.

구현

이 기능 플래그를 기본 Tradefed 명령줄에 전달하세요.

--enable-token-sharding