UI 테스트 자동화 - 사전 세팅 을 통해 Appium / Android studio / JAVA / 환경 설정 완료된 이후 진행했습니다.
이번에는 실제 디바이스를 연결해서 확인하려고 합니다.
1) 설정에 개발자 옵션이 미노출되는 경우, 설정 > 휴대전화 정보 > 소프트웨어 정보 클릭하여 진입합니다.
2) 빌드번호를 연속으로 4번 클릭해줍니다. 완료 시 설정 메뉴에 개발자 옵션이 노출됩니다.
3) 개발자 옵션 > USB 디버깅을 허용합니다.
4) 단말과 PC를 케이블로 연결 시 노출되는 USB 디버깅 허용 연결을 허용합니다.
이 단계를 생략한다면, 연결이 완료되지 않습니다! -> 세션 시작 시 아래 얼럿 노출되고 adb devices 실행 시 단말 미노출됩니다.
( 이 화면이 노출되지 않는다면 케이블을 다시 확인해보세요 > 정품 케이블이 아닌 경우에는 연결이 되지 않습니다 😂 )
터미널 > adb devices 실행 시 단말 정보가 노출되면 정상 연결된 것을 확인할 수 있습니다. → 여기 디바이스 정보는 deviceName 필드에 입력해야 합니다! (R5CT31XS90T)
** 실행되지 않으면 source .bash_profile 실행
Appium Server GUI을 실행 후 Appium Inspector 서버를 설정해야 합니다.
이전 포스팅 에서 세팅한 설정을 동일하게 사용해도 무관합니다.
다만, 하단의 Desired Capabilities는 실제 실행할 디바이스 / 자동화할 대상에 맞추어 변경해야 합니다.
별도 설정 없이 단말 연결만을 위해서는 가상 디바이스 연결과 동일하게 platformName / deviceName 필드만으로도 가능합니다.
adb devices로 확인한 단말 정보를 입력하고 세션을 시작하면 단말이 미러링된 것을 확인할 수 있습니다.
{
"platformName": "Android",
"appium:deviceName": "R5CT31XS90T"
}
이제, 디바이스에서 Chrome 앱을 실행하도록 설정해보겠습니다.
Desired Capabilities > appPackage / appActivity / noReset 필드에 대해 알아야 합니다.
아래 명령어 실행 시, 현재 동작하는 액티비티 중 포커스된 액티비티들을 볼 수 있습니다.
adb shell dumpsys window | grep -E 'mCurrentFocus'
/ 를 기준으로 왼쪽에 노출되는 것이 appPackage, 오른쪽에 노출되는 것이 appActivity 입니다.
→ appPackage : com.android.chrome / appActivity : com.google.android.apps.chrome.Main
공식 문서에서는 일반적으로 노출되는 3가지의 오류 케이스와 해결 방법에 대해 알려주고 있습니다. 맨 상단에 해당 오류가 노출되지 않기 때문에 길고 긴 오류 문구 중 아래 오류가 포함되어 있는지를 확인하면 됩니다.
case 1) java.lang.SecurityException: Permission Denial: starting Intent
이 오류는 appPackage/appActivity 이 올바르지 않은 경우 노출됩니다.
전체 오류는 아래처럼 노출됩니다.
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.mypackage/.myactivity.MainActivity launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } } from null (pid=11366, uid=2000) not exported from uid 10191
세션을 실행해서 오류 여부를 확인하기 전에 아래 명령어를 실행하면 정상 적인 값인지 수동으로 확인할 수 있습니다. 수동으로 실행된다면 Appium에서도 정상 작동합니다.
adb shell am start -W -n com.myfixedpackage/.myfixedactivity.MainActivity -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000
case 2) com.myactivity or com.myapp.com.myactivity never started
이 오류는 첫 액티비티가 appWaitPackage/appWaitActivity에 설정된것과 동일하지 않은 경우 노출됩니다. 일반적으로 다수의 액티비티를 가진 어플에서 발생됩니다.
해결 방법으로는 개발자에게 프로그램 시작 시 가장 먼저 실행되는 것이 무엇인지 확인하는 것입니다. 위의 현재 포커스된 액티비티 확인하는 명령어를 통해서도 확인할 수 있습니다.
또한, appWaitActivity의 경우에는 이름이 동적으로 생성되거나 항상 동일하지 않다면 와일드카드를 활용할 수 있습니다.
( ex : com.mycomany.foo, com.mycomany.bar 라면 com.mycomany.* 를 사용합니다. )
case 3) Command '…' timed out after X ms
이 오류는 시간이 초과한 경우 노출됩니다. appWaitDuration을 길게 설정하여 해결할 수 있는데 대부분의 경우 20초면 충분하지만 일부 큰 프로그램인 경우 더 많은 시간이 필요할 수 있습니다.
또한, appWaitDuration과 상관없이 시간 초과가 발생할 수 있는데 이런 경우에는 appWaitForLaunch를 False로 설정하여 해결할 수 있습니다.
나의 시행 착오...
처음 실행 시 splask activity가 노출되는데 이후 노출되는 main activity로 입력하여 오류가 발생했습니다. 스플래시 액티비티가 포함되어 있는 어플인 경우, 스플래시 액티비티가 우선 실행되기 때문에 해당 액티비티를 입력해야 합니다.
( 스플래시 액티비티란, 인트로 화면이라고도 할 수 있는데 흔히 어플 시작 시 노출되는 회사 로고나 어플 설명이 짧게 노출되는 화면입니다. )
위에서 언급한 명령어 실행을 프로그램이 완전히 시작된 이후에 실행한 탓에 현재 포커스된 액티비티가 스플래시 이후에 노출되는 액티비티로 노출되었습니다. 정확한 값을 확인하기 위해서는 어플 시작 시 !! 명령어를 실행해야 합니다.
noreset은 reset 설정과 관련한 필드입니다. noreset이나 fullreset을 세팅하지 않은 경우 ( default 상태 ), 세션을 시작할 때마다 앱이 초기화됩니다.
캐시나 앱 데이터가 필요한 테스트인 경우, 테스트 동작 시마다 세팅을 필요로 하기 때문에 데이터가 지워지지 않는 것이 효율적입니다.
( ex : 로그인이 사전 조건인 경우, default 상태에서는 테스트 시마다 로그아웃되어 매번 로그인을 해야 합니다. )
- default : 테스트 후 앱 중지 O, 앱 데이터 삭제 O, APK 제거 X
- noReset : 세션 시작 전과 테스트 후 앱 중지 O, 앱 데이터 삭제 X, APK 제거 X
- fullReset : 앱 중지 X, 앱 데이터 삭제 X, APK 삭제 X
noReset을 true로 실행하면 이전에 확인했던 데이터가 삭제되지 않은 것을 확인할 수 있습니다.
최종적인 JSON은 아래와 같습니다. 입력 후 세션을 시작하면 크롬이 시작된 상태로 연결됩니다.
{
"platformName": "Android",
"appium:deviceName": "R5CT31XS90T",
"appium:appPackage": "com.android.chrome",
"appium:appActivity": "com.google.android.apps.chrome.Main",
"appium:noReset": "true"
}
참고 :
- https://appium.io/docs/en/writing-running-appium/other/reset-strategies/index.html
- https://appium.io/docs/en/writing-running-appium/web/hybrid/
- https://www.automationtestinghub.com/apppackage-and-appactivity-name/
- https://appium.io/docs/en/writing-running-appium/android/activity-startup/#how-to-troubleshoot-activities-startup