Appium으로 성능 분석하며 자동 테스트하기

Appium으로 성능 분석하며 자동 테스트하기

– 성능 분석 지표?
– Appium의 구조 깊이 보기
-> 스마트한 Device Platform에서 제공하는 자동화를 위한 software 모듈
-> UIAutomator, Selendroid, UIAutomation
– 프로파일링 기능은 어디서 처리? App or UIAutomator
– 테스트 결과와 프로파일링 결과 동기화하기
– 하나의 디바이스에서 테스트하고 결과 보기
– 여러 디바이스에서 테스트하고 결과 보기
-> Appium은 동시에 여러 세션을 관리할 수 있을까?
-> 여러 디바이스에서 동일 테스트 돌리기 위한 스크립트 작성하기
-> 테스트 결과 관리하기
-> 테스트 결과 + 프로파일링 결과 정보화 하기
-> 여러 디바이스의 테스트 결과 비교해서 보기, 앱버전에 따른 결과 비교해 보기
-> 사용자를 위한 테스트 결과 관리 메뉴 제공하기
– 프로파일링 기반 UI 테스트 자동화 쉽게 설치 및 사용하기 위한 방법 제시 – Docker or Vagrant

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

광고

다양한 기능 활용하여 자동화 스크립트 작성하기

다양한 기능 활용하여 자동화 스크립트 작성하기

– 테스트 하기 위한 앱을 작성해보자
– 테스트 자동화 스크립트 작성
-> 자동화 테스트를 위한 셋업 스크립트
-> ….
-> ….
– ….
– 테스트 결과를 기록에 남기기 위해 Runner와 Listener를 작성해보자
– 여러 테스트 화일을 배치처리할 수 있도록 TestSuite를 구현해 보자
– 여러 디바이스에서 동일 테스트 배치 처리할 수 있도록 프로그램 구현해 보자
-> DB 와 View를 붙이기

자동화 예제

view를 붙여 보았다(type 1)

스크린샷 2016-01-24 오후 10.22.52

(type 2)

스크린샷 2016-01-24 오후 10.45.03

우선 결과를 빨리 보기 위해서 사용이 간편한 protovis 라이브러리를 사용했지만, 이후 앵귤러와 궁합이 더 잘 맞는 경량 라이브러리로 붙여봐야겠다

이젠 DB를 붙여보자

 

 

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

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

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

– Appium 관심도 조사
– BDD가 정답일까
– BDD 자동 스크립트 개발 환경
-> 환경 구성
-> BDD 스크립트 작성 예제 – Predefined Step 사용
-> BDD 스크립트 작성 – Custom defined Step 사용
-> 자동스크립트 실행
-> 스크립트에서 설정 – 자바 클라이언트
-> 커맨드 라인에서 설정 – 루비 클라이언트
-> 이클립스 실행 방식 – Eclipse JUnit Runcher 사용
-> 커맨드 라인 실행 방식 – Cucumber command line 명령어 사용
– 앱피움 인스펙터 – 앱피움 GUI 버전 사용하기
– Appium UI 버전 앱(Appium.app) 설치
-> 디바이스 실행
-> 앱피움 UI 버전 앱 실행
-> 앱 실행을 위한 설정
-> 앱피움 서버 실행
-> 인스펙터 실행
– 앱피움 API

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

Appium 관심도 조사

google trends(https://www.google.com/trends/?hl=ko)에서 검사해본 UI 자동화 툴 관심도를 보고자 한다(주제어:툴 이름 + android).

비교 툴들은 구글에서 안드로이드 UI 자동화 툴로 검색하면 가장 많이 등장하는 툴들로 구성하였다.

관심도

<그림 1. UI 자동화 툴들의 관심도 변화 비교>

Appium이 다른 툴들에  비해 늦게 등장했지만 꾸준히 관심도가 높아지고 있고 최근에는   가장 높은 관심도를 보이는 것을 알 수 있다.

BDD 가 정답일까?

TDD 와 BDD는 애자일 소프트웨어 개발 방법론에서 가장 널리 쓰이는 테스트 기반 개발 방법론이다. 테스트 시나리오와 테스트를 먼저 만들고 그것을 만족하는 코드를 작성해 나가는 개발방식을 일컫는다. TDD는 상대적으로 테스트에 더 집중하고 BDD는 비지니스 요구사항에 더 집중하여 테스트 코드를 생산한다. 코드가 없는 상태에서 개발 요구사항을 검증하는 코드를 작성해 보면 개발 요구사항을 좀 더 정확히 이해할 수 있으며 요구사항에서 놓친 예외사항을 미리 알 수 있어 더 안정적인 시스템을 만들 수 있다는 장점을 가진다. 그럼 BDD 와 TDD 의 차이점은 무엇일까?  TDD는 테스트 스펙을 머리로 생각하고 테스트 코드 작성에 들어가는데 반해, BDD는 사용자 시나리오 관점에서 자연어에 가까운 언어로 이 과정을 기술하는 단계를 가진 후 TDD의 개발 과정을 밟는다. BDD는 테스트 시나리오가 자연어에 가깝기때문에 디자이너, 개발자, 테스터가 모두 동일하게 시스템의 스펙을 바라볼 수 있다는 점과  대개 BDD 방식의 테스트 툴이 미리 정의된 코드들을 지원하여 이를 사용하면 자연어에 가까운 언어만으로 테스트 코드 작성이 가능하여 테스트 개발이 쉽고 빠르다는 장점이 있다. 테스트는 경제적인 코드 생산을 위해 하는 작업이고 어느 레이어의 코드냐 코드의 목적이 무엇이냐에 따라 테스트 범위, 방법이 달라진다. 그리고 테스트 비용을 유발시키기 때문에 상황에 따라 BDD가 적합할 수도 있고, TDD 방식이 더 적합할 수 있을 것이다.  고객이 알아야 하는 사항들에 대한 테스트는 BDD 를 고객 요구사항을 구현하기 위해 고객은 모르지만 내부적으로 개발해야 하는 기능들에 대한 테스트는 TDD 가 좋다.  애피움의 큰 장점 중 하나는 두 가지 개발 방법론을 다 지원하기 때문에 상황에 맞게 테스트 개발 방법론을 선택할 수 있다. 

BDD 자동 스크립트 개발 환경

BDD 방식의 자동화 스크립트는 [프로젝트 기본 파일 구조(feature) 생성]->[테스트 시나리오 및 스텝 작성]->[스텝 구현] 절차를 따라 작성된다. 

시나리오 작성 및 스텝 작성 단계에서 스텝은 구현이 이미 작성된 경우(predefined step)도 있고,  작성되지 않아 개발자가 작성해 줘야 하는 경우(custom defined step)도 있다. 

이번 장에서는 두 가자 경우에 대해서 다 살펴볼 것이다. 전자는 appium client를 Ruby 언어로 테스트 프레임워크로 Cucumber를 사용할 것이며,  후자는 appium client를 자바 언어로 테스트 프레임워크를 Cucumber와 JUnit으로 사용할 것이다.

설치

1. Ruby

스크립트 개발 언어 Ruby를 아래와 같이 설치한다. 

ruby install

<그림 2. Ruby 설치>

2. selenium-cucumber

Cucumber는 BDD를 지원하는 고수준 테스팅 툴이다. Selenium은 웹을 자동화하기 위한 테스트 툴이다.  selenium-cucumber는 Web과 안드로이드 앱의 테스트 자동화를 위한 툴로 관련 Dependency가 있는 모듈들을 모두 설치해 준다.

seleniumcucumber

<그림 3. selenium-cucumber 설치>

외에  Java, Android SDK, Appium 이 설치되어야 한다.  이전 회에서 설치 과정을 명시했으므로 이전 회를 참고하기 바란다.

BDD  테스트 자동화 스크립트 작성

[1]  Predefined Step 을 사용하여 스크립트 작성

appium client를 Ruby로, 테스트 프레임워크를 Cucumber를 사용한다. 자동화 스크립트 작성 및 실행은 IDE를 사용하지 않고 커맨드라인으로 작업을 한다.

프로젝트를 담을 폴더를 생성하여 테스트하고자 하는 앱을 위치시키고,  selenium-cucumber툴을 사용하여  feature skeleton을 생성하자 . feature skeleton은 아래 그림의 설명처럼 애플리케이션을 테스트 자동화하기 위한 기본적인 파일 구조를 가지는 하나의 프로젝트라고 보면 된다.  

seleniumcucumberapp

<그림 4. feature-skeleton 생성>

feature skeleton은 아래와 같은 파일 구조를 가진다.

 

tree

                                <그림 5. feature-skeleton의 화일 구조>

프로젝트를 구성하는 화일들의 상세 사항은 아래와 같다.
– my_first.feature : 사용자 스토리(비지니스 요구사항)와 요구사항을 테스트하는 다수의 테스트 시나리오와 각 시나리오를 구성하는 다수의 테스트 스텝을 가지는 파일이다.
– step_definition 폴더 : my_first.feature 에서 시나리오를 구성하는 테스트 스텝은 미리 정의된 구현 코드를 가지는 스텝일 수도 있고, 정의되지 않아 개발자가 구현을 만들어줘야 하는 스텝일 수도 있다. 정의되지 않은 스텝일 경우, 스텝에 대한 구현 코드 파일을 가지는 폴더이다
– support 폴더 : 테스트 진행 시, 로드되는 파일들로, 테스트 코드 작성할 때 개발자가 별도로 만든 Ruby 파일들을 사용하고자 할 때, 혹은 각 테스트 전 후에 공통적인 코드를 추가하고자 할때 이 폴더 내의 파일에 코드를 추가한다.   
– actual_images, expected_images, Image_difference, screenshots 폴더 : 테스트 도중 캡쳐한 스크린 샷이나 테스트 할 때 사용하는 이미지 등을 가지는 폴더이다

predefined step을 사용하거나 혹은 자신만의 스텝을 만들어 feature 파일(feature/my_first.feature 파일)에 스텝을 정의한다

———————————————————————————————

Feature: Login feature
  Scenario: As a valid user I can log into my app
        When  I enter "domich" into input field having id 
                                  "com.example.simplelogin:id/idET"
        When I enter "1234" into input field having id 
                                 "com.example.simplelogin:id/pwdET"
        When I click on element having id 
                                 "com.example.simplelogin:id/login"
        Then element having id 
  "com.example.simplelogin:id/result" should have text as "Logined"

———————————————————————————————
<코드 1.  루비 클라이언트 사용 – Login Feature 파일 코드>

Feature는 사용자 스토리를 의미하며, 비지니스 요구사항을 담는다.

Scenario는 다수개가 올 수 있으며 각각 아래와 같이 Given/When/Then 템플릿으로 시나리오를 검증하기위한 테스트 스텝을 갖는다.

Given 검증 전 준비 단계 어떤 상태 등을 나타낸다
When 사용자가 특정 액션을 취했음을 나타낸다
Then 액션에 대한 결과가 어떠해야 함을 나타낸다

예제 샘플 스크립트 내용은 다음과 같다. 하나의 시나리오를 가지며 그 시나리오는 네개의 스텝으로 구성되어 있다.  사용자가 idET요소에 domich을 pwdET요소에 1234를 입력하고,  login 요소를 클릭했을 때, 화면 상에 result 요소에 Logined라고 표시되는지를 확인하는 유효한 사용자의 로긴 시나리오이다.

각 요소의 id 찾는 방법은 지난호에 기재된 UIAutomatorViewer 나  뒷면에서 나오는 원격 디버깅 툴 사용법을 참고하기 바란다.

3. 2번 단계에서 predefined step을 사용하지 않고 custom step 으로 작성하였다면, custom step을 구현해 줘야 한다.(feature/steep_definitions/custom_steps.rb 파일)

이 예제는 predefined step을 사용하였으니 이 부분을 생략한다.

위 테스트 코드는

https://github.com/heeseon/RubyAppiumUITestScript_BDD_forSimpleLoginApplication

에서 얻을 수 있다.

[2]  Custom defined Step 을 사용하여 스크립트 작성

appium client를 JAVA로, 테스트 프레임워크를 Cucumber와 JUnit을 사용한다. 자동화 스크립트는 Eclipse의 Maven 프로젝트 형태이며, 실행은 JUnit으로 한다. Maven 프로젝트에 대한 설명은 지난 호에서 살펴봤으므로 자세히 하지 않는다. 

Maven 프로젝트를 생성한다.

아래와 같이 pom.xml 화일에 cucumber를 사용하기 위한 dependency를 추가한다.

스크린샷 2016-01-11 오후 7.33.59

<코드 2. BDD 방식의 스크립트 작성을 위한 appium dependency>

3. 프로젝트 루트 폴더 아래 apps 폴더를 생성하고 테스트하고자 하는 앱을 위치시킨다.

4. src/test/java폴더 아래 feature 폴더를 생성하고 feature화일(Login.feature)을 생성한 후, 아래와 같이 스크립트를 작성한다.

동일한 앱을 테스트를 하는 것이므로 위에서 생성한 Ruby용 스크립트와 내용이 유사하다.  문법은 동일하게 Given/When/Then 템플릿을 사용한다.

———————————————————————————————

Feature: Invalid Login to the SimpleLogin app
Scenario: Passing valid credentials and log in into the application
    Given I am on the landing page
    When I enter id as "domich" 
    When I enter password as "1234"
    When I click login button
    Then I should see the success message "Logined"

———————————————————————————————

<코드 3.  자바 클라이언트 사용 – Login Feature 파일 코드>

5. src/test/java폴더 아래 steps 폴더를 생성하고 스텝 구현 파일(LoginSteps.java)을 생성한다.

지난 호에 살펴본 TestNG 구조와 유사하게 테스트 전처리(@Before), 후처리(@After)를 위한 Anotation을 사용하며, 외에 Given/When/Then 구문에 대한 Anotation을 사용하여 작성된다.

시나리오 파일에서 작성된 스텝들 각각에 대한 구현이 있으며,  각 스텝과 테스트 전, 후처리 구현에 대한 설명은 지난 호에 작성된 것과 유사하기때문에 지난 호의 내용을 참고하기 바란다.

———————————————————————————————

public class LoginSteps {
    private AndroidDriver driver;
    By userId;
    By password;
    By login_Button;
    By result;
     
    public LoginSteps() {
    }
    
//자동화 테스트 전처리
@Before
public void initializeAppiumSession() throws MalformedURLException{
      File appDir = new File(
   "/Users/hwangheeseon/Downloads/AppiumCucumberDemo-master/apps");
      File app = new File(appDir, "app-debug.apk");
      DesiredCapabilities capabilities = new DesiredCapabilities();
      capabilities.setCapability("deviceName","Android Emulator");
      capabilities.setCapability("automationName", "Selendroid");
      capabilities.setCapability("platformName","Android");
      capabilities.setCapability("app", app.getAbsolutePath());
      driver =  new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}

//Given Anotation, ^와  $는 스텝 구문을 감싸는 문법
@Given("^I am on the landing page$")
public void I_am_on_the_landing_page() throws Throwable {
    
      userId = By.id("idET");
      password = By.id("pwdET");
      login_Button = By.id("login");
      WebDriverWait wait = new WebDriverWait(driver, 60);
      wait.until(ExpectedConditions.visibilityOfElementLocated(userId));
}
//When Anotation, 
@When("^I enter id as \"([^\"]*)\"$")
public void I_enter_id_as(String ID) throws Throwable {
      driver.findElement(userId).sendKeys(ID);
}
//When Anotation,
@When("^I enter password as \"([^\"]*)\"$")
public void I_enter_password_as(String PW) throws Throwable {
      driver.findElement(password).sendKeys(PW); 
}
//When Anotation,
@When("^I click login button$")
public void I_click_login_button() throws Throwable {
      driver.findElement(login_Button).click(); 
}
//Then Anotation,
@Then("^I should see the success message \"([^\"]*)\"$")
public void I_should_see_the_success_message(String success) throws Throwable {
 result = By.id("result");
 WebDriverWait wait = new WebDriverWait(driver, 60);
 wait.until(ExpectedConditions.visibilityOfElementLocated(result));
 success.contentEquals(driver.findElement(result).getText());
}
//테스트 후처리
@After
public void tearDown(){
    driver.quit();
    }

}

———————————————————————————————

<코드 4.  자바 클라이언트 사용 – 커스텀 스텝 구현 파일 >

6. 아래와 같이 src/test/java폴더 아래 JUnit 실행 파일(RunFeatures.java)을 생성한다.

——————————————————————————————

//JUnit의 실행 클래스 지정하는 Anotation
@RunWith(Cucumber.class)
// Cucumber의 커맨드에 대한 파라미터 옵션, feature : feature 폴더 패스, format :  실행 결과 표시 포맷 
@CucumberOptions(features = "src/test/java/features/",
        format = {"pretty", "html:target/cucumber", "json:target/cucumber-report.json"})

public class RunFeatures {

}

———————————————————————————————

<코드 5.  자바 클라이언트 사용 – 스크립트 실행 파일>

Cucumber 커맨드에 대한 파라미터 옵션이다. feature는 feature 폴더의 패스를 의미하고  format 은 실행 결과에 대한 표시 포맷을 의미한다. 위에서 사용된 Cucumber  파라미터 옵션의 상세 설명은 아래 사이트를 참조한다.

http://cucumber.github.io/api/cucumber/jvm/javadoc/cucumber/api/CucumberOptions.html

위 테스트 코드는

https://github.com/heeseon/JavaAppiumUITestScript_BDD_forSimpleLoginApplication

에서 얻을 수 있다.

자동스크립트 실행 

1. 안드로이드 디바이스에서 자동화 스크립트 실행하기

Login 샘플을 안드로이드 디바이스에서 직접 실행해 보자

디바이스에서 실행하기 위해 아래의 과정이 필요하다.

  • 디바이스에서 USB 디버깅 기능 활성화하기
  • adb 로 디바이스 인식하기
  • 자동화 스크립트를 실행할 디바이스 선택하기
  • Appium 서버 실행하기
  • Automation script 실행하기

한 단계씩 진행해 보자

디바이스에서 USB 디버깅 기능 활성화하기

안드로이드 디바이스의 USB 디버깅 옵션을 켜기 위해 설정에서 개발자 옵션 메뉴에 들어가자

개발자 옵션이 숨겨진 디바이스에서는    [환경설정]>[더보기]>[디바이스 정보] 메뉴로 진입해 빌드 번호 정보를 손가락으로 7번 탭핑한다.

개발자 옵션이 활성화되면 그림 1과 같이  [환경설정]>[개발자 옵션] 에 진입하여 USB 디버깅 기능을 활성화 시키자

activatedevice

<그림 6. USB 디버깅 활성화>

adb 로 디바이스 인식하기

디바이스에 usb cable을 연결한 후 콘솔창을 열어 그림 2와 같이 adb 명령어로 adb가 디바이스를 인식했는지 확인하자

device

<그림 7. adb 에 연결된 디바이스>

그림2은 192168.56.101:5555(에뮬레이터) 와 107f8117(안드로이드 디바이스) 두 개의 디바이스가 인식된 것을 알 수 있다.

adb가 USB 를 통해 인식되는 디바이스의 vendor ID 를 인식하지 못하는 경우, 디바이스의 vendor ID를 설정 파일에 추가해 줘야 한다.

디바이스의 vendor ID는

그림 3과 같이 [Mac 메뉴]>[이 Mac에 관하여]>[시스템 리포트…]>[하드웨어]>[USB] 정보를 통해 알 수 있다.

 deviceconfirm

<그림 8. USB 디바이스의 vendor ID 읽기>

그림 4와 같이 vendor ID를 설정파일(~/.android/adb_usb.ini)에 추가하고 adb를 재실행시킨다.

register device

<그림 9.  vendor ID 추가를 위한 명령어와 설정파일 내용>

자동화 스크립트를 실행할 디바이스 정보 설정하기

디바이스 정보를 스크립트에서 설정하는 경우와 커맨드 라인에서 설정하는 경우 두가지가 있다.

<스크립트에서 설정-자바 client 사용하는 경우>

지난 호에 작성했던 것 처럼 mandatory 항목의 Desired capability만 설정하면 Appium은 디바이스 인식을 못해 무조건 먼저 실행된 디바이스(에뮬레이터) 상에서 자동화 스크립트를 실행시킨다.  아래와 같이 adb가 인식하는 디비이스의 udid(adb devices 명령어를 통해 본 ID)를 추가해 원하는 디바이스에서 스크립트를 실행하자

udid

<그림 10.  디바이스 구분을 위한 DesiredCapabilities 설정>

<커맨드 라인에서 설정-Ruby client사용하는 경우>

커맨드 라인 실행 방식에서는 스크립트가 아닌 커맨드 라인 실행 명령어로 디바이스를 선택한다.

스크립트 실행 명령어인 cucumber 명령어는 현재 adb에 연결된 디바이스를 확인하고 디바이스가 하나인 경우 그 디바이스에서 스크립트를 실행시킨다. 그러므로 아래와 같이 adb devices 명령어로 연결된 디바이스 리스트를 확인하고 원하는 디바이스 외에 다른 디바이스는 adb disconnect 명령어로 연결 해제시킨다. 원하는 디바이스가 연결되지 않은 경우 adb connect 명령어로 디바이스를 연결한다.

Appium 서버 실행하기

콘솔을 통해 appium server를 실행시킨다.(실행방법은 지난 호 내용 참조)

Automation script 실행하기

[ Eclipse IDE  실행 방식 – Eclipse JUnit Runcher 사용]

아래와 같이 Eclipse JUnit  View를 통해 실행 과정을 보여준다.

ide

<그림 11. 자동화 스크립트 실행 과정-IDE사용>

실행이 끝난 후, JUnit 실행 파일(RunFeatures.java)에 기재된 Cucumber report 포맷에 따라 아래와 같이 화면에 실행 결과를 표시한다.

result

<그림 12. 스크립트 실행 결과-IDE사용>

[커맨드라인 실행 방식- Cucumber command line 명령어 사용]

커맨드 라인 실행 방식에서는 아래와 같이 cucumber 실행 명령어의 파라미터로 플랫폼과 앱의 패스를 전달한다. 

cucumber는 아래와 그림과 같이 시나리오의 각 스텝을 실행시키며 실행결과를 화면에 표시한다.

commandline

<그림 13. 스크립트 실행 과정과 결과-커맨드라인사용>

Device screen Display 고려

테스트 실행 시, 텍스트 필드에 값을 넣으면 스크린 키보드가 화면에 나타난다. login 버튼이 스크린 키보드에 가려진 상태에서 버튼에 클릭 이벤트를 전달하면 이벤트가 전달은 되는데 적용되지 않아 테스트의 마지막 스텝이 Fail난다. 이 문제를 해결하기 위해서는 텍스트 필드에 값을 넣은 후에 키보다가 떠 있다면 키보드를 hide 시키는 스텝이 추가되어야 한다.

자바의 경우 텍스트 처리 후 아래의 구문을 추가한다.

————————————————————-

    @When("^I enter id as \"([^\"]*)\"$")
    public void I_enter_id_as(String ID) throws Throwable {
        driver.findElement(userId).sendKeys(ID);
        driver.hideKeyboard();
    }
    @When("^I enter password as \"([^\"]*)\"$")
    public void I_enter_password_as(String PW) throws Throwable {
        driver.findElement(password).sendKeys(PW); 
        driver.hideKeyboard();
    }

————————————————————-

<코드 6.  스크린 키보드 내리는 코드 추가 – 자바 클라이언트 사용>

루비의 경우,  스크린 키보드 내리는 기능이 predefined step으로 정의되지 않았다. 그러므로 custom step을 정의해서 selenium API나 ruby client가 지원하는 API를 사용하여 스크린 키보드 내리는 기능을 구현해줘야 한다.

우선 feature화일에서 login버튼 누르기 전 단계에 아래와 같이 키보드 내리는 스텝을 추가하자( 빨간색이 추가한 스텝이다)

———————————————————–

Feature: Login feature
  Scenario: As a valid user I can log into my app
        When  I enter "domich" into input field having id 
                                  "com.example.simplelogin:id/idET"
        When I enter "1234" into input field having id 
                                 "com.example.simplelogin:id/pwdET"
        When behindkeyboard
        When I click on element having id 
                                 "com.example.simplelogin:id/login"
        Then element having id 
  "com.example.simplelogin:id/result" should have text as "Logined"
-----------------------------------------------------------

<코드 7. 스크린 키보드 내리는 스텝 추가 – 루비 클라이언트 사용>

feature/step_definitions/custom_steps.rb 파일에 추가한 스텝에 대해 custom step을 정의해 보자. 빨간색은 스텝의 구현 파트를 알리는 문법이다.(predefined 와 custom step 중복 사용 가능하다)

-----------------------------------------------------------
When /^behindkeyboard$/ do
  $driver.hide_keyboard
end
-----------------------------------------------------------

<코드 8. 스크린 키보드 내리는 스텝에 대한 구현 – 루비 클라이언트 사용>

device_is_android란 함수가 정의되지 않았다는 에러가 난다. 라이브러리가 아직 완성되지 않은 상태인 것 같다.

제대로 고치려면 복잡할 거 같아 우선 아래와 같이 문제있는 코드에서 device_is_android 함수를 사용하지 않도록 했다. 무조건 android 디바이스로 처리하도록 수정한 것이다. 하지만 이건 좋지 않은 코드이다. 오픈 소스이니 독자들은 이 부분에 기여해 보는 것도 좋을 것 같다.

-----------------------------------------------------------
      add_endpoint_method(:hide_keyboard, 'session/:session_id/appium/device/hide_keyboard') do
          def hide_keyboard(close_key=nil)
            # Android can only tapOutside.
            if 1 #device_is_android
             return execute :hide_keyboard, {}, { strategy: :tapOutside }
            end
            close_key ||= 'Done' # default to Done key.
            $driver.hide_ios_keyboard close_key
          end
        end
-----------------------------------------------------------

<코드 9. 스크린 키보드 내리는 코드 버그를 수정하기 위한 임시코드 >

이렇게 해서 실행하면 아래와 같이 모든 스텝이 패스하는 것을 확인할 수 있다.

useruby

<그림 14. 스크립트 실행 결과 – 루비 클라이언트 사용>

Appium inspector 앱 사용하기

앱을 사용하여 개발자는 실행중인 디바이스(애뮬레이터)에 애플리케이션을 설치/실행시키고 앱을 구성하는 UI 요소들의 id, class 등의 정보를 얻을 수 있으며, 화면의 특정 구역을 지정하여 변수(xpath)를 정의할 수 있다. 또한 다양한 UI 명령어를 실행시키며 앱의 동작 결과를 확인할 수 있으며, 앱 설치/실행, UI 명령어 실행 등의 모든 실행 과정을 자동화 스크립트로 자동 생성할 수 있다.

Appium UI 버전 앱(Appium.app) 설치
http://appium.io에서 Appium을 설치한다.

guiappium
<그림 15. Appium 설치>

Launchpad (응용 프로그램) 에서 Appium UI 버전 앱 아이콘을 확인할 수 있다.

icon
<그림 16. Appium 실행 프로그램>

디바이스(에뮬레이터) 실행( adb를 통해 디바이스에 연결)

자동화 스크립트를 실행시킬 디바이스나 에뮬레이터를 실행시킨다.

Appium UI 버전 앱 실행
응용프로그램에 Appium 아이콘을 클릭하여 앱을 실행하자 여러 기능이 있지만 자주 사용하는 기능을 빨간색으로 칠하였다.

appiumguiexecution
<그림 17.   Appium UI버전 실행>

3.1. 앱 실행을 위한 설정

애피움 서버에 안드로이드 앱(.apk)의 패스 및 실행 환경 설정 등 자동화 스크립트 실행을 위한 정보를 설정한다.

appiumguisetting

< 그림 18 테스트할 애플리케이션 정보 설정>

3. 2 애피움 서버 실행

애피움 서버를 실행한다. 이전에 커맨드 라인으로 애피움 서버를 실행중이었다면 같은 포트를 사용하기때문에 실행을 실패할 것이다. 실행중인 서버를 중단하고 UI를 통해 애피움 서버를 실행시키자. 아래 그림에서 볼 수 있듯이 애피움 서버가 실행되면서 실행 아이콘이 실행 종료 아이콘(Stop)으로 바뀌는 것을 볼 수 있으며, 애피움 서버의 로그를 볼 수 있다.

serverexcecution

<그림 19. 애피움 서버 실행>

3.3 inspector  실행

인스펙터를 실행시키면, 디바이스(에뮬레이터에) 에 앱을 설치하고 실행시킨다. 그리고 앱에 대한 설정 및 UI 명령어를 실행시킬 수 있는 Inspector 창이 뜬다.

appiuminspector

<그림 20. 애피움 인스펙터>

Inspector 창을 구성하는 각 기능 요소들의 기능은 아래 테이블과 같다.

스크린샷 2016-01-11 오후 8.22.32

<표 1 인스펙터 기능>

웹앱 크롬 원격 디버깅 도구 활용해 UI 요소 ID 찾기

native 앱의 resource id와 locator를 알기 위해 UIAutomator 를 사용했다. 앱이 hybrid나 웹 앱인 경우, UIAutomator 대신 크롬 도구를 활용할 수도 있다.  이 경우 안드로이드 SDK를 설치하지 않아도 되어 가볍고 빠른 속도로 앱의 ellement의 id를 알 수 있고, 앱을 디버깅할 수 있다는 장점이 있다.

디버깅 PC 와 안드로이드 디바이스를 USB 로 연결한 후, PC에서 크롬을 실행시키고 [메뉴]>[도구 더보기]>[기기 검사] 서브 메뉴를 통해 확인할 수 있다. UIAutomator와 같이 디바이스(에뮬레이터) 프리뷰 화면을 지원하고 애플리케이션의 레이아웃을 코드로 부터 쉽게 UI요소를 검색하여 요소 정보를 얻을 수 있다.                                                                                                                                                                                      

Appium API

아피움 서버와의 세션을 설정하고 코드 내에서 UI 요소의 레퍼런스를 찾아 레퍼런스가 현재 화면에 보여지는지 확인하고 UI 요소에 UI 이벤트를 발생시키고 키보드를 내리는 등의 API를 사용해 보았다.

아피움은 이것외 다양한 UI 이벤트(Swipe, Tap, Long Tap, Scroll 들을 발생시킬 수 있으며, Javascript 코드를 실행시키거나 디바이스(애뮬레이터) 스크린을 캡쳐해 저장할 수 있는 API 등 test runner가 지원하는  assertion등을 지원한다. 또한 Selenium API를 사용하여 브라우저의 속성들을 컨트롤 하거나 테스트를 여러 기기에 분산시키기 위한 API가 제공된다.

API에 대한 자세한 설명은 아래 링크를 참고할 수 있다.

selenium api doccumentation, http://www.seleniumhq.org/docs/03_webdriver.jsp

appium api documentation,
http://appium.io/slate/en/master/?ruby#

selenium cucumber api documentation(predefined step, and api), http://seleniumcucumber.info/

결론

지난 호에 이어 BDD 개발 방식에서의 Appium 사용법을 살펴보았다. 짧지만 스크립트를 작성해 보며 느낌 소감은 Appium이 활용도가 높을 것이다라는 전망이다. 단말, 플랫폼, 스크린의 경계가 없어지는 추세로 인해 HTML5가 공통플랫폼 기술로 고려되고 있고, Android, iOS 는 이미 모바일 플랫폼으로 대부분의 디바이스에서 적용되고 있다. 결국 Appium은 가장 핫한 플랫폼들을 모두 커버할 수 있는 UI 테스트 자동화 기술인 것이다.  이와 더불어 요즘 좀 더 쉽고 효율적인 Appium 스크립트 작성을 위해 클라이언트 라이브러리와 개발 도구들이 오픈소스로 개발되고 있다. 오픈소스 및 오픈소스 커미터에 대한 관심이 날로 높아지는 가운데 오픈소스의 커미터가 될 수 있는 좋은 기회가 될 수 있을 것 같다. 쉽고 효율적인 스크립트 작성에 대한 기여 뿐만 아니라 UI 테스트 외에 ,테스트를 하면서 시스템 리소스 분석과 같은 시스템의 품질을 함께 검증해주는 기능들이 자동화 될 수 있을 것이다.

참고

채수원, 테스트 주도 개발 TDD 실천법과 도구

appium, http://appium.io/

appium java client, http://appium.github.io/java-client/

appium ruby client, http://seleniumcucumber.info/

안드로이드 테스팅의 효자손 “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 사용하는 방법에 대한 내용을 다룰 것이다.