VTS 대시보드 데이터베이스

확장성, 성능 및 유연성이 뛰어난 지속적 통합 대시보드를 지원하려면 데이터베이스 기능을 깊이 이해한 상태에서 신중하게 VTS 대시보드 백엔드를 설계해야 합니다. Google Cloud Datastore는 항목 그룹 내의 strong consistency는 물론, 트랜잭션 ACID 보장과 eventual consistency도 제공하는 NoSQL 데이터베이스입니다. 하지만, 그 구조는 SQL 데이터베이스와 매우 다르며 Cloud Bigtable과도 다릅니다. 테이블, 행 및 셀 대신에 종류, 항목 및 속성이 있습니다.

다음 섹션에서는 VTS 대시보드 웹 서비스의 효과적인 백엔드를 만들기 위한 데이터 구조와 쿼리 패턴을 간략히 설명합니다.

항목

다음 항목에는 VTS 테스트 실행으로 얻은 리소스와 요약 정보가 저장됩니다.

  • 테스트 항목. 특정 테스트의 테스트 실행에 관한 메타데이터가 저장됩니다. 테스트 항목의 핵심 항목은 테스트 이름입니다. 테스트 항목 속성에는 실패 횟수와 통과 횟수, 알림 작업으로 테스트를 업데이트할 때부터의 테스트 사례 중단 목록이 포함되어 있습니다.
  • 테스트 실행 항목. 특정 테스트의 실행을 통해 얻은 메타데이터가 포함되어 있습니다. 테스트 실행 항목에는 테스트 시작과 종료 타임스탬프, 테스트 빌드 ID, 통과 및 실패한 테스트 사례 수, 실행 유형(예: 사전 제출, 사후 제출 또는 로컬), 로그 링크 목록, 호스트 머신 이름, 커버리지 요약 수가 저장되어야 합니다.
  • 기기 정보 항목. 테스트 실행 중에 사용된 기기의 세부정보가 포함되어 있습니다. 여기에는 기기 빌드 ID, 제품 이름, 빌드 타겟, 분기, ABI 정보 등이 포함됩니다. 이 항목은 일대다 방식으로 다중 기기 테스트 실행을 지원하기 위해 테스트 실행 항목과는 별개로 저장됩니다.
  • 프로파일링 지점 실행 항목. 테스트 실행 내의 특정 프로파일링 지점과 관련하여 수집된 데이터가 요약되어 있습니다. 이 항목은 프로파일링 데이터의 축 라벨, 프로파일링 지점 이름, 값, 유형, 회귀 모드를 설명합니다.
  • 커버리지 항목. 한 파일에 관해 수집된 커버리지 데이터를 설명합니다. 이 항목에는 Git 프로젝트 정보, 파일 경로 및 소스 파일의 라인별 커버리지 개수 목록 등이 포함되어 있습니다.
  • 테스트 사례 실행 항목. 테스트 사례 이름 및 테스트 결과를 포함하여 테스트 실행으로 얻은 특정 테스트 사례의 결과를 설명합니다.
  • 사용자 즐겨찾기 항목. 각 사용자 구독은 App Engine 사용자 서비스에서 생성된 사용자 ID와 테스트에 관한 참조가 포함된 항목으로 표시할 수 있습니다. 이를 통해 효율적인 양방향 쿼리가 가능합니다. 즉, 테스트를 구독하는 모든 사용자와 사용자가 선호하는 모든 테스트를 대상으로 한 양방향 쿼리가 가능합니다.

항목 그룹화

각 테스트 모듈은 항목 그룹의 루트를 나타냅니다. 테스트 실행 항목은 이 그룹의 하위 요소인 동시에 각 테스트 및 테스트 실행 상위 항목과 관련된 기기 항목, 프로파일링 지점 항목 및 커버리지 항목의 상위 요소입니다.

그림 1. 테스트 항목 상하위 관계.

핵심 사항: 상하위 관계를 설계할 때 효과적이고 일관된 쿼리 메커니즘을 제공해야 하는 필요성과 데이터베이스에 의해 적용되는 제한이 서로 균형을 이루어야 합니다.

이점

일관성 요구사항은 트랜잭션이 커밋될 때까지 향후 작업에서 트랜잭션의 영향을 인식하지 못하도록 하고 과거 트랜잭션이 현재 작업에 표시되도록 합니다. Cloud Datastore에서 항목 그룹화는 그룹 내에 강력한 읽기 및 쓰기 일관성의 구조를 형성합니다. 이 경우 항목 그룹화는 테스트 모듈과 관련된 모든 테스트 실행과 데이터를 말합니다. 이를 통한 이점은 다음과 같습니다.

  • 알림 작업을 통해 테스트 모듈 상태를 읽고 그 모듈 상태로 업데이트하는 작업을 원자성 작업으로 처리할 수 있음
  • 테스트 모듈 내의 테스트 사례 결과의 일관된 보기 보장
  • 상위 트리 내에서의 쿼리 속도 향상

제한사항

초당 항목 한 개에 쓰는 속도보다 더 빠른 속도로 항목 그룹 한 개에 쓰는 것은 일부 쓰기가 거부될 수 있으므로 권장하지 않습니다. 알림 작업과 업로드가 초당 1회 쓰기보다 더 빠르지 않는 한 구조는 견고하며 strong consistency를 보장합니다.

일반적으로 테스트 실행이 VTS 프레임워크의 오버헤드를 포함하여 1분 이상 걸리기 때문에, 궁극적으로 쓰기 작업을 테스트 모듈별 초당 1회로 제한하는 것이 합리적입니다. 60개가 넘는 서로 다른 호스트에서 테스트가 동시에 일관되게 실행되는 경우 외에는 쓰기 병목 현상이 발생하지 않습니다. 각 모듈이 대개 1시간 이상 소요되는 테스트 계획의 일부라는 점을 고려하면 쓰기 병목 현상이 발생할 가능성은 거의 없습니다. 호스트가 테스트를 동시에 실행하여 동일한 호스트에 짧은 쓰기 버스트가 발생하면 쓰기 오류를 포착하여 다시 시도하는 방식 등으로 비정상 이벤트를 쉽게 처리할 수 있습니다.

확장 고려사항

테스트 실행에서 반드시 테스트가 상위 요소일 필요는 없습니다. 즉, 다른 키를 사용하고 테스트 이름과 테스트 시작 시간을 속성으로 설정할 수 있습니다. 그러나, 이 경우 strong consistency를 eventual consistency와 맞바꾸게 됩니다. 예를 들어, 알림 작업은 테스트 모듈 내의 최근 테스트 실행에 관한 상호 일관된 스냅샷을 인식하지 못할 수 있습니다. 즉, 테스트 실행 시퀀스가 전역 상태에 완전히 정확하게 표현되지 않을 수 있습니다. 이 점은 또한 단일 테스트 모듈 내의 테스트 실행을 표시하는 데 영향을 줄 수도 있습니다. 이때 표시되는 정보는 실행 시퀀스의 일관된 스냅샷이 아닐 수도 있습니다. 최종적으로 스냅샷은 일관되지만, 최신 데이터라는 보장은 없습니다.

테스트 사례

테스트 사례가 많은 대규모 테스트가 또 다른 잠재적 병목 현상입니다. 두 가지 작업 제약 조건은 최대 트랜잭션 크기가 항목 500개라는 점과 항목 그룹 내의 쓰기 처리량 최댓값이 초당 1개라는 점입니다.

한 가지 접근 방식은 테스트 실행을 상위로 포함하는 테스트 사례를 지정하는 것입니다. 이는 커버리지 데이터, 프로파일링 데이터 및 기기 정보를 저장하는 방식과 유사합니다.

그림 2. 테스트 사례가 테스트 실행의 하위 항목임(권장되지 않음)

이 접근 방법은 원자성과 일관성을 제공하지만, 테스트에 엄격한 제한을 부여합니다. 트랜잭션이 500개 항목으로 제한되면 테스트에는 498개 이하의 테스트 사례만 포함할 수 있습니다(커버리지 데이터 또는 프로파일링 데이터가 없다고 가정함). 테스트가 이 값을 초과하면 단일 트랜잭션에서 모든 테스트 사례 결과를 한 번에 작성하지 못할 수 있습니다. 테스트 사례를 별개의 트랜잭션으로 나누면 초당 1회 반복이라는 최대 항목 그룹 쓰기 처리량을 초과할 수 있습니다. 이 해결 방법은 성능 저하 없이는 매끄러운 확장이 가능하지 않으므로 권장하지 않습니다.

하지만, 테스트 사례 결과를 테스트 실행의 하위 요소로 저장하는 대신 테스트 사례를 별도로 저장하고 키를 테스트 실행에 제공할 수 있습니다. 테스트 실행에는 테스트 사례 항목의 식별자 목록이 포함되어 있습니다.

그림 3. 테스트 사례가 별도로 저장됨(권장)

언뜻 보기에는 이 방식이 보장된 stong consistency를 깨뜨리는 것처럼 보일 수 있습니다. 그러나, 클라이언트에 테스트 실행 항목과 테스트 사례 식별자 목록이 있다면 쿼리를 생성할 필요가 없습니다. 대신, 클라이언트는 식별자를 통해 테스트 사례를 직접 가져올 수 있고, 이는 항상 일관성을 보장합니다. 이 접근 방법은 항목 그룹 내에 과도한 쓰기 가능성의 조짐 없이 strong consistency를 확보하는 동시에, 테스트 실행이 가질 수 있는 테스트 사례 개수에 관한 제약 조건을 크게 완화합니다.

데이터 액세스 패턴

VTS 대시보드는 다음 데이터 액세스 패턴을 사용합니다.

  • 사용자 즐겨찾기. 특정 App Engine User 객체를 속성으로 갖는 사용자 즐겨찾기 항목에 일치 필터를 사용하여 쿼리할 수 있습니다.
  • 테스트 목록. 테스트 항목에 관한 간단한 쿼리입니다. 홈페이지를 렌더링할 때 대역폭을 줄이기 위해 통과 횟수와 실패 횟수에 프로젝션을 사용할 수 있습니다. 그러면 실패한 테스트 사례 ID 및 알림 작업에서 사용한 기타 메타데이터의 긴 목록을 생략할 수 있습니다.
  • 테스트 실행. 테스트 실행 항목를 쿼리하려면 키 정렬(타임스탬프)과 함께 빌드 ID, 통과 횟수 등과 같은 테스트 실행 속성에 적용할 수 있는 필터링이 필요합니다. 테스트 항목 키를 사용하여 상위 쿼리를 실행하면 읽기 일관성이 강력해집니다. 이때 테스트 실행 속성에 저장된 ID 목록을 사용하여 모든 테스트 사례의 결과를 가져올 수 있습니다. 또한, 데이터 저장소의 가져오기 작업 특성에 따라 강력하게 일관성 있는 결과가 보장됩니다.
  • 프로파일링 데이터 및 커버리지 데이터. 다른 테스트 실행 데이터(예: 다른 프로파일링/커버리지 데이터, 테스트 사례 데이터 등)를 가져오지 않아도 테스트와 연결된 프로파일링 또는 커버리지 데이터를 쿼리할 수 있습니다. 테스트 항목 키와 테스트 실행 항목 키를 사용하는 상위 쿼리는 테스트 실행 중에 기록된 모든 프로파일링 지점을 가져옵니다. 프로파일링 지점 이름이나 파일 이름을 필터링하는 방법으로도 단일 프로파일링 항목 또는 커버리지 항목을 가져올 수 있습니다. 상위 쿼리의 특성상 이 작업은 강력한 일관성을 갖습니다.

실제 작동하는 데이터 패턴의 UI 및 스크린샷에 관한 세부정보는 VTS 대시보드 UI를 참고하세요.