Firebase: Robo Test

Test Lab 2016. 6. 15. 18:16



Firebase: Robo Test


Firebase는 앱 개발을 위한 실시간 데이터베이스, 사용자 인증 및 호스팅 기능을 제공하는 서비스에서

Google에서 인수한 후 앱(Android, iOS, 모바일 웹)을 위한 통합 앱 플랫폼으로 확장되었다.


Firebase에서는 앱 개발을 위한 기능 뿐만 아니라 분석, 관리, 마케팅등을 위한 기능들이 다수가 포함되어 있다.

- Firebase Overview Google I/O 2016[1]

- Firebase Features[2]


본 포트스에서는 Firebase의 앱 자동화 테스트 기능인 "Robo Test"에 대해서 살펴보려고 한다. 

- Google Cloud Test Lab for Robo Test[3]

- Firebase Test Lab for Android Robo Test[4]


테스트를 위한 대상 앱을 회사에서 개발한 "On-ly 앱"을 테스트 해보기로 결정하였다.

On-ly는 "스마트 게임 만보계"

1) On-ly를 설치한다.

2) 평소대로 스마트폰(게임)을 사용한다.

3) 내가 스마트폰으로 게임을 얼마나 어떤 패턴으로 하는지 궁굼하면 On-ly에서 살펴본다.

와 같은 간단한 컨셉을 바탕으로 개발되었다.

- On-ly 앱[5] 



1. On-ly 테스트 Coverage

테스트를 진행해 보기에 앞서, Robo Test가 "어디까지 테스트를 해줄 수 있을까? 또는 이런것도 테스트가 가능할까?"에 대해서 생각을 해보았다.


1) 게임 플레이 시간 수집

앞서 설명한 바와 같이, On-ly는 사용자의 게임 플레이 시간을 수집하여 정보를 제공하는 앱이다. 게임 플레이 시간 수집을 테스트하기 위해서는, "a) 게임이 설치되어 있어야하고, b) On-ly가 설치되어 있어야 한다. c) 게임을 일정시간(5분이상) 실행한 후, d) On-ly를 실행해야 한다."와 같이 타 앱과의 연계가 필요하다.


2) Facebook 연동(로그인 기능)

부가 기능(친구 데이터 공유, 데이터 persistency등)을 위해 Facebook 연동을 제공하고 있다. 만약, Robo Test에서 로그인이 가능하다면 서버에 저장된 데이터를 사용하여, UI 테스트가 가능하다.


3) 전체 페이지(State) 테스트

사용자가 접할 수 있는 On-ly의 총 페이지(State)는 43개이다. 43개는 동일한 기능(상세 팝압)은 1개의 페이지로 고려하였을때 확인된 수치이다. 실제로는 더많은 페이지를 접하게 된다. 이번 테스트에서는 전체 중 몇%의 페이지를 Robo Test가 테스트 할 수 있는지를 확인하려고 한다.

(* 페이지별 세부 테스트 또는 페이지의 연계성을 고려한 테스트는 고려하지 않음)

<On-ly 페이지별 스크린샷>


4) 시스템 권한

On-ly는 게임 모니터링을 위해, "android.permission.PACKAGE_USAGE_STATS" 시스템 권한이 필요하다.(*Android 5.1, Lollipop 부터 시스템 권한으로 변경됨)

시스템 권한은 앱을 설치후 사용자가 직접 안드로어드 OS 설정 페이지에서 권한을 추가해야 한다. 즉, 테스트시 안드로이드 OS와의 연계가 필요하다.

<PACKAGE_USAGE_STATS 시스템 권한 획득과정>


당연히 내부에서 테스트를 진행할 시 위 4가지만을 고려하는 것은 아니다. 더 많은 항목을 테스트 해야 한다. 단, 본 테스트에서는 Robo Test로 큰 틀에서 어느 범위까지 테스트가 가능한지를 확인하기 위해 위 4가지 항목으로 정해보았다.


2. Robo Test 실행

Test Lab을 사용하기 위해서는 Firebase가입 및 카드 등록이 필요하다. 시간당 $5로, 테스트 장비 대여 및 관리 비용이라고 생각하면 비싼 가격은 아니라고 생각된다.

<Firebase Pricing[6]>




2.1. 프로젝트 만들기

프로젝트는 Firebase console에서 "새 프로젝트 만들기"로 생성할 수 있다. 해당 프로젝트로 이동하면, 좌측 DEVELOP -> Test Lab을 확인할 수 있다.

<새 프로젝트 만들기>


2.2. 테스트 실행

메뉴의 DEVELOP -> Test Lab을 선택하고, "테스트 실행 -> Robo 테스트 실행"을 선택한다.

<Robo Test 실행>


테스트할 앱(On-ly)의 APK를 업로드한 후 "계속"을 선택한다.

<앱 선택(APK 업로드)>



테스트 실행 단계에서 가장 복잡한단계로, [실제기기, API수준, 방향, 언어, 고급 옵션1, 고급 옵션2]6개의 측정기준을 선택하는 단계이다.  "테스트의 개수 = 실제기기 수 x API수준 수 x 방향 수 x 언어 수"로 결정된다. 본 예제는 1x3x1x1=3으로 3개의 테스트를 진행한다.


고급 옵션은

1) 테스트 제한시간: 테스트를 실행할 최대 시간(분)으로, 기본은 5분으로 설정되어 있다.

2) 최대 깊이: Robo 테스트에서 앱 UI의 특정 분기를 얼마나 깊이 탐색한 후 UI 루트(기본 화면)로 돌아가서 다른 분기를 탐색할지를 결정합니다.

으로 기본값으로 테스트 하였다.

<측정기준 선택>



테스트가 모두 완료되면 아래와 같은 결과를 확인할 수 있다. 모두 통과 하였다. 이제 상세 결과를 확인해 보자.

<테스트 매트릭스>



3. Robo Test 결과 확인

3.1. 테스트 결과 항목

테스트 결과는 

a)로그: Device에서 발생한 level별 로그

b)스크린샷: 테스트를 진행한 페이지의 스크린샷 목록

c)활동 지도: 테스트를 진행한 과정의 activity diagram[7]형태의 diagram

d)동영상: 테스트를 진행한 과정이 녹화된 동영상

으로 구성되어 있다.


<테스트 결과 화면>


3.2. 결과 확인

"1. On-ly 테스트 Coverage"에서 생각해 보았던 내용을 충족시킬 수 있는지를 확인해 보자.

1) 게임 플레이 시간 수집 (테스트 할 수 없음)

"2.2. 테스트 실행"에서 확인한 바와 같이, 테스트 대상 앱 이외의 앱은 설치가 불가능 하다.


2) Facebook 연동 (실패 테스트만 가능)

테스트 Input에 사용자 데이터가 없다. 즉, 로그인 Action을 수행(테스트)할 수 는 있지만 로그인 성공에 대한 테스트는 불가능 하다.  아래 "활동 지도"에서 "Facebook 로그인" 페이지에서 실패를 반복하고 있다. 또한, 이로인해  테스트 시간을 모두 소비하여 다른 페이지는 테스트를 진행하지 못한것으로 판단된다.

<활동 지도 결과>


3) 전체 페이지(State) 테스트 (약 79%는 테스트 하지 못함)

Facebook 로그인을 실패한 페이지의 중복을 제거하면, 9개의 페이지를 테스트 하였다. On-ly의 전체 페이지(49) 중 약 21%의 페이지만을 테스트한 것이다. 


또한, 로그인 실패(수집된 데이터가 없는경우)한 경우만 확인을 하면 전체 17페이지 중 약 53%의 페이지만을 테스트 하였다.

<스크린샷 결과>


4) 시스템 권한 (테스트 하지 못함)

API 22(Lollipop)에서 새로 추가된 PACKAGE_USAGE_STATS를 위한 시스템 권한 획득에서 더이상 진행되지 않았다.  

<API 22 테스트의 활동 지도 결과>




4. 마치며

어찌보면 당연한 결과일지 모른다. 또는, Firebase에서 Robo Test의 사용목적과 부합하지 않는 테스트만 진행한 것 일 수도 있다. 그러나, 만약, 모두 자동으로 잘 테스트 되어 진다면 얼마나 좋을까?라는 생각을 해보았다.(누군가는 허황된 꿈? 이라고 할 수 있을 것이다)

최근 자동화 앱 테스트(Automated App Test) 또는 자동화 테스트 입력 생성(Automated Test Input Generation)에 대한 연구 자료들을 보기 시작했다. 자료들에서도 Robo Test와 동일한 컨셉으로 연구를 진행하고 있다[9-12].
a)Android Activity분석 -> b)분석 결과를 model(Finite State Machine[8])화 -> c)Model의 최적화(learning algorithm, heuristics 등을 이용) -> d) 테스트 입력 생성(Test Input Generation)
연구 자료를 보면서 전체는 아니더라도 지금보다는 더 나은 방향으로 갈 수 있지 않을까 생각해 보았다.

*본 글은 절대로 Firebase의 Robo Test를 비판 또는 평가하기 위한 목적으로 작성되지 않았습니다.


References

[1] Firebase Overview Google I/O 2016, https://www.youtube.com/watch?v=tb2GZ3Bh4p8

[2] Firebase Features[2], https://firebase.google.com/features/ 

[3] Google Cloud Test Lab for Robo Test, https://developers.google.com/cloud-test-lab/robo-ux-test

[4] Firebase Test Lab for Android Robo Test, https://firebase.google.com/docs/test-lab/robo-ux-test

[5] On-ly 앱, https://play.google.com/store/apps/details?id=com.embian.only

[6] Firebase Pricing, https://firebase.google.com/pricing/

[7] Activity Diagram Wiki, https://en.wikipedia.org/wiki/Activity_diagram

[8] Finite State Machine Wiki, https://en.wikipedia.org/wiki/Finite-state_machine

[9] Guided GUI Testing of Android Apps with Minimal Restart and Approximate Learning, http://www.cs.berkeley.edu/~necula/Papers/swifthand-oopsla13.pdf

[10] MobiGUITAR – A Tool for Automated Model-Based Testing of Mobile Apps, https://scholar.google.co.kr/scholar?q=A+Tool+for+Automated+Model-Based+Testing+of+Mobile+Apps&btnG=&hl=ko&as_sdt=0%2C5&as_vis=1

[11] Reducing Combinatorics in GUI Testing of Android Applications, https://seal.ics.uci.edu//wp-content/uploads/seal/PID4096715.pdf

[12] A GUI State Comparison Technique for Effective Model-based Android GUI Testing,https://scholar.google.co.kr/scholar?q=A+GUI+State+Comparison+Technique+for+Effective+Model-based+Android+GUI+Testing&hl=ko&as_sdt=0&as_vis=1&oi=scholart&sa=X&ved=0ahUKEwj6gMbo16nNAhXj3aYKHW5TA1sQgQMIGjAA



Posted by 알 수 없는 사용자
,