안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

초록 열기/닫기 버튼

모바일 앱의 수가 기하급수적으로 늘어남에 따라 앱 개발과정에서 이루어지는 테스트의 자동화가 중요해지고 있다. 앱을 출시하기까지 다양한 유형의 테스트를 통해 반복적인 검증이 이루어지는데, 다양한 유형의 테스트 중 GUI 테스트를 중심으로 본 연구는 진행되었다. 안드로이드의 GUI 테스트 자동화 툴을 개발하기 위해서 안드로이드 앱 테스트의 UI Control 16가지와 Material Design Guideline에 대해서 기초 자료를 수집하였다. 그 후 기존 GUI 테스트 자동화 툴에 대해서 스크린 캡처 테스트 기반 2가지 툴과 소스코드 분석 테스트 기반 4가지 툴 분석을 하였다. 분석을 통해 기존의 GUI 테스트 자동화 툴들은 시각적 설계, 인터페이스 사용 용이성, 컴포넌트 배치에 대해서는 고려하지 않고 있다는 점을 파악하였다. 이러한 기존 툴의 미비점을 보완하고자 새로운 GUI 테스트 자동화 툴 개발 방법으로 컴포넌트 선정이나 관리 분석 그리고 컴포넌트별 소스코드 예시로 탐색 메뉴나 버튼, 아이템 그룹화나 리스트에 관한 방법을 제시하였다. 본 연구는 GUI 테스트의 새로운 개발 방향을 제시함으로써 개발사의 안정적인 앱 배포에 기여할 수 있다는 점에서 의의가 있다.

As the number of mobile apps increases exponentially, automation of tests performed in the app development process is becoming more important. Until the app is released, iterative verification is performed through various types of tests, and this study was conducted focusing on the GUI test among various types of tests. This study is meaningful in that it can contribute to the stable app distribution of the developer by suggesting the development direction of the GUI test. To develop Android's GUI test tool, I collected basic data before presenting the development method by researching Android's UI controls and Material design guideline. After that, for the existing GUI test automation tool, two tools based on screen capture test and four tools based on source code analysis test were studied. Through this, it was found that existing GUI test tools don’t consider visual design, usability, and component arrangement. In order to supplement the shortcomings of existing tools, a new GUI test automation tool development method was presented based on the basic data previously studied.


키워드열기/닫기 버튼

,

,

,

,

Android, App, GUI Design, Test Automation Tool, Material Design Guideline

피인용 횟수

  • KCI 0회

  • 112 회 열람
  • KCI 원문 내려받기
  • 논문 인용하기
  • 서지정보 내보내기

    • txt
    • RefWorks
    • Endnote
    • XML

  • 현재 페이지 인쇄

인용현황

안녕하세요. 드라마앤컴퍼니의 곽수민입니다.

지난 포스팅에 이어서 모바일에서 UI 테스트 자동화를 실행하기 위한 Setting 방법과 실제 디바이스에 설치되어 있는 제품과의 연결을 시도해보려고 합니다.

개발환경 Setting

기본적으로 자동화 시스템을 구축하는 것도 실제 개발하는 것과 환경이 크게 차이가 없습니다. 제가 사용하고 있는 MAC OS 기준으로 환경정보를 구성하는 방법을 소개하겠습니다.

OS :
Mac 10.14 (최신버전)
iOS
– MAC OS 최신버전
– node.js (10.6) 최신버전
– Xcode 10.1 이상
– Apple Developer Tools (iOS simulator SDK< command line tools)
* iOS Simulator 사용에 대한 인증 필요
– Apache Maven 설치 및 환경변수 Setting
– Appium Server (CUI/GUI)
* Appium에서 제공하는 ‘WebdriverAgent’ Remote Application
Android
– node.js (10.6) 최신버전
– Android SDK 및 환경변수 설정
– Android tool (API Level)
– JDK 설치 및 환경변수 Setting (JAVA, JAVAC)
– Apache Maven 설치 및 환경변수 Setting
– ADB (Android Debug Bridge)
– Appium Server (CUI/GUI)

* 필수 : Apple의 Developer 계정(개인 계정도 관계 없음)을 생성해두어야 합니다. Xcode Build 옵션 중 Test 모드에서 WebdriverAgent 을 실제 기기에 빌드할 때 올바른 서명을 포함해야 하기 때문입니다.

위 도구들의 셋팅 방법은 구글링이나 포털 검색을 통해서 차근차근 진행해보시기 바랍니다.

Appium (자동화 도구)

세상에는 여러가지 자동화 도구들이 있습니다.

그 중에서도 저희가 Appium을 이용하여 자동화를 구축한 이유는 다음과 같습니다.

  1. iOS / Android 모두 지원
  2. 다양한 Scripting 언어를 지원 (JAVA, Python, Ruby, C# 등…)
  3. Multi-Testing

Appium 서버는 개발자가 테스트 프레임워크에서 제공하는 API(WebDriver JSON Wire Protocol)를 사용한 다양한 언어 베이스의 스크립트를 HTTP Commands로 받아주고 스크립트 상의 명령어들을 디바이스에 전송하여 실행하고, 그 결과를 받아와서 Console에 기록해줍니다.

우리가 원하는 모바일의 대표적인 OS를 모두 지원하였고, 다양한 스크립트 언어로 본인이 원하는 방식의 스크립트를 짤 수 있었던게 가장 큰 핵심이었습니다. 또한, 안드로이드의 경우 여러가지 앱을 ADB(Android Debug Bridge)로 병렬 연결하여 한번에 여러 디바이스의 테스트도 가능합니다. (안드로이드는 보통 환경적인 이슈도 많다보니, QA검수 때 iOS보다 환경 선택의 커버리지가 넓은 편이기 때문에 여러 디바이스를 동시에 테스트 할 수 있는 부분이 매력적이었습니다.)

하지만 단점으로는 오픈소스 라이센스의 특성 상 여러가지 문제 (1. 진입 장벽이 높다. 2. Customer Service의 장벽 3. 구글링을 통한 내용들이 잘못된 정보일수도 있다.) 들이 존재하기도 합니다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

          출처 : appium.io

국내에는 UI 테스트 자동화 관련 서적은 있지만 초보자가 책을 다뤄보기에는 큰 진입장벽이 있고, 더불어 프로그래밍 지식이 없다면 정보가 매우 제한적일 수 있습니다. 하지만 이 포스팅으로 많은 분들이 더 나은 환경을 구축해보셨으면 좋겠습니다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

출처 : appium.io

Appium GUI에서는 모바일 화면의 모든 Element에 대해서 개발에 필요한 기본 초석이 되는 리소스들을 사용자에게 제공해줍니다. (아래는 간략한 방법입니다.)

우선 디바이스와 Appium을 연결해주어야 합니다. 위에서 설명드린 것처럼 iOS는 WebDriverAgent라는 Remote앱을 미리 Xcode에서 Test모드로 빌드한 상태여야 합니다. (이 부분은 내용이 매우 복잡한 관계로 추후에 다루겠습니다.) Android OS는 ‘USB 디버깅’ 모드가 활성화 되고 ADB를 통하여 PC와 연결된 후에 아래 내용을 진행할 수 있습니다.
(*참고로 USB 디버깅 모드를 활성화 시키려면 휴대폰의 설정> 휴대전화 정보> 소프트웨어 정보> ‘빌드번호’ 내역을 여러번 터치하면 개발자 모드를 활성화 시킬 수 있고, 다시 휴대폰의 설정>개발자 옵션을 통하여 ‘USB 디버깅’ 모드를 활성화 시킬 수 있습니다.)

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

Appium의 처음 실행화면입니다. Host와 Port를 직접 구성하여 쓸 수 있는데, 동일한 Host를 구성하여 Appium을 열어주었다면 실행이 불가능해질 수 있으므로 잘 체크하도록 합시다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

Appium이 정상적으로 실행된 모습입니다. 상단 ‘돋보기’ 모양의 버튼을 눌러 Starter inspector Session 설정창을 띄워줍니다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

Inspector Session에서 Custom Server탭으로 구성하여 서버를 초기에 생성한 Host와 Port란을 채워줍니다.

디바이스와의 연결을 위하여 이미지를 참고해서 platformName, PlatforVersion, BundleID(실행해야 할 어플리케이션), automationName, udid, deviceName등을 위의 예시처럼 기입해줍시다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

연결이 정상적으로 완료되었다면 다음과 같은 화면이 나타나고, 우리가 해야할 자동화 스크립트 생산에 필요한 정보들을 습득할 수 있습니다. 보통 iOS 기준으로는 accessibility id, name주로 쓰게 되는데, 때로는 xpath값을 쓰기도 합니다. (xpath의 치명적인 단점으로 왠만하면 모든 ‘Element’들을 쉽게 다룰 수 있지만, 검색속도가 느려 전체적인 자동화 속도에 크게 영향을 미칩니다.) 어디에, 어떻게 해당 Element를 적절하게 활용해야 하는지는 추후 자동화 스크립트를 본격적으로 개발하면서 설명드리겠습니다.

자동화 스크립트를 개발하기전에!

자동화 스크립트를 개발하기 위해서는 우선 Eclipse에서 Maven Project 를 생성하고 pom.xml 파일에 자동화 개발 관련 Appium과의 Dependency를 설정해주어야 합니다. (해당 글에서는 Eclipse 도구를 이용하여 진행하겠습니다.)

먼저 설치한 Eclipse를 실행합니다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

해당 화면에서 [File] > [New] > [Maven Project] 메뉴를 선택해 줍니다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

New Maven Project창에서 Next를 누르다가 해당 화면이 나오면 Group ID, artifact Id를 입력하고 [Finish] 버튼을 눌러줍시다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

메이븐 프로젝트가 정상적으로 생성되었으면, Pakage Explorer영역에서 pom.xml 파일을 접근한 뒤, Selenium, TestNG, junit, Appium Java Client 과의 Dependency 를 이미지와 같이 설정해줍니다. 이렇게 하면 자동화를 위한 기본 Setting은 모두 완료되었습니다.

자동화 스크립트

자동화는 반복되는 작업들을 ‘자동화’ 함으로써 리소스 확보는 물론 제품의 갯수가 늘고 앱의 기능이 추가/변경되어 전체적인 볼륨이 커지는 상황에서도 빛을 발할 수 있습니다. 또한, 이전 포스팅에서도 언급했듯이 컴퓨터는 짜여진 코드 구성으로 반복적인 일을 하게 됨으로써 일관성 있는 테스트 결과를 받아볼 수 있는데 큰 장점이 있습니다.

저희는 Eclipse 또는 Visual Studio Code 도구를 이용하여 Selenium Library에 기반한 자동화 관련 소스를 생산해내고 있습니다. 실제 테스트는 코딩 도구의 MarketPlace에서 활용할 수 있는 Extensions 중 Java Test Runner라는 Extension을 활용하여 테스트 기기나 가상 머신을 제어할 수 있도록 구성하였습니다.

우선, 생성된 프로젝트 내에 있는 src/test/java 경로 하위에 클래스를 생성해 줍니다.

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

이렇게 생성된 클래스에서 실제 개발을 진행하게 되는데, 해당 바디는 크게 선처리, 후처리, 테스트 동작 메소드를 구성하게 됩니다. (해당 포스팅에서는 ‘선처리’ 부분까지만 다루겠습니다.)

안드로이드 앱 테스트 자동화 - andeuloideu aeb teseuteu jadonghwa

선처리는 기본 개발환경을 세팅하고, appium과의 연결을 처리해주는 부분으로 이해할 수 있습니다. 기본적으로 디바이스 이름/버전 , 플랫폼 이름/버전, Product의 Bundle ID, 기기 고유번호, RemoteUrl(appium local host, port)등이 포함됩니다.

참고로 각 모바일 환경마다 선처리(환경정보 세팅) 방법에 대한 코드 예제는 아래와 같습니다.

@BeforeSuite //iOS Device
public void Setting() throws Exception
{
        DesiredCapabilities capabilities = new DesiredCapabilities();
	      
         capabilities.setCapability("automationName", "{XCUITest}");
         capabilities.setCapability("platformName", "{iOS}"); // 환경
         capabilities.setCapability("deviceName", "{디바이스 이름}"); // 디바이스 이름
         capabilities.setCapability("platformVersion", "{12.0.1}"); // OS 버전
         capabilities.setCapability("bundleId", "{앱 패키지 네임}"); //앱 패키지 네임
         capabilities.setCapability("udid", "{Device UDID}"); // 디바이스 고유 UDID (iOS)
         capabilities.setCapability("noReset", true); // 테스트전에 리셋할건지 여부(true/false)

         URL remoteUrl = new URL("http://0.0.0.0:4723/wd/hub"); //WebDriver Hub ip/port (앱피움에서 확인)
         wd = new IOSDriver(remoteUrl, capabilities);
}

-iOS 선처리 예제-

@BeforeSuite //Android Device
public void Setting() throws Exception
{

        DesiredCapabilities capabilities = new DesiredCapabilities();
    
        capabilities.setCapability("appium-version", "{1.12.1}"); //UI Automator  사용하기 위함
        capabilities.setCapability("automationName", "{uiautomator2}"); //Android 8.0 이상 필수
        capabilities.setCapability("platformName", "{Android}"); 
        capabilities.setCapability("platformVersion", "{9}");
        capabilities.setCapability("deviceName", "{디바이스 이름}");
        capabilities.setCapability("appPackage", "{앱 패키지 name}");
        capabilities.setCapability("appActivity", "{스플래시 Activity name}");
        capabilities.setCapability("noReset", true);
        capabilities.setCapability("unicodeKeyboard", true); //appium 전용 keyboard 이용하기 위함
        
        URL remoteUrl = new URL("http://0.0.0.0:7273/wd/hub"); //WebDriver Hub ip/port (앱피움에서 확인)
        wd = new AndroidDriver(remoteUrl, capabilities);
}

-Android 선처리 예제-

위와 같이 각 환경정보에 필요한 내용들을 먼저 체크한 뒤 이후의 후처리 및 테스트 코드가 정상적으로 수행됩니다.

맺으며

저희는 직접 프로그래밍 기초 지식을 쌓는 동시에 수 만번의 시행착오를 겪으며 점진적으로 테스트 자동화 시스템을 구축 하였습니다. 그 결과 전체적인 QA팀 리소스 활용과 실제 검수 업무에도 큰 도움이 되었고, 사내 DTT(Drama Tech Talk)에도 소개할만큼 많은 분들께서 관심을 가져주시고 계십니다. 이 글을 쓰는 이유도 ‘많은 QA 직무에 있으신 분들이 테스트 자동화에 대한 관심을 가지고 더 나은 업무 프로세스를 만들 수 있도록 도움을 드릴 수 있겠다.’ 였습니다.

아직 포스팅으로 설명해야 할 부분들이 매우 많이 남았지만, 개발 환경 세팅을 하고 Appium과 실제 디바이스를 연결한 것만으로도 크게 한걸음 나아갔다고 해도 과언이 아닐 것 입니다.

다음화는 iOS에서 가장 중요한 ‘WebDriverAgent Test모드로 빌드하기’ 로 찾아 뵙겠습니다. 긴 글 읽어주셔서 감사합니다.

P.S 잘 이해가지 않는 부분이 있다면 언제든, 어느분이든 댓글 남겨주세요.

Appium 자동화 관련 참고링크

  • http://www.automationtestinghub.com/
  • https://domich.wordpress.com/2016/01/11/appium-%ec%95%a0%ed%94%bc%ec%9b%80-%ed%94%84%eb%a1%9c%ed%8c%8c%ec%9d%bc%eb%a7%81-%ea%b8%b0%eb%b0%98-ui-%ed%85%8c%ec%8a%a4%ed%8a%b8-%ec%9e%90%eb%8f%99%ed%99%94-%eb%8f%84%ea%b5%ac/