들어가며

안녕하세요. 트렌비에서 QA 업무를 맡고 있는 리타입니다.

트렌비의 QA(Quality Assurance)는 트렌비 서비스의 품질을 보증하기 위해 기획 단계부터 최종 딜리버리까지 개발의 모든 부분에 참여하며 다양한 업무를 수행하고 있습니다.

그 중에서도 테스트가 차지하는 비중이 상당히 클 수 밖에 없는데요. 신규 서비스 런칭을 위해 테스트케이스를 설계하고 테스트 계획을 수립한 후 최종적으로 테스트를 수행하는 업무는 항상 많은 노력을 요구합니다.

개발이 끝나고 통합 테스트를 진행하면서 기존 기능에 영향이 없는지 확인하는 과정은 가장 많이 신경쓰이는 부분이기도 하고, 이 부분에서 혹여라도 문제가 생길 경우 서비스 장애로 이어지기 때문에 가장 높은 집중력을 필요로 하기도 합니다.

하지만 QA도 사람인지라 항상 모든 변경에 대한 영향도를 파악하기는 어려운 부분이 있습니다. 이런 약점을 보완하기 위해 트렌비에서는 Regression Test를 자동화하고, 필요할 때마다 실행되도록 하고 있습니다.

테스트 자동화를 위한 기술에는 대표적으로 Selenium, Appium 등이 있있는데요. 트렌비에서 이 기술들을 사용하여 주요 기능들을 검수하는 테스트 자동화를 구현하고 있습니다.

다양한 실수를 유발할 수 있는 반복적인 검증 과정에서의 실패를 줄이고 테스트 커버리지를 확보하기 위해서 자동화 기술은 필수적인 선택이었습니다.

그중에서 이번에는 가상환경에서의 테스트 자동화를 구현해 본 경험을 공유하고자 합니다.

구현 배경

자동화의 시작

트렌비에서 ‘테스트 자동화’를 시작하게 된 계기는 점검해야 하는 서비스는 많은데 비해 QA 리소스는 부족했기 때문입니다.

간단해 보이는 변경일지라도 프로덕션에 배포하면 예상치 못한 문제가 발생하는 경우가 종종 있기 때문에 작은 변경 사항이더라도 구매와 관련된 핵심 기능들(로그인부터 시작하여 회원가입, 주문, 상품목록, 장바구니 등)이 정상적으로 동작하는지는 항상 확인해야 합니다.

하지만 부족한 리소스로 기존 기능 검증과 신규 기능 검증을 모두 하려면 많은 시간이 소요될 수밖에 없었습니다.

그래서 반복적으로 확인하는 기능들은 SeleniumPython을 사용하여 Web 테스트 자동화를 구현했습니다.

그동안 로그인, 회원가입 등 수동으로 확인했던 케이스들을 자동화로 전환하면서 QA 리소스를 절감 할 수 있었습니다.

APP 테스트 자동화

트렌비 앱은 Hybrid 기반으로 만들어졌습니다. 따라서 Hybrid APP 특성상 Web과 App간의 차이가 많이 없기 때문에 Web 테스트 자동화로 Regression Test를 수행하고 있었습니다.

그러나 앱에서만 다르게 동작하는 부분들이 있었고 실제로 앱과 관련된 배포가 아니었음에도 앱이 실행이 안 되는 장애가 발생하기도 했습니다.

앱에서만 발생하는 장애를 체크하기 위해서 여러 가지 방법을 조사했고 그 중에 Appium을 사용하게 되었습니다.

Appium을 통해서 앱 테스트 때마다 반복적으로 수행하는 테스트 케이스를 자동화할 수 있었습니다.

보유하고 있는 단말의 한계

앱에 대한 테스트 커버리지를 확보하기 위해서는 제조사, 해상도, OS 버전에 따른 다양한 단말에서 확인이 필요합니다.

하지만 QA팀에서 보유하고 있는 단말은 한정적이고 저희가 보유하고 있지 않은 단말에서의 이슈사항 문의가 들어오면 확인이 어려웠습니다.

모든 단말을 갖출 수 없기 때문에 실제 단말과 동일한 가상환경에서 테스트할 수 있는 방법을 찾아보게 되었고 그렇게 알아본 것이 AWS Device Farm이었습니다.

Appium을 이용한 APP자동화

Appium이란?

Appium은 Native, Hybrid, Mobile Web 등 모든 Mobile 환경에서 테스트 자동화를 가능하게 해주는 오픈소스 도구입니다.

대부분의 Mobile App은 iOS, Android 두 가지 플랫폼 상에서 작성되고 있습니다. 같은 기능의 APP이지만 서로 다른 플랫폼을 기반으로 작성되어있기 때문에 테스트를 진행할 때 몇 배의 커버리지가 필요로 합니다.

이러한 환경에서 Appium은 하나의 테스트 코드로 서로 다른 플랫폼(Android, iOS, Windows, FirefoxOS)의 APP을 테스트할 수 있도록 하여 리소스 확보는 물론 테스트 커버리지를 확대할 수 있습니다.

Appium의 소프트웨어 구조가 여러 플랫폼을 제공해주는 Selenium WebDriver API를 사용하기 때문에 iOS 및 Android에서 상호작용이 가능합니다.

작동 방식에 대해여 간단히 설명드리자면 Appium은 Node.js로 작성된 HTTP 서버입니다. 테스트 스크립트의 API들은 WebDriver JSON 유선 프로토콜을 사용하여 Appium 서버와 통신하여 iOS 및 Android 세션을 구동할 수 있습니다. 아키텍처 및 더욱 구체적인 내용은 아래 링크 참고하시길 바랍니다.

안드로이드 테스팅의 효자손 Appium


[출처: edureka Blog]

Appium 실행 방법

STEP 1. Appium 서버 구성

Appium은 Client/Server 구조로 되어 있습니다.

Server: Appium을 실행하며 REST API를 제공해 Client로부터 요청을 받습니다. 그 명령어들을 모바일 기기에서 실행하고 다시 그 결과를 Client에게 전달해 주는 역할을 합니다.

Client: 테스트 코드를 작성해서 Server에 요청을 보냅니다. 실질적으로 Client는 요청을 하고 응답에 대한 처리만 하며 자동화나 에뮬레이팅은 Server에서 진행됩니다.

이렇게 구조를 분리함으로써 Client는 더 다양한 환경에서 테스트 코드를 작성할 수 있고 Server는 클라우드와 같은 여러 환경에서 돌려 볼 수 있습니다.


[출처: geeksfortestin Blog]

이 중 제가 구현해본 것은 Window기반의 Android 환경이었는데 이를 위해서는 JDK, Node, Android SDK, Appium 설치가 필요합니다. 해당 관련된 자료들이 많았음에도 환경을 구축하는 과정에서 어려움이 있었습니다.

예를 들어 Android Studio에서 필요한 SDK, Tool, API들을 누락없이 전부 다운받아야 하는데 여기서 하나라도 설치가 안되면 이후 Appium Server가 실행이 안됩니다. 여기서 나온 오류 로그를 일일히 검색해 가면서 원인을 찾는 데에도 많은 시간이 들었습니다.

Appium 설치는 오히려 간단합니다. Appium 홈페이지에 접속하여 파일만 다운받으면 됩니다.

위의 과정에서 JDK, Node, Android SDK 설치와 환경변수 설정만 문제없다면 아래와 같이 Appium 서버가 정상적으로 실행됩니다. 자세한 서버 구성법은 정말 도움이 많이 됐던 블로그 링크 공유드립니다.

Appium 서버 구성 (on Windows)

STEP 2. Appium Inspector를 통한 트렌비앱 실행

이어서 테스트 스크립트를 작성하기 위해서는 Appium Inspector가 필요합니다.

테스트 대상이 되는 객체에 대한 정보를 식별하는 것이 중요한데 앱 화면을 미러링하여 Element 값을 식별해 주는 Appium Inspector가 그 역할을 해줍니다.

Appium Inspector와의 연결은 json 형태로 이루어진 Desired Capabilities 정보에 의해 이루어집니다.

단말 버전, 설치된 앱 경로, udid 등 형식에 맞게 설정하고 실행하면 아래와 같이 앱 화면이 미러링 됩니다.

{
  "platformName": "Android",
  "platformVersion": "12.0",
  "deviceName": "Z Flip3",
  "app": "C:\\Users\\user\\Downloads\\app-1.3.77-prod.apk",
  "automationName": "Appium",
  "newCommandTimeout": 300,
  "udid": "R5CR8050S5K",
  "noReset": true,
  "appPackage": "com.trenbe.trenbehybrid",
  "appActivity": "com.trenbe.trenbehybrid.view.splash.SplashActivity"
}

STEP 3. Appium 자동화 실행 결과

이제 Appium Inspector를 사용하여 테스트 스크립트를 작성합니다.

Appium 작동 방식에서도 말씀드렸듯이 Selenium WebDriver API는 여러 플랫폼에서 사용이 가능하고, 기존에 구현해놨던 자동화 코드와 크게 다르지 않아서 스크립트를 작성하는 데에는 큰 공수가 들지 않았습니다.

Appium Server가 실행되고 있는 상태에서 테스트 스크립트를 실행하면 아래와 같이 동작합니다.

예시로 보여드릴 케이스는 트렌비앱을 실행한 후 로그인하는 동작입니다.


지금까지 로컬에서 Appium을 통한 앱 테스트 자동화를 실행하는 방법을 알아봤습니다.

다음으로 이어갈 내용은 가상환경인 AWS Device Farm에서 Appium을 실행하는 내용입니다.

AWS Device Farm 가상환경

AWS Device Farm 이란?

AWS Device Farm은 AWS 클라우드에서 실제 Android 및 iOS 디바이스를 테스트하고 상호 작용할 수 있는 앱 테스트 서비스입니다.

이 서비스의 장점은 아래와 같습니다.

첫째, 실제 단말이 없어도 실제 환경과 동일하게 시물레이션이 가능하다.
둘째, 다양한 디바이스 및 OS 버전과 테스트 프레임워크를 지원해준다.
셋째, 웹 브라우저에서 디바이스 밀기, 제스처 및 상호 작용을 통해 고객 문제를 재현하고 디버깅 할 수 있다.

무엇보다 가장 중요한 장점은 AWS Device Farm 환경 안에서 Appium을 연동하여 앱 테스트 자동화가 가능했다는 점입니다.

구현 배경에서도 말씀드렸듯이 모든 단말을 구비할 수 없는 어려운 환경에서 AWS Device Farm을 사용하는게 적합했습니다.

AWS Device Farm 활용법

AWS에서 말하는 디바이스팜을 활용하는 방법 첫번째는 실시간으로 앱을 로드, 실행 및 상호 작용할 수 있는 장치에 대한 원격 액세스 입니다.

사용 방법은 간단합니다. 원하는 디바이스를 선택한 다음 .apk 또는 .ipa 파일을 업로드 합니다. 업로드가 완료되면 아래 이미지와 같이 가상환경 디바이스에 앱설치가 되고 실제 단말과 동일하게 동작이 됩니다.

실제로 지난번 AWS Device Farm을 사용하여 안드로이드 업데이트 대응 테스트를 진행했습니다. 안드로이드 단말 OS 13버전이 필요했지만 이미 다른 테스트로 사용중이어서 AWS Device Farm을 활용하게 되었습니다.

아래와 같이 간편하게 새로 빌드된 앱을 업로드 하기만 하면 쉽게 테스트가 가능합니다.

두번째는 다양한 테스트 프레임워크를 사용하여 앱 테스트 자동화가 가능합니다.
지원되는 다양한 테스트 프레임워크 중 하나가 바로 Appium 입니다.

수백개의 실제 디바이스에서 자동화된 테스트를 동시에 실행하고 몇 분 만에 결과, 스크린샷, 동영상 및 성능 데이터를 얻을 수 있습니다.

자세한 내용은 다음으로 이어갈 AWS Device Farm에서의 Appium 구성 방법에서 설명드리겠습니다.

AWS Device Farm에서의 Appium 실행 방법

STEP 1. Appium 테스트 패키지 구성

AWS Device Farm에서 Appium을 실행시키기 위해서는 테스트 패키지 구성이 필요합니다.

먼저 로컬에서 Virtualenv 라는 가상환경 셋팅이 필요하고 이 가상환경 안에서 Python, Appium Client 등 필요한 요소들을 설치해줍니다.

그다음 AWS Device Farm에서 실행할 수 있는 압축된 테스트 파일을 생성해야 합니다. 자세한 가이드는 AWS 공식 페이지가 제일 설명이 잘되어 있으며 아래 링크 참고하시길 바랍니다.

Virtualenv 설치법, AWS Device Farm 공식 가이드

이번에는 Window, Mac 환경에서 둘 다 진행해 봤지만 역시나 구축하는데 어려움이 있었습니다.

그 이유는, Device Farm과 Appium을 연동하는 가이드 자체가 많이 없었을뿐더러 설치하는 과정에서 Python이나 Appium 버전 문제를 해결하는 데에도 시간을 많이 쏟았습니다.

특히 대부분의 가이드가 Mac 환경 기준으로 설명이 되어있다 보니 Window 환경 기준으로 명령어를 변환하는 과정도 번거로웠습니다.

구현을 완료하고 나서는 간단한 작업처럼 보였지만 작업 과정에서 여러 어려움들이 있었습니다.

하지만 결론적으론 테스트 패키지를 구성하는데 성공했습니다.

$ pip install virtualenv 
$ virtualenv workspace
$ cd workspace
$ source bin/activate #가상환경 활성화
$ pip install pytest
$ pip install Appium-Python-Client

$ mkdir tests
#tests 폴더 안에 테스트 스크립트 생성
#테스트 파일 이름은 test_로 시작해야함

$ py.test --collect-only tests/
#테스트파일 실행되는지 확인

$ pip freeze > requirements.txt
#요구사항 파일
$ zip -r test_bundle.zip tests/ requirements.txt
#최종 zip 파일로 패키징

STEP 2. AWS에 테스트 패키지 업로드

이제 위에서 만든 테스트 패키지 파일을 AWS에 업로드를 합니다.
업로드하는 과정은 어렵지 않으며 자세한 방식은 위에 공유한 AWS 공식 가이드에 나와있습니다.

패키지 업로드 후 테스트 자동화가 실행이 완료되면 아래와 같이 보고서가 생성됩니다. 실제 테스트 진행시 안드로이드 단말 2대로 실행했던 결과이고 Pass 비율을 한눈에 보여줍니다.

사실 여기서도 실행이 완료되기까지 어려움이 있었습니다.

가장 큰 원인은 AWS Device Farm 내에서 앱이 실행되는 환경이 느렸습니다.
그래서 화면이 넘어가는 부분에서 지연이 자주 발생하다 보니 실제 로컬에서 Appium을 실행하는 것과 다르게 에러가 많이 났습니다.

한 번에 테스트가 매끄럽게 실행되면 좋겠지만 Pass율 100%를 만들기 위해 추가 작업이 필요했습니다. 기존 구현해놨던 스크립트에서 보정 작업이 필요했고 지속적인 유지 보수가 필요한 작업이었습니다.

STEP 3. 가상환경에서의 실행 결과

이러한 노력 끝에 각 단말별로 실행결과를 보면 녹화영상, 로그 등 자동으로 수집된 것을 볼 수 있습니다.

CPU, Memory 등 퍼포먼스 그래프도 수집해주며 테스트 로그는 보기가 편리해서 만약 실패가 발생했을 때 어디에서 에러가 났는지 바로 찾을 수 있었습니다.

아래 영상은 실제 AWS Device Farm 가상환경에서 테스트가 실행되는 과정을 첨부했습니다. 해당 케이스는 트렌비에서 주문부터 주문 취소까지 동작하는 플로우입니다.

재현경로
트렌비앱 실행 > 로그인 > 상품 상세페이지 진입 > 주문하기 클릭 > 주문서 페이지 진입 > 결제수단 가상계좌 선택 > 필수정보 입력 > 주문 완료 > 주문내역 확인 > 주문 취소 진행

마치며, 트렌비에서의 활용법

AWS Device Farm 서비스 자체는 유료이지만 요금 방식이 여러 가지가 있고 실제 단말을 구매하는 것보다 오히려 저렴하게 관리가 가능합니다.

테스트 자동화뿐만 아니라 디버깅에도 유용하게 사용하실 수 있는데요. 실제 단말이 없어도 시뮬레이션을 통해 고객 문제를 디버깅할 수 있고 그 결과를 자동으로 로그 및 동영상을 제공해주기 때문에 이슈사항을 빠르게 파악할 수 있습니다.

최근 안드로이드 앱 업데이트 대응을 위해 활용해 보니 테스트 시간을 절감할 수도 있고 실제 보유하고 있지 않은 단말도 테스트가 가능해서 유용했습니다.

트렌비 서비스가 더욱 많아지고 규모도 커진다면 이러한 가상환경 툴을 사용함으로써 품질을 더 높일 수 있는 발판이 될 것 같습니다.

정말 마치며,

트렌비에 와서 처음으로 자동화 업무를 시작했을 때 정말 힘들었던 기억이 납니다. 개발자가 아니었기에 코드 짜는 기술도 부족했고 막히는 부분도 참 많았습니다.

그럼에도 이렇게까지 테스트 자동화를 구현할 수 있었던 건 많은 도움을 주신 동료 개발자분들 덕분이 아닐까 싶습니다.

이 글을 빌려 다시 한번 감사드립니다!

긴 글 읽어주셔서 감사합니다.

참고자료