반응형

제목: 안드로이드 애플리케이션을 위한 GUI 테스팅 자동화(Automating GUI Testing for Android Applications)

저자: Cuixiong Hu 1, 미국

문서유형: 컨퍼런스 페이퍼( 7페이지), 2011

 

구글 안드로이드 플랫폼에서 동작하는 모바일 애플리케이션에서 주로 발생되는 버그(특히 GUI 관련 버그)를 조사하고, 이러한 버그를 효과적으로 발견 가능한 자동 테스트 방법을 제안한 자료



안드로이드 애플리케이션의 버그 분석

  • Android Market(안드로이드 애플리케이션 공식 저장소)에서 버그를 조사할 애플리케이션 10개를 선정. 애플리케이 선별 시 인기가 많은지(다운로드 건수), 수명이 오래되었는지(릴리즈 일자), 상세한 버그 기록을 보유하고 있는지, 소스 코드가 가용한지(오픈 소스 애플리케이션)를 고려하여 선정
  • 선정된 애플리케이션의 버그 데이터베이스를 분석한 결과 애플리케이션 로직상의 버그도 있지만 안드로이드 고유의 특성에 관련된 버그(, 안드로이드 애플리케이션의 액티비티와 이벤트로 인한 버그)들도 존재

애플리케이션

설명

버그 카테고리

액티비티

이벤트

타입

예외미처리

API

I/O

병행성

기타

Skylight1

자바 모바일 프로젝트 프레임워크

3

2

0

1

0

0

0

4

CMIS

CMIS 저장소 검색 브라우저

0

0

0

2

0

0

0

6

Delicious

Delicious 소셜 북마킹 서비스로 북마크 저장

0

0

0

0

1

0

0

4

ConnectBot

안전한 원격 서버 접속용 셀 클라이언트

2

8

2

5

1

3

1

57

DealDroid

거래 사이트의 거래 모니터링 및 알림

1

1

0

0

0

0

0

8

Rokon

2D 게임 엔진

0

6

2

3

0

4

0

14

Andoku

스도쿠 형식 퍼즐게임

0

0

0

0

0

0

0

1

Opensudoku

스도쿠 게임

1

1

0

0

0

0

0

5

GuessTheNumber

숫자 추측 게임

1

1

0

0

0

0

0

0

MonolithAndroid

OpenGL 기반 3D게임

0

2

0

0

2

0

0

3

[분석 대상 안드로이드 애플리케이션의 버그 카테고리]


선정된 10개 안드로이드 애플리케이션의 버그를 카테고리 별로 분류한 결과가 위 표와 같다.

  • 액티비티 에러: 안드로이드 애플리케이션의 주요 GUI 컴포넌트인 액티비티의 프로토콜을 부정확하게 구현하여 발생
  • 이벤트 에러: 이벤트를 받은 애플리케이션이 잘못된 액션으로 반응할 때 발생
  • 동적 타입 에러: 런타임 타입 예외 상황(runtime type exceptions)으로 인해 발생
  • 예외상황 미처리(Unhandled exceptions): 사용자 코드가 예외 상황을 캡쳐하지 못해 결과적으로 애플리케이션 충돌(an application crash) 발생하는 경우
  • API 에러: 애플리케이션이 가정한 API 버전과 시스템이 제공하는 API 버전간의 불화합성(incompatibilities)으로 인해 발생
  • I/O 에러: I/O 인터액션(, 파일 또는 카드 접근 에러)으로 인해 발생
  • 병행성 에러(Concurrency errors): 다수의 프로세스나 쓰레드간의 인터액션 때문에 발생
  • 기타 에러: 프로그램 로직 관련 에러


안드로이드 플랫폼 개요

아래 그림처럼 안드로이드 플랫폼은 4계층으로 구성된다. 안드로이드 애플리케이션 각각은 고유의 사용자 IDDalvik 가상 머신(VM) 카피에서 돌아간다.

  • 애플리케이션 계층: 가장 상단에 위치
  • 애플리케이션 프레임워크 계층: 상단의 애플리케이션에 서비스(, 액티비티 통제, 데이터 접근 통제, 콘텐츠 제공)를 제공
  • 라이브러리/VM 계층: 정적 라이브러리(공통 시스템/애플리케이션 라이브러리 제공)와 안드로이드 런타임 환경(코어 런타임 라이브러리, 안드로이드에 최적화된 자바 가상 머신인 Dalvik 가상 머신)을 포함
  • OS: 가장 하단에 리녹스 커널이 위치

[안드로이드 플랫폼의 아키텍쳐]


안드로이드 애플리케이션 컴포넌트 개요

안드로이드 애플리케이션은 아래 4개의 컴포넌트 카테고리로 구성된다.

  • 액티비티(Activity): 사용자 인터액션이 진행되는 포커스된 윈도우. 한번에 한 개의 액티비티만이 활성화된다. 각 액티비티는 소스 코드 상의 하나의 클래스이며, 사용자와 시스템에 의해 발생된 이벤트에 따라 동작한다.
  • 방송 수신기(Broadcast Receiver): 방송을 청취하고 반응한다(, 배터리가 낮다는 알림을 이메일 클라이언트가 수신하면 작성중인 이메일을 저장).
  • 콘텐츠 제공자(Content Provider): 특정 애플리케이션을 위한 데이터를 관리하고 데이터 접근을 통제
  • 서비스 제공자(Service Provider): 서비스는 백그라운드에서 돌아감(, 사용자가 다른 애플리케이션을 동작시키는 동안 이메일 클라이언트는 새 메일을 체크)



안드로이드 애플리케이션 테스트 방법

  • 본 논문은 위에서 분석한 안드로이드 버그 유형 중 GUI 버그(액티비티 에러, 이벤트 에러, 타입 에러)를 효과적으로 찾는 자동 테스트 방법을 제안
  • 제안된 방법은 먼저 JUnit을 사용하여 테스트 케이스를 생성하고 자동 이벤트 생성 도구인 Monkey를 사용하여 일련의 이벤트 순서를 생성하여 테스트 대상 애플리케이션에 실행시킨다. 테스트 케이스 실행의 상세 정보는 가상 머신 인스트루멘테이션을 통해 시스템 로그 파일에 기록되고, 이 로그 파일을 분석하여 버그를 찾는다.

[제안된 테스트 방법 개괄도]


1) 테스트 케이스 생성(Test Case Generation)

  • 안드로이드 애플리케이션에서는 액티비티가 주요 입력 지점(entry point)이고 통제 흐름 드라이버이므로 테스트 케이스 생성도 액티비티를 기준으로 한다. , 애플리케이션의 모든 액티비티를 식별하고, JUnitActivity Testing 클래스를 사용하여 각 액티비티의 테스트 케이스를 생성한다.
  • JUnit은 자바 애플리케이션용 테스팅 프레임워크로 안드로이드 개발 환경에 통합되어 있다. JUnit은 애플리케이션 소스 코드를 기반으로 테스트 케이스 클래스를 생성할 수 있다.
  • 이렇게 개발된 Activity TestingAndroid SDK에 포함되어 출시되며, JUnit과 함께 동작하여 아래의 3가지 테스트를 수행한다.
    -
    일차 조건 테스팅(Initial condition testing): 액티비티가 제대로 생성되었는지 테스트
    - GUI
    테스팅: 액티비티가 GUI 명세에 따라 동작하는지 테스트
    -
    상태 관리 테스팅(State management testing): 애플리케이션이 특정 상태에 제대로 진입할 수 있고 또한 빠져나올 있는지 테스트


2) 자동 이벤트 생성(Automatic Event Generation)

  • Android Market의 대부분의 애플리케이션이 GUI 기반이므로 애플리케이션을 한 상태(state)에서 다른 상태로 이동하게 만들기 위해 각 테스트 케이스에 사용자 인터액션을 흉내 내는 이벤트 추가가 필요할 수 있다.
  • GUI 애플리케이션을 검증하는 효과적인 방법인 자동 이벤트 생성은 애플리케이션의 현재 상태에서 허용 가능한 이벤트 집합을 벗어나는 일련의 이벤트 순서(Event sequences)를 적용하여 GUI 버그를 발견한다.
  • GUI 이벤트 생성을 돕기 위해 Android SDK에 포함되어 있는 자동 이벤트 생성 도구인 몽키 이벤트 생성기(Monkey event generator)를 사용하여 일련의 이벤트 순서들을 생성하고 이를 테스트 대상 애플리케이션에 적용한다.


3) 실행 추적 생성(Trace Generation)

  • 테스트 케이스가 생성되면 Dalvik VM을 통해 테스트 대상 애플리케이션에 실행시킨다. 이 때 테스트 케이스 실행 상세 정보를 추적 파일(a trace file)에 남기도록 VM을 구성하여 GUI 이벤트, 메쏘드 호출(method calls), 예외 상황(exceptions)의 세 종류의 이벤트를 캡쳐한다. 또한 VM이 조기 종료되도록 만드는 애플리케이션 버그를 발견하기 위해 VM 오퍼레이션을 모니터 한다.
  • 애플리케이션 프로그램을 추적하기 위해 Dalvik VM에 있는 인스트루멘테이션 도구를 활용


4) 로그 파일 분석과 버그 발견(Log File Analysis and Bug Detection)

  • 생성된 테스트 케이스를 애플리케이션에 실행한 결과를 기록한 로그 파일을 분석하여 버그를 식별한다. 액티비티 에러, 이벤트 에러, 타입 에러 각각은 관련 에러 패턴(아래 자세히 설명)을 가지는데, 로그 파일에서 이런 패턴을 조사하여 적절한 오퍼레이션인지 버그인지를 식별한다.
  • 로그 파일은 버그로 이어지는 메쏘드 및 이벤트 추적(method and event traces) 정보를 포함하고 있으므로 버그 식별뿐만 아니라 디버깅에도 유용하다.


액티비티 버그 발견(Detecting Activity Bugs)

  • 액티비티 버그는 Activity 클래스를 잘못 구현해서 발생(, 아래 그림 같은 Active, Pause, Stop, Restore, Destroy 등으로 변경되는 액티비티 상태 머신을 따르지 않는 경우)

[안드로이드 액티비티의 단순화된 상태 머신]


  • 정확한 상태 순서(, StartàActiveàPauseàRestoreàActiveàDestroy)를 보장하기 위해서는 이에 상응하는 사용자 정의 메쏘드를 상태 머신에 정의된 적절한 순서로 호출해야 한다. , 경우에 onCreate()àonPause()àonResume()àonDestroy()의 메쏘드 호출이 이루어져야 한다.
  • 아래 로그 파일은 ConnectBot 애플리케이션에서 식별된 액티비티 버그의 예이다. 라인1 onCreate()가 있지만 라인3 이전에 이어지는 onPause()가 없어 상태 머신 명세를 위반하고 있다.

  • 위 액티비티 버그는 사용자가 디폴트 셀 호스트(a default shell host)을 미리 셋업 한 후 애플리케이션을 시작하여 결과적으로 애플리케이션 크래시가 발생하는 상황으로, 핸드셋에서 아래 그림 같은 에러 메시지가 디스플레이 된다.


이벤트 버그 발견(Detecting Event Bugs)

  • 안드로이드 애플리케이션의 액티비티는 어떤 상태에 있든지 이벤트를 받으면 이에 적절하게 반응해야 한다. 특정 상태에서 이벤트 핸들러가 구현되지 않은 경우 애플리케이션이 부적절한 상태로 빠지거나 크래시가 발생한다.
  • 아래 로그 파일 예는 ConnectBot 애플케이션에서 Monkey가 생성한 특정 이벤트(HOME 버튼 클릭)를 처리하는 이벤트 핸들링 코드가 없어 크래시가 발생한 상황이다.


타입 에러 발견(Detecting Type Errors)

  • 타입 에러가 발생되면 로그 파일에 ClassCastException이 나타나므로 식별하기가 쉬움
  • 아래 로그 파일은 ConnectBot 애플리케이션에서 나타난 타입 에러의 예이다.

반응형

+ Recent posts