프로그래밍/Android

[CI/CD] Firebase Test Labs UI Test 자동화하기

Lou Park 2022. 9. 30. 22:09

CI/CD Tool로 Bitrise (CLI)를 사용하고 있는데, Workflow에 UI Test 단계를 추가해보려고한다. gn_test Workflow를 살펴보면,

  1. git pull 로 프로젝트를 땡겨오고,
  2. 이전에 만든 test용 apk를 제거한다.
  3. UI Test용 빌드를 생성하고,
  4. Firebase Test Lab으로 기기에 테스트 한다.
gn_test:
    steps:
    - script@1:
        inputs:
        - content: "bash $ROOT/scripts/gitpull.sh"
    - script@1:
        inputs:
        - content: "bash $ROOT/scripts/delete_test_apk.sh"
    - android-build-for-ui-testing@0:
        inputs:
        - project_location: $PROJECT_LOCATION
        - variant: $VARIANT
        - module: $MODULE
        - cache_level: none
    - script@1:
        is_always_run: false
        inputs:
        - content: "bash $ROOT/scripts/testlab.sh"

다른 것들은 문제가 되지 않지만, Firebase Test Lab 설정이 약간 까다로울 수 있다.

 

# gcloud CLI 설치

gcloud cli 툴로 TestLab을 이용할 것이기 때문에 먼저 gcloud cli를 설치한다. 리눅스 64비트 컴퓨터 기준으로 설명할 건데 혹시 다른 환경이신 분들은 공식 사이트를 참조하시길!

 

1. gcloud-cli 파일을 다운로드 받는다.

curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-402.0.0-linux-x86_64.tar.gz

 

2. 압축을 해제한다.

tar -xf google-cloud-cli-402.0.0-linux-x86.tar.gz

 

3. 압축을 푼 폴더의 install.sh를 실행하여 gcloud를환경변수에 등록한다.

./google-cloud-sdk/install.sh

 

4. 업데이트를 한다.

gcloud components update

 

# gcloud 프로젝트 설정하기

1. 로그인

아래 명령어로 Firebase 권한이 있는 아이디로 로그인한다. 명령어를 치면, 브라우저를 통해서 로그인 할 수 있는 링크가 나올 것이다. 링크를 클릭한 후 만들어지는 토큰 값을 다시 cli에 붙여넣는다.

gcloud auth login

 

2. 프로젝트 설정하기

FIrebase 프로젝트 ID를 복사하여 <PROJECT_ID> 대신 붙여넣는다. 프로젝트 ID는 Firebase 프로젝트 콘솔 > 프로젝트 설정 >일반에서 확인할 수 있다.

gcloud config set project <PROJECT_ID>

이제 이 Firebase 프로젝트를 기준으로 TestLab 기능을 실행할 준비가 되었다!

 

# TestLab 사용법

1. 이용가능한 기기 확인하기

테스트 타겟으로이용가능한 기기는 아래 명령어를 통해서 볼 수 있다.

gcloud firebase test android models list

이용가능한 기기들

여러가지 기기가 보일 것인데, MODEL_IDOS_VERSION_IDS, FORM 정도만 참고하면 된다.

조금 뒤에 다시 다룰 것이지만 MODEL_IDOS_VERSION_IDS는 옵션으로 사용된다. 아래는 Nexus6 OS Verison 21 기기를 영어로 설정하고, 세로 모드로 테스트를 하겠다는 테스트 옵션이다.

--device model=Nexus6,version=21,locale=en,orientation=portrait

 

2. 테스트 유형 바로 알기

테스트에는 Robo, Instrumentation 두가지 타입이 있다.

 

Robo 테스트는 자동으로 막 누르면서 앱을 탐색하고 오류가 없는지 확인해주는 테스트이다. Instrumentation을 만들지 않았을때도 유용하게 UI Test를 수행할 수 있다.

 

Instrumentation 테스트는 Espresso등으로 개발자가 직접 UI 테스트 케이스 코드를 짠 것에대해 테스트를 수행한다. 구글 공식 사이트 한글 번역은 “계측 테스트”라고 한다.

 

# TestLab Test 수행하기

이제 CLI로 테스트를 수행할 수 있는데, 옵션이 꽤나 헷갈릴 수 있다. 그래서 정리해봤다.

옵션명 옵션 설명 옵션 값 예시
type 테스트 유형 robo, instrumentation
app app의 apk 파일 /your/apk/path/app-release.apk
test androidTest의 apk 파일. robo 테스트일때는 이 옵션이 필요없다. app 옵션만 있으면 된다. /your/apk/path/app-release-androidTest.apk
device 사용할 기기정보. 여러개가 가능하다. model=Nexus6,version=21,locale=ko,orientation=portrait
timeout 타임아웃 시간 (최소 값은 60초다) 60s, 2m
gcloud firebase test android run \
  --type instrumentation \
  --app app-debug-unaligned.apk \
  --test app-debug-test-unaligned.apk \
  --device model=Nexus6,version=21,locale=en,orientation=portrait  \
  --device model=Nexus7,version=19,locale=fr,orientation=landscape \
  --timeout 90s

테스트 후, 다음 스텝으로 출시 할지말지 결정해야한다.

그것은 테스트 결과에 따라다를 것이다.

 

그래서 TestLab 결과에 이상이 있으면 에러를 뱉고 종료하는 shellscript를 짰다. 아래는 testlab.sh의 코드 조각이다.

#!/bin/bash
TEST_CMD="gcloud firebase test android run \
    --type instrumentation \
    --app $BITRISE_APK_PATH \
    --test $BITRISE_TEST_APK_PATH \
    --device model=Pixel3,version=30,locale=ko,orientation=portrait \
    --timeout 60s"

if eval "$TEST_CMD"
then
    # 테스트 결과가 성공이라면 0
    echo "Instrumentation Test Success"
    exit 0
else
    #  실패했다면 1~20까지의 에러코드 존재. https://firebase.google.com/docs/test-lab/android/command-line?hl=ko
    echo "Instrumentation Test Failed"
    exit $?
fi

이렇게 되면 테스트 실패시 exit code 1~20을 뱉고 종료하고, 성공했다면 다음 스텝을 수행할 수 있는 상태가 된다.