Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

샤드 테스트

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

샤딩에는 테스트 실행기에서 샤딩을 지원하기 위한 전제조건이 있습니다.

기본 테스트 실행기의 대부분은 이미 샤딩을 지원하기 때문에 추가 작업이 필요 없습니다. 계측 테스트, 호스트 측 기반 테스트 및 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