오늘은 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 실행해보기
안드로이드를 테스트 환경 세팅 방법은 크게 두 가지가 있었다.
- Android 실제 디바이스를 연결해서 테스트하기
- Android Emulator를 실행시키기
하지만 나는 아이폰을 사용중이고, 안드로이드 기기를 구하기 어려웠다. 그래서 Android Emulator를 띄워보기로 했다. Emulator를 띄우려니까 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 사용 방법을 좀 더 익혀와서 다음 글에서는 좀 더 심화된 내용을 다뤄보겠다.
참고 자료
Android Studio_Start the emulator form the command line
'Programming > 토이 프로젝트' 카테고리의 다른 글
[severless] 학교 공지사항 크롤러 (Puppeteer + AWS Lambda + DynamoDB => slack) (0) | 2020.12.06 |
---|---|
[퀵숙] 웨일 확장앱 만들어본 후기(+ 크롬 익스텐션) (2) | 2020.10.27 |
[오픈소스 입문] 누구나 따라할 수 있는 오픈소스 컨트리뷰터 되기! (1) | 2020.08.13 |
[JS] 랜덤 수를 생성해서 선물 금액을 정해보자! (0) | 2020.06.03 |