본문 바로가기
Android/이것저것

[Android] Monkey Test #1

by 일상 속 둔치 2023. 2. 26.

우리는 프로그래밍을 하면서 다양한 검증을 거친다.

그 중에서 오늘 알아보고자 하는 것은 Android에서 제공하는 일종의 스트레스 테스팅 툴인 Monkey다. 트랜디한 툴은 아니지만 업무에서 사용되는 툴이길래 궁금해서 학습하는 겸 찾아보고 포스팅하게 되었다. 😊

 

Android Monkey?

 Android에서 제공하는 자동화된 앱 테스트 도구다. 단말에서 실행되는 프로그램으로 여러 시스템 레벨 이벤트 뿐만 아니라 클릭, 터치, 동작과 같은 사용자와의 상호작용을 테스트 한다.

 Monkey는 기본적으로 랜덤한 이벤트를 발생시켜서 테스트를 수행한다. 여기서 이름이 Monkey인 이유를 알 수 있다. 사람이 테스트 하는 경우 보편적으로 프로그램의 사용 시나리오를 따라가고 정확한 동작을 하는지를 알아보는 경우가 많을 것이다.

 하지만 원숭이한테 프로그램을 사용시켜보면 어떻게 될까? 사용이라고 말하기도 어색할 만큼 아무거나 눌러볼 것이다. 원숭이가 테스트 하는 것처럼 랜덤으로 이벤트를 발생시켜서 정상 동작하는지를 테스트 하는 것이 Monkey Test이다. 랜덤 이벤트를 수행하기 때문에 구체적인 테스트 시나리오를 작성하지 않고도 테스트를 수행할 수 있다.

 * 물론 Monkey에서도 Script를 사용하여 원하는 동작/시나리오를 지정할 수 있는데 해당 방법은 다음 게시글에서 좀 더 자세하게 기술하려고 한다 😊

 

왜 사용할까?

 Android 공식 문서에 나와 있는 것처럼 스트레스 테스트하기에 용이하다. Monkey는 빠른 시간에 여러 가지 터치, 스와이프 등 이벤트를 발생시키면서 일반적인 UI 테스트 상황에서는 확인할 수 없는 Edge case를 식별하는 데 유용하다.

 Monkey는 간단한 옵션들만 조합한다면 쉽게 적용할 수 있기 때문에 손쉽게 테스트를 할 수 있는 장점도 있다.

 랜덤으로 이벤트가 발생하기 때문에 우리가 알지 못하는 경우를 테스트 하는 것이 장점이기도 하거나와...단점이기도 하다. 정작 문제가 발생해도 문제 재현 경로를 파악하기가 어렵기 때문이다.

 * 실제 부서에서 사용하는 것을 보니 Monkey test를 통해 init 되지 않은 객체에 접근 했다던가 간혹 view의 focus를 잡지 못하는 경우 등을 발견한 적이 있었다. 다만 이 경우에도 전후 사정을 알지 못하니 실패한 지점에서 코드 상으로 점검을 해야했던 것으로 보인다.

 

Monkey 기본 사용법

* adb를 사용해서 테스트 할 수 있기 때문에 환경만 갖춰진다면 빌드 서버에서 빌드하면서 자동으로 수행되게 할 수도 있다

 

 1) 명령어 기본 구성

adb를 사용해서 실행한다. 따라서 옵션들만 좀 익히면 쉽게 사용할 수 있다.

- 기본 구성 옵션 (e.g 시도할 이벤트 수)

- 작업 제약 조건 (e.g 테스트를 단일 패키지로 제한)

- 이벤트 유형 및 실행 빈도 (e.g 터치 이벤트를 수행)

- 디버깅 옵션 (e.g 타임 아웃)

 

 2) 기본 구문

adb shell monkey [options] <event-count>

테스트를 진행할 패키지명을 기술하지 않으면 모든 패키지에 이벤트를 전송한다. 따라서 본인이 원하는 패키지를 옵션에 적어주자.

adb shell monkey -p package.name -v 1000

 

-p 옵션으로 테스트를 할 package를 지정해주고, -v 옵션으로 세부 정보가 표시되게 지정, 마지막으로 이벤트가 수행될 횟수를 지정해주었다.

 

Monkey 옵션

자세한 내용은 api 문서 참고

카테고리 옵션 설명
일반 --help 도움말
-v 테스트에 관한 세부정보 제공 (1번쓰면 레벨1, 2번쓰면 레벨2)
이벤트 -s <seed> 같은 시드값으로 Monkey를 실행하면 동일한 이벤트 시퀀스 생성
--throttle <milliseconds> 이벤트 사이 고정 지연 시간 삽입
--pct-touch <percent> 터치 이벤트 비율 조정
--pct-motion <percent> 모션 이벤트 비율 조정
--pct-trackball <percent> 트랙볼 이벤트 비율 조정
--pct-nav <percent> 기본 탐색 이벤트 비율 조정 (위/아래/왼쪽/오른쪽)
--pct-majornav <percent> 주요 탐색 이벤트 비율 조정 (메뉴 키와 같이 ui 내 작업 발생)
--pct-syskeys <percent> 시스템키 이벤트 비율 (홈, 돌아가기 등)
--pct-appswitch <percent> startActivity 호출
--pct-anyevent <percent> 이외 이벤트 비율 조정
제약조건 -p <allowed-package-name> 특정 패키지만 엑세스 (여러 패키지면 -p 옵션을 여러번)
-c <main-category> 시스템이 지정된 카테고리 중 하나와 함께 나열된 activity만 방문
디버깅 --dbg-no-events  
--hprof 이벤트 시퀀스 직전/직후에 프로파일링 보고서 생성
--ignore-crashes crashe가 발생해도 중지되지 않고 진행
--ignore-timeouts 타임 아웃 무시하고 계속 실행
--ignore-security-exceptions 권한 오류 무시하고 실행
--kill-process-after-error 시스템 오류 발생한 프로세스를 중지
--monitor-native-crashes 비정상 종료를 감시하고 보고
--wait-dbg 디버거가 연결될 때까지 Monkey 중지

 

Monkey 실습

adb devices로 단말이 연결되었는지 확인한다. 간혹 mtp 모드 설정이 안되어 있으면 unauthorized라고 뜬다

adb 사용법도 나중에 한번 정리해야겠다


help로 도움말을 봤는데 developer 문서에 없는 옵션들도 보인다 😂


1) 테스트 하고 싶은 패키지를 적어주고 ( -p com.ilsang.spyfall )

2) 500ms마다 이벤트 발생하고 ( --throttle 500 )

3) 터치 이벤트를 50% 비중을 두고 ( --pct-touch 50 )

4) 이벤트 상세 내용을 2레벨로 보고 싶고 ( -v -v)

5) 50번 이벤트를 발생 시키겠다 ( 50 )


event가 어떤 비중으로 실행되었는지 보여준다. 각 index가 어떤 이벤트인지 좀 확인해봤는데 아래와 같다.

* adb 버전에 따라서 좀 다를 수 있을 것 같다. 아래는 adb 31.0.3 기준이다

(오랜만에 보니까 옛날 버전이네)

0 : touch

1 : motion

2 : pinchzoom

3 : trackball

4 : rotation

5 : permission

6 : nav

7 : majornav

8 : syskeys

9 : appswitch

10 : filp

11 : anyevent

 


-v 옵션을 줘서 어떤 이벤트가 발생 했는지 로그로 보여준다.

Monkey는 특정 button을 누르는게 아니라 특정 좌표에 이벤트를 발생시키는 느낌이라 어디 터치했는지 좌표가 보인다.


 포스팅하려고 여러 번 테스트를 돌려봤는데 아래처럼 exception을 발견했다!

 

옛날에 심심해서 토이 프로젝트 삼아서 만들었던 앱인데 역시..뭔가 빵꾸난 부분이 있었던 것 같다.

포스팅에는 도움이 되니...오히려 좋았다(?)

 

 500번 이벤트가 100ms마다 수행되었는데, 이벤트가 무작위로 수행되면서 터치가 되는 모습을 볼 수 있고 마지막에는 앱이 죽는데 NPE 때문에 강제 종료되었다

--ignore-crashes 옵션을 줬다면... 계속 실행되었을까...

 


 간단하게 Monkey를 사용해보았다. 위에서 잠깐 언급했지만 이렇게 무작위로 이벤트를 발생시키는 것이 아니라 테스트 시나리오를 구성해서 수행할 수도 있다.

 

 스크립트 파일을 만들어서 옵션에 넣어주면 되는데, 내가 못찾은건지 모르겠지만 api 문서에 없는 것 같다. 그래서 구글 코드를 좀 해석하면서 포스팅을 해보고자 한다. 이건... 다음 게시글에서 다루어 보겠다.


https://developer.android.com/studio/test/monkey?hl=ko

 

UI/Application Exerciser Monkey  |  Android 개발자  |  Android Developers

Monkey는 에뮬레이터나 기기에서 실행되는 프로그램으로 여러 시스템 레벨 이벤트뿐만 아니라 클릭, 터치, 동작과 같은 사용자 이벤트의 의사 랜덤 스트림을 생성합니다.

developer.android.com

댓글