본문 바로가기

Programming/토이 프로젝트

[Appium] 모바일 테스트 자동화, 가능할까?

오늘은 Appium을 사용해보기위해 삽질한 경험에 대해서 글을 작성해보았다. Appium을 공부할 일이 생겨서 오늘부터 자료 조사를 조금 하고있는데, 한글로 된 자료가 거의 없어서 작성해보았다. 혹시나 Appium으로 테스트 자동화를 도입해보고 싶은데 어디서부터 시작해야할지 모르겠다 ㅠㅠ 하는 사람들에게 도움이 되길 바란다. Appium 공식 문서에도 나와있는 getting-started 부분을 따라해보았다.

Appium이란?

Appium은 iOS 시뮬레이터, Android 에뮬레이터, 실제 디바이스들(iOS, Android, Windows)의 테스트를 지원한다. 이번 글에서 시도해볼 환경은 Android 에뮬레이터이다.

Appium은 Node.js로 구현된 Web Server인데 이런 역할들을 해준다.

1. Client로부터 수신받아 세션을 시작
2. Client가 전송한 command들을 테스트 환경에서 수행한다.
3. 테스트 수행 상태 및 결과를 알려준다.

Appium 설치

시작 전 필요한 환경: Brew가 설치된 Mac 환경

# node.js 설치
$ brew install node

# appium 설치
$ npm install -g appium

JAVA 설치

이미 JAVA가 설치되어있으면 해당 단계는 건너뛰어도 된다.

# JAVA 8 설치
$ brew tap homebrew/cask-versions

$ brew cask install homebrew/cask-versions/adoptopenjdk8

android-sdk 설치

# android-sdk 설치
$ brew cask install android-sdk

환경 변수를 설정해야한다. 현재 나는 zsh 쉘을 사용하고있기때문에, ~/.zshrc에 작성해주었다.

$ vi ~/.zshrc
# JAVA HOME
export JAVA_HOME="/usr/libexec/java_home"

# ANDORID
export ANDROID_SDK_ROOT="/usr/local/share/android-sdk"
export ANDROID_HOME="/Users/{YourUserName}/Android"

참고로 YourUserName은 whoami 하면 나오는 값이다.

변경 내용을 적용하자.

$ source ~/.zshrc

AVD (Andorid Virtual Device) 설치

이제부터 아주 중요한데, 안드로이드 에뮬레이터를 띄우기 위해 필요한 패키지 몇 가지를 설치할 것이다. 패키지 설치하는 방법은 다음과 같다.

$ sdkmanager "패키지 이름"

현재 필요로 하는 패키지는 다음과 같다.

    Path                                      | Version | Description                                | Location
  -------                                     | ------- | -------                                    | -------
  build-tools;28.0.3                          | 28.0.3  | Android SDK Build-Tools 28.0.3             | build-tools/28.0.3/
  emulator                                    | 29.2.1  | Android Emulator                           | emulator/
  patcher;v4                                  | 1       | SDK Patch Applier v4                       | patcher/v4/
  platform-tools                              | 29.0.4  | Android SDK Platform-Tools                 | platform-tools/
  platforms;android-28                        | 6       | Android SDK Platform 28                    | platforms/android-28/
  system-images;android-28;google_apis;x86_64 | 9       | Google APIs Intel x86 Atom_64 System Image | system-images/android-28/google_apis/x86_64/
  tools                                       | 26.1.1  | Android SDK Tools 26.1.1                   | tools/

위에 명시된 패키지들을 한 번에 설치해보자.

$ sdkmanager "build-tools;28.0.3" "emulator" "patcher;v4" "platform-tools" "platforms;android-28" "system-images;android-28;google_apis;x86_64" "tools"

Android Emulator 실행해보기

안드로이드를 테스트 환경 세팅 방법은 크게 두 가지가 있었다.

  1. Android 실제 디바이스를 연결해서 테스트하기
  2. Android Emulator를 실행시키기

하지만 나는 아이폰을 사용중이고, 안드로이드 기기를 구하기 어려웠다. 그래서 Android Emulator를 띄워보기로 했다. Emulator를 띄우려니까 Android Studio를 설치해야된다는 글을 보고.. 설치를 망설임과 동시에 주옥같은 글을 발견했다.


Android Studio 없이 Android Emulator 실행하기_How to Install, Setup and Use Android Emulator for Mac, Linux and Windows without installing Android Studio

Android Studio 설치하지 않고도 Android Emulator를 띄울 수 있다!!

이 글을 참고해도 좋다.
공식 문서: Start the emulator from the command line

자 그럼, 가상 디바이스를 생성해보자. 위에서 system-images;android-28;google_apis;x86_64 패키지를 설치했는데 이 패키지로 Google APIs Intel x86 Atom System Image로 가상 디바이스를 생성할 수 있다.

# 올바른 경로로 이동
$ cd /usr/local/Caskroom/android-sdk/4333796/tools/bin

$ avdmanager create avd --force --name myTestDevice --abi google_apis;x86_64 --package 'system-images;android-28;google_apis;x86_64'  --device "Nexus One"

기기는 Nexus One, 가상 디바이스 이름은 myTestDevice라고 했다. (변경해도 된다.) 이제 실행시켜보자

# emulator가 있는 경로로 이동
$ cd /usr/local/share/android-sdk/emulator

# avd 실행
$ emulator -avd myTestDevice

이렇게 Emulator가 뜬 걸 볼 수 있다!

 

만약, avd를 지우고싶다면?

$ cd /Users/{{YourUserName}}/.android/avd

경로로 간 후, 생성된 avd(myTestDevice)를 삭제해주면 된다.

테스트 실행해보기

Appium Client 세팅

프로젝트를 진행할 경로로 이동해보자.

$ npm init -y

Webdriver.io를 Appium Client로 사용해볼 것이다.

$ npm install webdriverio

세션 초기화

프로젝트 경로에서 index.js라는 파일을 생성한 후 아래와 같이 작성해준다.

// javascript
const wdio = require("webdriverio");

Appium session 설정을 작성해야한다. 세션을 초기화할 때, Appium 서버에게 전달할 값들을 정의하고, wdio.remote()를 호출하여 해당 값을 넘겨준다.

// javascript
const opts = {
  path: '/wd/hub',
  port: 4723,
  capabilities: {
    platformName: "Android",
    platformVersion: "9",                         // 위에서 설정한 AVD의 Andorid 버전은 현재 9이다.
    deviceName: "myTestDevice",                     // AVD device name
    app: "/path/to/the/downloaded/ApiDemos.apk", // ApiDemos-debug.apk의 경로
    appPackage: "io.appium.android.apis",
    appActivity: ".view.TextFields",
    automationName: "UiAutomator2"                 // 우리가 사용할 드라이버
  }
};

async function main () {
  const client = await wdio.remote(opts);

  await client.deleteSession();
}

main();

아주 간단한 테스트 코드 작성해보기

이제 세션을 시작하고, 테스트를 진행하고, 세션을 끝낼 것이다. 테스트는 아주 간단하다. text field에 값을 넣고, 해당 값이 맞는지 확인해볼 것이다.

// javascript

const field = await client.$("android.widget.EditText");
await field.setValue("Hello World!");
const value = await field.getText();
assert.equal(value, "Hello World!");

index.js는 다음과 같을 것이다.

// javascript

const wdio = require("webdriverio");
const assert = require("assert");

const opts = {
  path: '/wd/hub',
  port: 4723,
  capabilities: {
    platformName: "Android",
    platformVersion: "8",
    deviceName: "Android Emulator",
    app: "/path/to/the/downloaded/ApiDemos.apk",
    appPackage: "io.appium.android.apis",
    appActivity: ".view.TextFields",
    automationName: "UiAutomator2"
  }
};

async function main () {
  const client = await wdio.remote(opts);

  const field = await client.$("android.widget.EditText");
  await field.setValue("Hello World!");
  const value = await field.getText();
  assert.equal(value,"Hello World!");

  await client.deleteSession();
}

main();

자 이제, 터미널을 열어 실행시켜보자

# appium 실행
$ appium

# 테스트 실행
$ node index.js

성공!

느낀점

개인적으로 웹 개발하던 내가 갑자기 Android 환경을 세팅하려니 굉장히 힘들었다. Android 환경변수를 찾을 수 없고 온갖 에러를 다 마주했던 것 같다. 그래도 이렇게 에뮬레이터 띄워서 결과 나오는거 보니까 매우 기뻤다. Appium 사용 방법을 좀 더 익혀와서 다음 글에서는 좀 더 심화된 내용을 다뤄보겠다.

참고 자료

Appium 공식 문서

Android Studio_Start the emulator form the command line

Medium_Android Studio없이 Android Emulator 실행하는 방법

우아한 형제들 기술블로그_Cucumber + Appium을 통해 Android 앱 테스트

반응형