UI 테스트 자동화 - Appium으로 실제 디바이스 실행하기

Soyean·2023년 1월 25일
0

Appium 

목록 보기
3/4
post-thumbnail

UI 테스트 자동화 - 사전 세팅 을 통해 Appium / Android studio / JAVA / 환경 설정 완료된 이후 진행했습니다.

이번에는 실제 디바이스를 연결해서 확인하려고 합니다.

1. 단말기 > PC 연결

1) 설정에 개발자 옵션이 미노출되는 경우, 설정 > 휴대전화 정보 > 소프트웨어 정보 클릭하여 진입합니다.

2) 빌드번호를 연속으로 4번 클릭해줍니다. 완료 시 설정 메뉴에 개발자 옵션이 노출됩니다.

3) 개발자 옵션 > USB 디버깅을 허용합니다.

4) 단말과 PC를 케이블로 연결 시 노출되는 USB 디버깅 허용 연결을 허용합니다.

이 단계를 생략한다면, 연결이 완료되지 않습니다! -> 세션 시작 시 아래 얼럿 노출되고 adb devices 실행 시 단말 미노출됩니다.
( 이 화면이 노출되지 않는다면 케이블을 다시 확인해보세요 > 정품 케이블이 아닌 경우에는 연결이 되지 않습니다 😂 )

터미널 > adb devices 실행 시 단말 정보가 노출되면 정상 연결된 것을 확인할 수 있습니다. 여기 디바이스 정보는 deviceName 필드에 입력해야 합니다! (R5CT31XS90T)
** 실행되지 않으면 source .bash_profile 실행

2. 단말 연결하기 > Appium Server GUI 실행 & Appium Inspector 서버 설정

Appium Server GUI을 실행 후 Appium Inspector 서버를 설정해야 합니다.
이전 포스팅 에서 세팅한 설정을 동일하게 사용해도 무관합니다.

다만, 하단의 Desired Capabilities는 실제 실행할 디바이스 / 자동화할 대상에 맞추어 변경해야 합니다.
별도 설정 없이 단말 연결만을 위해서는 가상 디바이스 연결과 동일하게 platformName / deviceName 필드만으로도 가능합니다.
adb devices로 확인한 단말 정보를 입력하고 세션을 시작하면 단말이 미러링된 것을 확인할 수 있습니다.

JSON Representation

{
  "platformName": "Android",
  "appium:deviceName": "R5CT31XS90T"
}

3. 앱 실행하기 > Appium Inspector 서버 설정

이제, 디바이스에서 Chrome 앱을 실행하도록 설정해보겠습니다.
Desired Capabilities > appPackage / appActivity / noReset 필드에 대해 알아야 합니다.

appPackage / appActivity 구하는 방법

아래 명령어 실행 시, 현재 동작하는 액티비티 중 포커스된 액티비티들을 볼 수 있습니다.

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로 입력하여 오류가 발생했습니다. 스플래시 액티비티가 포함되어 있는 어플인 경우, 스플래시 액티비티가 우선 실행되기 때문에 해당 액티비티를 입력해야 합니다.
( 스플래시 액티비티란, 인트로 화면이라고도 할 수 있는데 흔히 어플 시작 시 노출되는 회사 로고나 어플 설명이 짧게 노출되는 화면입니다. )

위에서 언급한 명령어 실행을 프로그램이 완전히 시작된 이후에 실행한 탓에 현재 포커스된 액티비티가 스플래시 이후에 노출되는 액티비티로 노출되었습니다. 정확한 값을 확인하기 위해서는 어플 시작 시 !! 명령어를 실행해야 합니다.

Reset 설정

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은 아래와 같습니다. 입력 후 세션을 시작하면 크롬이 시작된 상태로 연결됩니다.

JSON Representation

{
  "platformName": "Android",
  "appium:deviceName": "R5CT31XS90T",
  "appium:appPackage": "com.android.chrome",
  "appium:appActivity": "com.google.android.apps.chrome.Main",
  "appium:noReset": "true"
}

참고 :

profile
주니어 QA 🐥

0개의 댓글