don't stop believing

Appium Android Inspector 실행 (with Emulator) 본문

Testing Automation/Appium

Appium Android Inspector 실행 (with Emulator)

Tongchun 2018. 7. 24. 17:07

Windows에 Appium을 설치했으니 Android Inspector를 실행해 봅시다.


Android Inspector는 Android Native App인 경우 HTML Tag 처럼 계층형으로 된 Object들을 확인할 수 있게 해줍니다.

따라서 Android Native App일 경우 Appium에서 Selenium을 이용해 Object들을 컨트롤 할 수 있습니다.


하지만 Unity로 만들어진 App의 경우 계층형의 Object로 보이지 않고 하나의 이미지로 화면이 보여지게 됩니다.

따라서 Unity 게임 앱은 이미지 매칭 라이브러리를 사용해 테스트를 할 수 있습니다. 이미지 매칭에 사용되는 라이브러리는 OpenCV를 사용하게 됩니다. (https://opencv.org/)


Android Studio에서 Android SDK부터 확인해 보겠습니다.

Android Studio를 실행시키고 Start a new Android Studio Project를 클릭합니다. Android Studio를 실행시키기 위한거니 Next만 눌러 기본 설정으로 프로젝트를 하나 만듭니다.


Android Studio가 열였다면 상단 메뉴 중 Tools를 클릭해 SDK Manager를 실행합니다.



Android SDK Manager에서 SDK Platforms 탭을 클릭해 설치되어 있는 APK 버전을 확인합니다.

저는 28부터 23까지 설치가 되어 있습니다. 보통 최근에 개발된 앱이라면 23버전 부터 대부분 지원합니다.



SDK Tools 탭으로 가서 Android Emulator가 설치되었는지도 확인해 줍니다.



이제 AVD Manager를 열고 가상 디바이스(Emulator)를 추가해 줍니다.

AVD Manager는 Android Studio 상단 메뉴 중 Tools 아래 있습니다.



저는 Nexus 5X API 28이라고 디바이스가 추가되어 있습니다.

아래 Create Virtual Device 버튼을 누르고 하나 더 추가해 보겠습니다.

Nexus 6를 추가해 보겠습니다.



Nexus 6를 선택하고 Next를 누르니 API들을 다운로드 하라고 링크가 나옵니다.

저는 모두 Download를 눌러 설치를 해줬습니다.



API Download를 하면 Next 버튼이 활성화 됩니다.

Next 버튼을 눌러 마지막 단계로 이동합니다.



AVD Name을 Nexus 6로 변경하고 Finish를 클릭합니다.



Nexus 6가 등록된걸 확인할 수 있습니다.

오른쪽 녹색 화살표를 눌러 가상 디바이스를 실행할 수 있습니다.

그리고 프롬프트(cmd)에서도 가상 디바이스를 실행시킬 수 있습니다. 가상 디바이스를 실행시키는 명령은 emulator 입니다.

먼저 프롬프트(cmd)를 열고 가상 디바이스의 리스트를 확인합니다. 명령은 emulator -list-avds 입니다.




AVD Manager에서 등록할 때 공백이었던 것은 언더바(_)로 변경됐네요.

그리고 Nexus 4 API 28이라고 하나 더 추가했습니다.


이제 Nexus 6를 실행하 보겠습니다. 명령은 emulator -avd Nexus_6 입니다.


   


Android Emulator가 준비되었으니 이제 Emulator에서 실행시킬 앱을 준비해 봅시다.


Inspector로 확인할 앱은 두 개입니다.

Native App인 Kakaogame SDK Test 앱과 Unity로 개발된 Checkers라는 체스 게임 앱입니다.

Native App과 Unity App이 어떻게 다른지 Inspector로 비교할겁니다.


먼저 테스트할 두 앱을 준비합니다.

Checkers 앱은 아래 url에서 다운로드 받을 수 있습니다.

https://apkpure.com/search?q=checkers



Kakaogame SDK Test 앱은 보안이 필요한 앱입니다. nGle 직원에게만 전달 드릴수 있습니다.


저는 두 apk 파일을 D:\Test_Appium 폴더에 하위 폴더를 만들고 apk 파일을 넣어놨습니다.



Appium Inspector로 Android Emulator에 앱을 설치, 실행하게 됩니다.


앱을 설치, 실행하게 하려면 먼저 두 App에 대한 정보를 알아야 합니다. Android 앱은 Manifest.xml이라는 곳에 앱의 기본 정보들을 저장하고 있습니다. aapt라는 툴을 이용해 apk 파일에서 Manifest 정보를 확인할 수 있습니다.

aapt는 Android Studio의 Build-tools 안에 있습니다.


Android Studio를 설치하면서 등록했던 시스템 환경 변수를 다시 확인해 봅시다.



제 ANDROID_HOME은 C:\Users\tongchun\AppData\Local\Android\Sdk 입니다.

ANDROID_HOME 경로 밑에 build-tools라는 폴더가 있고 그 안에 버전 폴더가 있습니다.

그리고 버전 폴더 안에 aapt 파일이 있습니다.



경로로는 C:\Users\tongchun\AppData\Local\Android\Sdk\build-tools\28.0.1 이렇게 되네요.


프롬프트(cmd)를 열고 위 경로로 이동합니다.

주소가 기니 복사, 붙여넣기를 하면 됩니다. 주소를 복사한 다음에 프롬프트 안에서 오른쪽 마우스를 클릭하면 붙여 넣기가 됩니다.

또는 Shift + Ins 키를 누르면 됩니다.



aapt로 manifest 정보를 확인하는 명령은 아래와 같습니다.

aapt dump badging <apk 파일 경로>


제가 확인할 앱은 아래 경로와 같이 있습니다.

D:\Test_Appium\Checkers\Checkers_v4.0.5_apkpure.com.apk

D:\Test_Appium\KakaogameSDK\KakaoGameSDK_Test_App_3.8.0.1.apk


이걸 그대로 aapt 명령데로 써보겠습니다.

aapt dump badging D:\Test_Appium\Checkers\Checkers_v4.0.5_apkpure.com.apk

aapt dump badging D:\Test_Appium\KakaogameSDK\KakaoGameSDK_Test_App_3.8.0.1.apk


프롬프트에서 명령을 쓰면 뭔가 주르륵 나옵니다.

Checkers_v4.0.5_apkpure.com.apk 는 아래와 같이 나옵니다.

package: name='com.dimcoms.checkers' versionCode='69' versionName='4.0.5'
sdkVersion:'9'
targetSdkVersion:'26'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
application-label:'Checkers'
application-label-af:'Checkers'
application-label-am:'Checkers'
application-label-ar:'Checkers'
<-----   중략   ----->
application-label-tr:'Checkers'
application-label-uk:'珪逵?克龜'
application-label-ur:'Checkers'
application-label-uz:'Checkers'
application-label-vi:'Checkers'
application-label-zh-CN:'Checkers'
application-label-zh-HK:'Checkers'
application-label-zh-TW:'Checkers'
application-label-zu:'Checkers'
application-icon-160:'res/drawable-hdpi-v4/ic_launcher.png'
application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png'
application-icon-320:'res/drawable-hdpi-v4/ic_launcher.png'
application-icon-65535:'res/drawable-hdpi-v4/ic_launcher.png'
application: label='Checkers' icon='res/drawable-hdpi-v4/ic_launcher.png'
application-isGame
launchable-activity: name='com.dimcoms.checkers.MenuActivity'  label='Checkers' icon=''
feature-group: label=''
  uses-feature: name='android.hardware.faketouch'
  uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
main
other-activities
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'af' 'am' 'ar' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-GB' 'es' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh-CN' 'zh-HK' 'zh-TW' 'zu'
densities: '160' '240' '320' '65535'

Appium을 이용해 앱을 실행시킬때 필요한 것은 package name과 launchable-activity name 입니다.

Checkers는 아래와 같이 되어 있네요.

package: name='com.dimcoms.checkers'

launchable-activity: name='com.dimcoms.checkers.MenuActivity'


이번에는 KakaoGameSDK_Test_App_3.8.0.1.apk를 확인해 보겠습니다.

package: name='com.kakaogame.sample' versionCode='2' versionName='1.1'
install-location:'preferExternal'
sdkVersion:'15'
targetSdkVersion:'27'
uses-permission: name='com.android.launcher.permission.INSTALL_SHORTCUT'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.READ_PHONE_STATE'
uses-permission: name='android.permission.permission.RECEIVE_SMS'
uses-permission: name='android.permission.VIBRATE'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='com.google.android.c2dm.permission.RECEIVE'
uses-permission: name='com.kakaogame.sample.permission.C2D_MESSAGE'
uses-permission: name='com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE'
application-label:'Kakao Game SDK Test'
application-label-af:'Kakao Game SDK Test'
application-label-am:'Kakao Game SDK Test'
application-label-ar:'Kakao Game SDK Test'
<-----   중략   ----->
application-label-uz:'Kakao Game SDK Test'
application-label-vi:'Kakao Game SDK Test'
application-label-zh-CN:'Kakao Game SDK Test'
application-label-zh-HK:'Kakao Game SDK Test'
application-label-zh-TW:'Kakao Game SDK Test'
application-label-zu:'Kakao Game SDK Test'
application-icon-160:'res/drawable/ic_launcher.png'
application-icon-240:'res/drawable-xxhdpi-v4/ic_launcher.png'
application-icon-320:'res/drawable-xxhdpi-v4/ic_launcher.png'
application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png'
application-icon-640:'res/drawable-xxhdpi-v4/ic_launcher.png'
application: label='Kakao Game SDK Test' icon='res/drawable/ic_launcher.png'
application-debuggable
launchable-activity: name='com.kakaogame.test.SettingActivity'  label='Kakao Game Test' icon=''
launchable-activity: name='com.kakaogame.sample.SampleActivity'  label='Kakao Game SDK Sample App' icon='res/drawable/game_sample_icon.png'
feature-group: label=''
  uses-feature: name='android.hardware.faketouch'
  uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'
  uses-feature: name='android.hardware.screen.portrait'
  uses-implied-feature: name='android.hardware.screen.portrait' reason='one or more activities have specified a portrait orientation'
main
other-activities
other-receivers
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'af' 'am' 'ar' 'as' 'az' 'be' 'bg' 'bn' 'bs' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-GB' 'en-IN' 'es' 'es-ES' 'es-US' 'et' 'eu' 'fa' 'fi' 'fr' 'fr-CA' 'gl' 'gu' 'hi' 'hr' 'hu' 'hy' 'id' 'in' 'is' 'it' 'iw' 'ja' 'ka' 'kk' 'km' 'kn' 'ko' 'ky' 'lo' 'lt' 'lv' 'mk' 'ml' 'mn' 'mr' 'ms' 'my' 'nb' 'ne' 'nl' 'or' 'pa' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si' 'sk' 'sl' 'sq' 'sr' 'sr-Latn' 'sv' 'sw' 'ta' 'te' 'th' 'tl' 'tr' 'uk' 'ur' 'uz' 'vi' 'zh-CN' 'zh-HK' 'zh-TW' 'zu'
densities: '160' '240' '320' '480' '640'
native-code: 'arm64-v8a' 'armeabi' 'armeabi-v7a' 'x86' 'x86_64'

Kakao Game SDK Test 앱은 아래와 같이 되어있습니다.

package: name='com.kakaogame.sample'

launchable-activity: name='com.kakaogame.sample.SampleActivity'


Kakao Game SDK Test 앱은 launchable-activity가 두개인데 SampleActivity로 하겠습니다.


Android Emulator도 확인했고, 테스트할 앱의 apk와 manifest 정보도 확인했으니 이제 본격적으로 Appium으로 넘어가 보겠습니다.

Appium을 실행시키기에 앞서 Emulator를 먼저 띄워놔야 합니다.

앞서 만들었던 Emulator를 아래 명령으로 실행합니다.

emulator -avd Nexus_6


Emulator가 실행되었다면 Appium을 실행시켜 Start Server v1.8.1 버튼을 클릭합니다.



실행된 Appium Server에서 돋보기 모양 아이콘을 클릭해 Inspector를 실행시켜 주세요.



Inspecter를 이용해 Emulator와 앱을 실행시키기 위해서는 Desired Capabilities를 입력해야 합니다.

하단에 Desired Capabilities Documentation 링크가 있으며 자세한 내용이 설명되어 있습니다.

https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md



먼저 Native App인 Kakao Game SDK Test 앱을 실행해 보겠습니다.

아래와 같이 Desired Capabilities를 입력합니다.


platformName    text    Android

platformVersion    text    9

deviceName    text    Nexus 6

app    text    D:\Test_Appium\KakaogameSDK\KakaoGameSDK_Test_App_3.8.0.1.apk

automationName    text    Appium

newCommandTimeout    number    300

appPackage    text    com.kakaogame.sample

appActivity    text    com.kakaogame.sample.SampleActivity


app 항목에는 apk 파일의 전체 경로를 입력합니다.

appPackage와 AppActivity는 aapt로 확인한 package: name과 launchable-activity: name



왼쪽에 Input box에 하나씩 등록할 수도 있고 오른쪽에 JSON Pepresentation으로 작성할 수도 있습니다.

{
  "platformName": "Android",
  "platformVersion": "9",
  "deviceName": "Nexus 6",
  "app": "D:\\Test_Appium\\KakaogameSDK\\KakaoGameSDK_Test_App_3.8.0.1.apk",
  "automationName": "Appium",
  "newCommandTimeout": 300,
  "appPackage": "com.dimcoms.checkers",
  "appActivity": "com.dimcoms.checkers.MenuActivity"
}

Save As... 버튼을 클릭해 저장해 주고 Start Session을 클릭합니다.

문제가 없다면 Emulator에 Kakao Game SDK Test 앱이 설치되고 실행까지 됩니다.


Input box가 있던 Inspector는 아래와 같이 앱 화면이 나옴니다.



왼쪽 앱 화면을 눌러보면 배경, 버튼 등 Object들을 선택할 수 있고 클릭하면 HTML처럼 계층형의 테그를 볼 수 있습니다.

Selenium에서 배웠던 xpath도 오른쪽 창에 나오네요.


이 Inspector를 이용해 Native 화면의 Object들의 계층을 확인하고 Appium Client를 Python으로 작성할때 Selenium을 이용해 클릭, 텍스트 입력 등을 할 수 있습니다.


이번에는 Unity로 개발된 Checkers 앱을 Inspector로 확인해 보겠습니다.

Checkers 앱을 실행시키기 위해 아래와 같이 등록합니다.


platformName    text    Android

platformVersion    text    9

deviceName    text    Nexus 6

app    text    D:\Test_Appium\Checkers\Checkers_v4.0.5_apkpure.com.apk

automationName    text    Appium

newCommandTimeout    number    300

appPackage    text    com.dimcoms.checkers

appActivity    text    com.dimcoms.checkers.MenuActivity



JSON Pepresentation으로 작성할 수도 있습니다.

{
  "platformName": "Android",
  "platformVersion": "9",
  "deviceName": "Nexus 6",
  "app": "D:\\Test_Appium\\Checkers\\Checkers_v4.0.5_apkpure.com.apk",
  "automationName": "Appium",
  "newCommandTimeout": 300,
  "appPackage": "com.dimcoms.checkers",
  "appActivity": "com.dimcoms.checkers.MenuActivity"
}

Save As... 버튼을 클릭해 저장해 주고 Start Session을 클릭합니다.

문제가 없다면 Emulator에 Checkers 앱이 설치되고 실행까지 됩니다.



Input box가 있던 Inspector는 아래와 같이 Emulator 화면이 나오게 됩니다.



Emulator에서 Play 버튼을 눌러 체스 게임으로 들어가 봅니다.

Emulator 화면이 바뀌면 Inspector의 앱 화면도 자동으로 변경 됩니다. 만약 동기화가 느리다면 상단 버튼 중 Refresh Source & Screenshot (동그란 화살표)를 클릭해 줍니다.



Unity로 개발된 앱은 화면의 Object가 통 이미지로 인식하게 됩니다. 체스판의 말을 Appium에서는 선택할 수 없습니다.

따라서 Unity로 개발된 앱은 이미지 매칭 방식으로 자동화 스크립트를 작성해야 합니다.

보통 OpenCV를 사용합니다.


Appium에서 자동화 테스트 시 Native 앱과 Unity 앱의 차이를 설명하기 위해 Inspecter를 싱행해 확인해 봤습니다.


Comments