안드로이드 테스팅의 효자손 “Appium(앱피움)” 파헤치기 1

[마이크로 소프트웨어 기고, 2015년 7월 31일]

안드로이드 테스팅의 효자손 “Appium(앱피움)” 파헤치기 1

-앱피움 개요
-앱피움의 아키텍쳐
-개발환경 구성
->안드로이드 앱 개발 환경 구성하기
->애피움 실행 환경 구성하기
->안드로이드 앱 자동화 테스트 개발 환경 구성하기
-안드로이드 테스트 자동화 개발
->자동화 테스트를 수행할 앱 개발하기
->테스트 프레임워크 선택
->애피움 클라이언트 선택
->테스트 코드 작성하기
->테스트 코드 실행하기
-UiAutomatorViewer 사용하기

=============================================================

  1. 개요 및 배경

Appium은 모바일 애플리케이션의 테스트 자동화를 가능하게 해주는 오픈소스 라이브러리이다. native, hybrid, mobile web 등 모든 타입의 모바일 애플리케이션의 테스트 자동화를 가능하게 해준다. 자동화된 테스트는 실제 디바이스나 에뮬레이터, 혹은 시뮬레이터에서 실행될 수 있다. 오늘날 대부분의 모바일 앱은 iOS, Android 두 가지 플랫폼 기반으로 작성되고 있다. 같은 기능의 앱일지라도 서로 다른 플랫폼을 기반으로 작성되고 실행되어야 하기 때문에 유지보수 비용이 두 배로 증가한다. 이러한 환경에서 Appium은 하나의 테스트 코드로 서로 다른 플랫폼(Android, iOS, FirefoxOS)의 앱을 테스트할 수 있도록 하여 제품 유지보수의 비용을 줄여준다. 이것이 가능한 이유는 아래 그림에서 볼 수 있듯이 Appium의 소프트웨어 구조가 서로 다른 플랫폼 벤더가 제공하는 테스트 프레임웍을 공통의 WebDriver API(Selenium WebDriver API)로 랩핑을 하고 있기때문이다.  iOS 플랫폼 벤더가 제공하는 테스트 프레임워크는 UIAutomation이고, android 플렛폼 벤더가 제공하는 테스트 프레임워크는 UIAutomator와 Selendroid이고,  Firefox가 제공하는 테스트 프레임워크는 Marionette이다. 

architecture2

 [그림1 Appium의  기반 테스트 프레임워크]

2. Appium Architectures

architecture

[그림2 Appium의 Architecture]

위 그림은 Appium의 아키텍쳐이다.

Appium은 벤더가 제공한 테스트 프레임워크를 Selenium WebDriver API로 랩핑한 client library들을 다양한 개발 언어로 개발자에게 제공한다. 개발자는 기호에 맞는 언어와 테스트 프레임워크를 선택하여 라이브러리가 제공하는 API(WebDriver JSON Wire Protocol)를 사용하여 자동화된 테스트 스크립트를 작성한다.

Appium 서버는 node.js로 작성되었으며 WebDriver 세션을 생성하고 관리하는 HTTP 서버이다. 스크립트 상의 명령어들을 각 벤더의 메카니즘에 따라 실행하고 디바이스에서의 실행 결과를 받아와 콘솔에 기록한다. 

아래의 그림은 Android에서의 Appium 아키텍쳐 그림이다.

android appium

[그림3 Appium Architecture in Android]

아키텍쳐 그림을 통해 테스트 라이프사이클을 알 수 있다.   

1. 스크립트의 API들은 WebDriver JSON Wire Protocol을 사용하여 Appium서버와 통신한다.

2. Appium 서버는 스크립트가 제공하는 Android SDK 버전에 맞는 테스트 프레임워크(UIAutomator 혹은 Selendroid)를 처리할 수 있는 모듈과 tcp 서버를 가지는 bootstrap.jar를 디바이스/에뮬레이터에 설치한다.

3. Appium 서버는 스크립트상에 command를 디바이스의 tcp 서버로 전달한다.

4.디바이스 상의 UIAutomator 서버는 전달받은 명령어를 Android 버전에 맞는 UIAutomator 혹은 Selendroid 명령어로 바꿔 실행하고 실행 결과를 Appium 서버로 보낸다.

5. Appium 서버는 콘솔에 처리 결과를 표시한다.

아래의 그림은 iOS에서의 Appium 아키텍쳐 그림이다.

ios appium

[그림4 Appium Architecture in iOS]

테스트의 라이프사이클은 Android와 유사하다.

다만 Appium Server와 디바이스 사이에서 iOS가 제공하는 instruments 환경을 사용하여 디바이스에서 명령어를 실행한다는 것이 다르다.

3. 개발환경 설치하기

아래 표는 디바이스 플랫폼에 따라 테스트 실행이 지원되는 실행환경(OS)과 각 실행환경에서의 시스템 요구사항을 설명한다.

 configuration

[표1 시스템 요구사항]

자 그럼! Appium을 설치하고 테스트 코드를 작성한 사례를 살펴보자 테스트 PC는 OS X Yosemite 버전 10.10.2 가 설치되어 있다.

1. Android 앱 개발 환경 구성하기

android studio

[그림5 Android Studio 설치 파일 다운로드]

  • Android studio을 Applications에 Drag&Drop 하여 설치한다. 

android studio install

[그림6 Android Studio 설치]

  • Android SDK 설치

   Android Studio 상단 메뉴에 SDK Manager 버튼을 클릭해 SDK 설치한다.

android sdk manager

[그림7 Android SDK 설치]

2. Appium 실행 환경 구성하기

  • Node.js, NPM(https://nodejs.org/download/)
    homebrew 사용하거나 소스를 받아 Node를 설치한다. Node를 설치하면 NPM이 함께
    설치된다.nodejs

npm을 사용하거나 설치화일을 다운로드 받아 Appium과 Appium과 dependency있는 모듈들을 한번에 설치한다.

appium install

[그림9 Appium 설치]

  • Appium 실행할 수 있는지 dependency를 체크한다.appium doctor.png

[그림10 Appium Dependency 체크]

3. Android 애플리케이션 자동화 테스트 개발 환경 구성하기

[그림11 JAVA JDK 설치]

환경 설정 파일에 JAVA_HOME 환경변수를 만들고 JDK 패스를 설정한다 설정된 값이 적용될 수 있도록 source 명령어를 실행한다. 환경변수 값이 제대로 설정되었는지 확인한다.

java path
[그림12 JAVA JDK 환경변수 설정]

  • JAVA IDE(Eclipse, https://eclipse.org/downloads/)
    IDE를 다운로드 받아 압축을 풀면 eclipse 디렉토리가 보인다. 디렉토리 아래 eclipse App화일을 더블클릭하여 실행시킨다.
    eclipse

[그림13 JAVA IDE 설치]

  빌드도구를 다운받아 설치한다. homebrew를 사용하거나 소스를 다운     받아 maven을 설치하고 환경 변수를 설정한다. 설정된 값이 적용될 수 있도록 source 명령어를 실행한다. 환경변수 값이 제대로 설정되었는지 확인한다.

maven

[그림14 MAVEN 설치]

Eclipse 를 위한 Maven Plug in을 설치한다. Eclipse의 Eclipse Help > Install New Software… 서브 메뉴를 통해 설치한다.

maven for eclipse

[그림15 Eclipse MAVEN Plugin 설치]

Genymotion 설치 파일 다운로드 페이지에 진입한다.

genymotion[그림16 Genymotion 설치 파일 다운로드 페이지 진입]

계정 생성한 후 Emulator 설치 파일 다운로드 한다. Genymotion 설치 파일을 더블클릭한다. Genymotion 과 Genymotion Shell 을 Applications로 Drag&Drop 해서 프로그램을 설치한다.

  • Gennymotion Plugin for Eclipse (http://plugins.genymotion.com/eclipse/)
    이클립스를 위한 Genymotion Plug in을 설치한다.
    Eclipse의 Eclipse Help > Install New Software… 서브 메뉴를 통해 설치한다.

genymotion for eclipse[그림17 Eclipse Genymotion Plugin 설치]

가상 디바이스 매니저를 클릭한다.

스크린샷 2016-01-11 오후 5.54.48[그림18 가상 디바이스 매니저 실행]

처음엔 디바이스가 하나도 없을 것이다. New 를 클릭하여 디바이스를 생성 창을 띄운다. ADD를 클릭하여 디바이스를 추가한다.

필자는 Android와 Selendroid를 각 테스트 프레임 기반에서 테스트 하고자 아래 사양으로 두 개의 디바이스를 생성했다.

– UiAutomator(version 4.2+ , API Level 17+)
– Selendroid(version 2.3~4.2, API Level 9+)

virtual device

[그림19 Android 가상 디바이스 추가]

  • TestNG Plugin for Eclipse
    elcipse를 위한 TestNG Plugin을 설치한다. Eclipse > Help > Eclipse Market Place에서  “TestNG”를 검색하면 설치할 수 있다.

4. Android 자동화 개발하기

4.1. 기반 테스트 프레임워크 선택하기

개발자는 기반이 되는 테스트 프레임워크를 선택해야 한다. TDD(Test-Driven Development)를 위한 JUnit이나 TestNG, BDD(Behaviour-Driven Development)를 위한 Cucumber등 다양한 테스트 프레임워크를 기반으로 테스트를 개발할 수 있다.

4.2. Appium Clients 선택하기

정규 WebDriver client 대신에 WebDriver protocol에 대한 Appium의 확장을 지원하는 client libraries를 사용할 수 있다. client library는 아래와 같이 다양한 언어로 지원되므로, 원하는 언어를 선택해 테스트를 개발할 수 있다.

– Ruby
– Python
– Java
– JavaScript
– PHP
– C#
– Robot Framework

4.4. 테스트 앱 개발하기

Android Studio를 사용하여 간단한 로긴 페이지를 가지는 앱을 Android, Selendroid 기반 테스트 프레임워크 상에서 돌려보기 위해 각 버전에 맞는 SDK를 사용하여 두 개의 앱을 개발하였다.

새로운 프로젝트 생성하기

File > New > New Project… 기능을 활용하여 프로젝트를 생성한다.

android new project

[그림20 New Project 생성]

SDK 설정하기

앱이 사용할 SDK API를 선택한다. 각 앱은 아래와 같은 API버전을 갖는다.

API 21: Android 5.0 (Lollipop)
UiAutomator 기반 테스트 프레임워크 상에서 돌려 보기 위한 앱

API 10 : Android 2.3.3(Gingerbread)
Selendroid 기반 테스트 프레임워크 상에서 돌려 보기 위한 앱

android sdk

[그림21 SDK 버전 설정]

Login Activity 추가하기

login 화면을 구성해 주는 Activity 를 추가한다.

android activity

[그림22 Login Activity 추가]

Activity 커스터마이징 하기

Active 에서 Goolgle+ sign in 옵션을 제거한다.

두 개의  Activity 를 만든다. 하나는 화면 상에 Id, Password, Login 버튼이 있고, 다른 하나는 로긴 결과를 표시하기 위해 화면 상에 TextView 가 존재한다.

스크린샷 2016-01-11 오후 6.22.38  [그림23 Activity 화면 구성]

빌드 속성에서 런칭 Activity를 자동으로 생성된 loginActivity로 설정하고, 빌드해서 테스트 앱이 될 .apk 화일을 생성한다.

app configuration

[그림24 빌드 속성 창 열기]

launching activity

[그림25 빌드 속성 창에서 런칭 Activity 설정]

compile app

[그림26 빌드하기]

apk

[그림27 .apk 파일 생성]

위 테스트 코드는

https://github.com/heeseon/android-simple-app-for-appium-android-test

https://github.com/heeseon/android-simple-app-for-appium-selendroid-test

에서 얻을 수 있다.

4.4. 테스트 코드 작성하기

TDD를 위한 TestNG와 Java client library 를 사용하는 테스트 코드를 작성해 예제이다.

Maven 프로젝트를 생성한다. 다른 항목들은 디폴트로 선택하고, Maven project 정보 입력 창에서 Group Id와 Artifact Id를 입력한 후 Finish 버튼을 눌러 프로젝트를 생성한다.

maven new project

[그림28 Maven 프로젝트 생성]

maven new 2

[그림29 Maven artifact 정보 입력]

pom.xml 파일을 열어 아래와 같이 Selenium, TestNG, Appium Java Client 과의 Dependency 를 설정한다.(개발 초기에 선택한 TestNG 테스트 프레임워크와 Appium Java Client를 위한 library를 Maven Repoistory 에서 검색해 아래와 같이 추가하면 된다.)

maven xml

[그림30 Appium Dependency]

아래 그림과 같이 “src/test/java”  폴더 아래 테스트 소스 화일을 생성한다.  필자는 AppiumDemo.java 라 생성하였다.

directory

[그림31 Appium 테스트 프로젝트 파일 구조]

아래는 TestNG Annotation을 사용하여 테스트 전, 후 처리를 한 화면이다. 

previousafter

[그림32 Appium 테스트 소스 – 전처리, 후처리]

테스트 전처리 내용

  디바이스/에뮬레이터에 테스트하고자 하는 애플리케이션을 설치하고 실행시킨다.

Appium 서버에 생성해야할 세션 정보를 capability 설정 정보로 주고 AndroidDriver타입의 객체를 얻는다.

DesiredCapabilities는 key, value를 가지는 hash 구조를 가지며, 자동화를 수행하는 동안 테스트하기 원하는 세션의 정보를 주거나, 기능에 대한  timeout 시간을 설정하는 등과 같이 Appium 서버를 제어하기 위한 속성값을 설정할 때 사용한다. iOS와 Android는 같은 key에 대해 서로 다른 value를 가진다. 상세 사항 은 아래에 명시된 API에 대한 reference를 참고하기 바란다.

org.openqa.selenium.remote.DesiredCapabilities


예제에서는 아래의 의미를 갖는 mandatory capability만 명시하였다.

deviceName – 사용할 모바일 디바이스나 에뮬레이터의 종류(iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, etc…)

platformName – 사용할 플랫폼의 종류(iOS, Android, or FirefoxOS)

app – .ipa, .apk, 혹은 이들 중 하나를 포함하는 .zip 화일의 local path 나 remote http URL.(/Users/hwangheeseon/Documents/workspace/AppiumDemo/apps/SwipeTest.apk or http://eva.com/SwipeTest.ipa)

테스트 하는 기반 테스트 프레임워크가 Selendroid인 경우, 아래 capabilty를 추가해 준다.

   capabilities.setCapability(“automationName”, “Selendroid“);

테스트 후처리 내용

 세션이 생성되어 사용하던 리소스를 정리하는 API를 호출한다.

아래 코드는 로그인하는 테스트 예제이다.

테스트

[그림33 Appium 테스트 소스 – 로긴 테스트]

앱 패키지의 user_id와 user_password의 resource id를 얻어와 아이디와 패스워드 값을 설정하고,  btn_login의 resource id를 얻어와 click 이벤트를 발생시켜 로긴 버튼을 누른 것 같은 효과를 발생시킨다.

참고) 테스트 코드를 작성하기 위해서는 위와 같이 테스트하고자 하는 UI 화면 소스 코드에서 정의한 사용하고자 하는 resource의 id를 알아야 한다. 소스 코드를 보는 방법도 있겠지만 구글에서 제공하는 UIAutomatorViewer를 사용하면 쉽게 알 수 있다. 상세 사용법은 5 챕터를 확인하자.

위 테스트 코드는

https://github.com/heeseon/AppiumUITestScript_TDD_forSimpleLoginApplication

에서 얻을 수 있다.

4.5. 테스트 코드 실행하기

1. Appium 서버를 실행시킨다.

launchappium

[그림34 Appium 서버 실행]

2. 이클립스나 콘솔 창을 이용하여 테스트하고자 하는 디바이스의 에뮬레이터를  실행시킨다.

launchdevice

[그림35 에뮬레이터 실행]

3. Eclipse에서 테스트 화일에 포커스를 두고, 팝업창을 띄워 Run As > TestNG Test 서브 메뉴를 실행시킨다.

launchscript

[그림36 테스트 실행]

4. Eclipse에서 테스트 화일에 포커스를 두고, 팝업창을 띄워 Run As > TestNG Test 서브 메뉴를 실행시킨다. appium 서버를 실행시킨 터미널과 에뮬레이터를 통해 테스트 로그와 테스트 화면을 볼 수 있다. 

executionlog

[그림37 테스트 실행 화면과 로그]

5. 이클립스의 Console에서는 테스트 결과를 볼 수 있다.

testresult

[그림38 테스트 실행 결과 화면]

5. UiAutomatorViewer 사용하기

UiAutomatorViewer는 Android SDK를 설치하면 tools 폴더 아래 설치되는 툴이다. 이 툴을 사용하여 어플리케이션 화면의 레이아웃 구조와 control 들의 속성을 확인할 수 있다. 테스트 스크립트를 작성할 때, 소스 코드를 직접 보지 않고 control의 resource id를 알아보는데 이용할 수 있다.

실행방법은 아래와 같다.

터미널을 통해 UiAutomatorViewer를 실행시킨다.

automatorviewer

[그림39 UiAutomatorViewer 실행]

viewer initial screen

[그림40 UiAutomatorViewer 초기 화면]

에뮬레이터에 어플리케이션(.apk화일)을 Drag&Drop하여 앱을 설치&실행시킨다. 설치&실행 중에 뜨는 에러는 무시한다.

에뮬레이터 상의 어플리케이션을 진행시켜 분석하기 원하는 화면으로 간다.

UiAutomatorViewer의 상단에 device icon을 클릭한다.

capture

[그림41 Emulator UI 캡쳐 아이콘]

UiAutomatorViewer의 왼쪽 화면에 어플리케이션의 현재 UI 화면이 나타나고, 오른쪽 상단 화면에 UI XML snapshot과 node구조가 나타난다. XML snapshot이나 왼쪽 화면 상에서 컨트롤을 마우스로 클릭하여 특정 node를 선택하면 왼쪽 화면에 선택된 node가 어떤 것인지 하이라이트 되어 나타나고, 오른쪽 하단 화면에 node의 상세 정보가 나타난다. 상세 정보란에 node의 resource id 정보도 확인할 수 있다.

sync

[그림42 Emulator화면과 동기화되어 나타나는 UiAutomatorViewer 화면]

6. 결론

지금까지 Appium을 사용해 Android 앱을 테스트 자동화하기 위한 방법에 대해서 배웠다. 앱과 테스트 개발을 위해 수행해야 하는 셋업과 테스트 개발 절차와 테스트 작성할 때 활용할 수 있는 UiAutomatorViewer 사용법을 배웠으며, 심플 앱과 앱에 대한 자동화된 테스트를 개발하여 에뮬레이터 상에서 실행시켜 보았다.

     테스트 앱 작성 시, 데이타 베이스 혹은 그 외의 외부 리소스를 사용하는 기능에 대해 언제 기능이 완료되어 화면이 바뀔지 몰라(너무 빨리 바뀌거나 늦게 바뀌어) 타이밍적인 이슈가 발생하는 경우가 있었다. 타이밍적 이슈를 피하기 위해 테스트 코드를 조심스럽게 작성하거나 그런 방법을 가이드하는 문서를 만들어 배포 하거나, 테스트 프레임워크에서 이를 보완해 줄 방법을 찾아보는 것도 좋을 것 같다.

다음 호에서는 BDD 테스트 프레임워크를 사용해 Appium으로 테스트 자동화하는 방법과 앱을 Android에서 실행하고 Android를 리모트에서 디버깅하는 방법, UI 인터페이스를 가지는 Appium Inspector 사용하는 방법에 대한 내용을 다룰 것이다.    

광고

안드로이드 테스팅의 효자손 “Appium(앱피움)” 파헤치기 1”에 대한 4개의 생각

  1. 일목요연한 설명 감사합니다. 앱피움으로 테스팅 자일목요연한 설명 감사합니다. 앱피움으로 테스팅 자동화 구축해보려고 하는데 도움이 많이 됐네요동화 구축해보려고 하는데 도움이 많이 됐네요

  2. 핑백: Android Testing / TDD – foooool of coding

  3. 안녕하세요. 정리가 잘 되어 있어 따라서 스터디 하려고 합니다.
    mac 사용의 경우 ios에 필요한 요구사항은 하나씩 설치해보면 될것 같은데
    mac의 경우, docker등 상관 없이 linux 플랫폼에 있는데로 구성하면 될까요?

    • 아 이 사이트 방문을 거의 안해서 이제 봤네요…

      “mac의 경우, docker등 상관 없이 linux 플랫폼에 있는데로 구성하면 될까요?”

      이 질문이 정확히 어떤 의도인지 모르겠습니다.

      답변 늦어 미안해요~

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중