876 정보과학회논문지 : 컴퓨팅의 실제 및 레터 제 18 권 제 12 호(2012.12) 안드로이드 애플리케이션의 UI 단위 테스트 방법 (Unit Test Method for UI of Android Applications) 윤 상 필 서 용 진 (Sangpil Yun) (Yongjin Seo) 고 민 혁 김 현 수 (Minhyuk Ko) (Hyeon Soo Kim) 요 약 세계 스마트폰 OS 시장의 절반 이상을 차지한 안드로이드는 향후 태블릿, 스마트 TV, 자동차 등으로 시 장의 확대가 전망된다. 현재 안드로이드 OS를 기반으로 수 많은 애플리케이션이 개발되고 있지만 애플리케이션의 신뢰 성을 보장하기 위한 연구들은 부족한 상태이다. 이는 안드 로이드 애플리케이션이 GUI를 기반으로 동작하기 때문에 기존의 테스트 방법을 적용하기 어렵기 때문이다. 구글에서 애플리케이션 테스트를 위한 환경을 제공하지만 개발자가 이를 활용하여 효율적인 테스트 코드를 작성하는 것은 쉽 지 않다. 이 논문에서는 안드로이드 앱 개발에서 GUI 구현 의 기본 단위인 액티비티에 대한 단위 테스트 방법을 제시 한다. 이를 위해 테스트 케이스 설계 방법과 테스트 수행 코드의 자동 생성 방법을 제안한다. 이 방법을 통해 개발자 는 쉽게 테스트 코드를 생성할 수 있으며 신뢰성 있는 앱 을 개발할 수 있을 것이다. 이 논문은 2010년도 정부(교육과학기술부)의 재원으로 한국연구재단의 기초연구사업 지원을 받아 수행된 것임(No.2010-0025329) 이 논문은 2012 한국컴퓨터종합학술대회에서 안드로이드 애플리케이션 UI 단위 테스트를 위한 테스트 케이스 설계 및 테스트 코드 자동 생성 의 제목으로 발표된 논문을 확장한 것임 학생회원 : 충남대학교 컴퓨터공학과 sambitious@naver.com yjseo082@cnu.ac.kr minhko@cnu.ac.kr 종신회원 : 충남대학교 컴퓨터공학과 교수 hskim401@cnu.ac.kr (Corresponding author임) 논문접수 : 2012년 8월 17일 심사완료 : 2012년 9월 22일 CopyrightC2012 한국정보과학회ː개인 목적이나 교육 목적인 경우, 이 저작 물의 전체 또는 일부에 대한 복사본 혹은 디지털 사본의 제작을 허가합니다. 이 때, 사본은 상업적 수단으로 사용할 수 없으며 첫 페이지에 본 문구와 출처 를 반드시 명시해야 합니다. 이 외의 목적으로 복제, 배포, 출판, 전송 등 모든 유형의 사용행위를 하는 경우에 대하여는 사전에 허가를 얻고 비용을 지불해야 합니다. 정보과학회논문지: 컴퓨팅의 실제 및 레터 제18권 제12호(2012.12) 키워드 : 안드로이드 애플리케이션, GUI 테스팅, 테스트 케이스 생성, 테스트 자동화 Abstract More than half of the world's Smartphone OS market is occupied by Android. In the future Android market will be enlarged to tablet, smart TV, car, etc. Currently, based on the Android OS, many applications are being developed. However, researches to ensure the reliability of the application are insufficient. Since the Android applications are operated through the GUI, it is difficult to apply the existing test methods. Though Google provides the test environments for applications, but it is not easy for developers to utilize them efficiently. In this paper, we propose a unit testing method for the activities which are the basic implementation unit of the GUI in Android app development. To do this, the test case design methods and the automatic creation methods of the test code are proposed. With this testing method, developers can easily generate the test code and will be able to develop the reliable apps. Key words : Android application, GUI testing, test case generation, test automation 1. 서 론 2012년 2월 가트너의 발표에 따르면 2011년 스마트폰 총 판매량은 2010년보다 58% 증가하였으며 해마다 증 가하는 추세이다. 또한 2011년 OS 시장에서 안드로이드 는 50.9%의 시장 점유율을 보였으며 애플리케이션 마켓 에서도 애플의 앱스토어에 뒤이은 수익률을 보였다[1,2]. 이와 같은 안드로이드의 빠른 성장과 마켓 시장의 확대 에 따라 수많은 애플리케이션이 개발되고 있다. 하지만 개발자 등록과 애플리케이션 배포 절차가 비교적 간단하 기 때문에 충분한 검증절차를 거치치 않은 애플리케이션 이 얼마든지 배포될 수 있다. 물론 구글에서는 애플리케 이션 테스트를 위해 테스트 프레임워크와 도구들을 제공 한다[3]. 하지만 테스트 전문지식이 없는 개발자가 이를 활용하여 테스트 케이스를 설계하고 효율적인 테스트 코 드를 작성하기란 쉽지 않다. 따라서 애플리케이션 신뢰 성을 보장하기 위한 테스트 자동화 노력이 필요하다. 안드로이드 애플리케이션은 GUI를 기반으로 동작한 다. GUI는 사용자에게 편의성을 제공하는 반면 반드시 테스트를 통해 시스템의 안전성, 견고성, 사용성이 검증 되어야 한다[4]. 특히 제한된 공간과 입력 장치를 가진 스마트폰에서는 대부분의 동작이 GUI를 통해 이뤄지므 로 GUI 테스트의 중요성이 더욱 부각된다[5]. GUI 테 스트를 위한 테스트 케이스 설계 기법에는 Record Playback 기법, 명세기반 기법, 베타 테스트 기법이 있다[6]. 현재 안드로이드 애플리케이션 테스트에 관한 연구들은 부족하며 GUI 테스트 자동화를 위해 주로 Record Play-
안드로이드 애플리케이션의 UI 단위 테스트 방법 877 back 방식 기법이 활용된다[7,8]. 하지만 테스트 케이스 생성 과정에서 사용자의 개입이 많이 요구된다. 안드로이드 애플리케이션의 GUI 테스트 자동화를 위 해서는 먼저 액티비티를 대상으로 단위 테스트가 수행 되어야 한다. 액티비티란 안드로이드 애플리케이션 GUI 구현의 핵심 컴포넌트로써 하나의 뷰(화면)에 대응된다 [3]. 이 논문에서는 액티비티에 대한 단위 테스트를 위 해 테스트 케이스 설계 방법과 이를 활용한 테스트 코 드 자동생성 방법을 제안한다. 테스트 코드 자동 생성으 로 개발자는 테스트에 대한 부담을 덜 수 있으며 신뢰 성 있는 애플리케이션을 개발할 수 있다. 2. 관련 연구 구글에서는 안드로이드 애플리케이션 테스트를 위한 테스트 프레임워크를 제공한다[3]. 테스트 프레임워크에 서 제공하는 JUnit, Mock, Instrumentation 등을 이용 하면 안드로이드 애플리케이션의 특성을 반영한 테스트 가 가능하다[5]. 테스트를 위해 개발자는 테스트 케이스 를 설계하고 이를 기반으로 테스트 코드를 작성하여 테 스트 드라이버를 구축해야 한다. 이는 개발자에게 많은 시간과 노력을 요구하는데 이를 해결하기 위한 테스트 자동화 시도들이 있었다. 연구[9]에서는 테스트 대상 애플리케이션(AUT)에 Monkey를 이용하여 이벤트를 발생시켜 테스트하며 각각의 결과를 로그 파일로 남긴다. 하지만 Monkey는 여러 이 벤트를 무작위로 발생시키는 도구이기 때문에 생성된 테스트 케이스가 액티비티의 테스트 커버리지를 만족하기 어렵다. 테스트 드로이드 레코더[8]는 Record Playback 방식으로 AUT 실행 후 애플리케이션을 사용하여 모든 발생 이벤트를 기록한다. 기록을 마치면 동일한 이벤트 들이 발생 하도록 테스트 코드를 자동 생성한다. 그러나 레코더는 사용자가 직접 테스트 케이스를 설계하고 애 플리케이션을 구동해야 하는 어려움이 있다. 우리 방법에서는 GUI 테스트를 위해 액티비티를 중 심으로 테스트 케이스를 설계하여 자동으로 테스트 코 드를 생성하는 것에 초점을 맞춘다. 그림 1 액티비티로 구성된 안드로이드 앱 해서 이벤트 핸들링 기능을 제공한다. 액티비티는 초기화 하는 시점이나 실행 도중에 인텐 트라는 메시지를 수신할 수 있다. 인텐트는 액티비티 가 수행할 액션 정보와 필요한 데이터를 담고 있으며, 이를 통해 다른 액티비티 혹은 애플리케이션 내 외부 컴포넌트와 상호작용할 수 있다. 애플리케이션을 구성하는 각각의 액티비티들은 고유의 생명주기를 지닌다. 생명주기는 사용자 이벤트에 의해 혹은 시스템 내부적 요인에 의해 변경되며 그림 2와 같이 콜백함수에 의해서 제어된다. 3. 안드로이드 액티비티 안드로이드는 GUI 구현을 위해서 액티비티를 제공한 다. 그림 1은 스마트폰의 메인 화면에서 메일 애플리케 이션을 실행하여 대화 목록을 확인하고 선택한 대화의 세부 내용을 확인하는 내용이다. 이때 안드로이드의 화 면 하나를 구현하는 기본단위를 액티비티라 하며 아래 와 같은 특징을 지닌다. 액티비티는 일반적으로 개발자가 작성한 XML 파일 을 통해서 GUI를 구성하며 각각의 UI 컴포넌트에 대 그림 2 액티비티 생명주기 4. 테스트 케이스 설계 및 테스트 코드 생성 4.1 테스트 케이스 설계 전략 액티비티는 이벤트를 처리하는 과정에서 생명주기를 갖고 적절한 상태 변화를 수반한다. 이를 기반으로 그림 3 과 같은 액티비티 상태 다이어그램을 도출할 수 있다.
878 정보과학회논문지 : 컴퓨팅의 실제 및 레터 제 18 권 제 12 호(2012.12) 표 2 테스트 시나리오 그림 3 액티비티 상태 다이어그램 그림 3에서 액티비티의 상태 변화를 유발하는 각 이벤트 에 대한 설명과 액션을 표 1에 기술하였다. 액티비티가 처 리하는 개별 이벤트들은 표 1의 이벤트 그룹으로 분류된다. 그림 3에서 정의된 상태 다이어그램과 이벤트는 하나 의 액티비티에 대한 단위 테스트를 수행하기 위해 필요 한 테스트 시나리오를 생성하는데 기준이 된다. 시나리 오 생성 시 테스트 되어야 할 대상들을 고려하여야 한 다. 테스트 대상들은 액티비티 테스트의 커버리지를 만 족하기 위한 관점으로써 다음과 같이 네 가지로 정의될 수 있다. 각각의 테스트 대상에 대한 테스트 시나리오는 표 2와 같이 정의될 수 있다. GUI 이벤트 처리: 뷰의 GUI 컴포넌트에서 발생하는 이벤트를 적절하게 처리하는지 테스트 한다. 이벤트에 따라 업데이트된 정보로 뷰를 갱신(1) 혹은 새로운 뷰로의 전환(2)이 적절히 이뤄지는지 테스트한다. 생명주기 이벤트 처리: 액티비티의 생명주기 이벤트 를 적절하게 처리하는지 테스트 한다. 액티비티 상태 변화 시 유지해야할 정보들을 적절히 유지하지 않으 면 오류가 발생한다. 따라서 발생 가능한 모든 경로에 대한 상태 변화를 테스트 한다(345). 인텐트 처리: 액티비티 초기화 시 수신하는 인텐트를 적절히 처리하는지 테스트한다. 액티비티가 초기화되 어 실행되는 세 가지 경로를 테스트 한다(678). 런타임 환경 변화 처리: 디바이스 환경 변화를 적절 히 처리하는지 테스트한다. 예를 들면 디바이스의 방 향 변경 시 뷰의 방향 변경을 위해 액티비티를 종료 ID 테스트 대상 시나리오 S1 GUI 이벤트 1 Refresh 처리 2 Fade-Out 3 Fade-Out+Return S2 생명주기 4 Fade-Out+Hide+Restart 이벤트 처리 5 Fade-Out+Hide+ ShutDown S3 S4 인텐트 처리 런타임 환경 변화 처리 6 Start 7 Fade-Out+Return 8 Fade-Out+Hide+Restart 9 Fade-Out+Hide+Shutdown+Start 후 다시 실행하게 된다. 따라서 뷰가 적절히 재구성 되는지 테스트 한다(9). 4.2 테스트 코드 생성 모듈 테스트 케이스 설계 전략을 바탕으로 구현한 테스트 코드 생성 프로그램은 세 가지 모듈로 구성된다. 1 정보 추출 모듈 테스트 코드 생성 프로그램은 세 종류의 파일을 입력 으로 받아들인다. 정보 추출 모듈에서는 파일들을 분석 하여 테스트 케이스 생성에 필요한 정보들을 추출한다. 첫 번째는 액티비티의 GUI 구성 정보를 저장한 XML 파일로부터 정보를 추출한다. UI 컴포넌트 구성정보(버 튼, 체크박스, 라디오버튼 등)와 속성정보(ID, 위치, 크 기 등)를 추출한다. 두 번째는 애플리케이션 정보를 저 장하는 Manifest 파일로부터 정보를 추출한다. 애플리 케이션 버전, 퍼미션 그리고 액티비티가 처리하는 인텐 트 정보들을 추출한다. 그림 4는 두 종류의 XML 파일 을 분석하여 트리형태로 변환하여 정보를 추출하는 과 정을 나타낸다. 세 번째는 액티비티를 구현한 자바 소스코드로부터 정보를 추출한다. 클래스 정보, 콜백 함수, 처리 이벤트, 상태 변화, 뷰의 전환 정보들을 추출한다. 소스코드는 그림 5와 같이 AST 형태로 변경하여 필요한 정보들을 추출한다. 표 1 액티비티 이벤트 그룹 이벤트그룹 설명 액션 Start 인텐트 수신 포어그라운드 실행 Refresh GUI 업데이트 포어그라운드 실행 Fade-Out 뷰 전환 백그라운드 실행 Return 인텐트 수신 포어그라운드 리턴 Hide 뷰 전환 중지 Restart 인텐트 수신 포어그라운드 실행 ShutDown 종료메시지 수신 종료 그림 4 XML 파일 정보 추출
안드로이드 애플리케이션의 UI 단위 테스트 방법 879 표 4 GUI 이벤트 테스트 케이스 생성 ID 이벤트 이벤트 시퀀스 시나리오 C1 노트 삭제 Key+ Long Click S1-1 C2 노트 추가 Menu+ Key+ Click S1-2 C3 노트 수정 Menu+ Key+ Click S1-2 C4 제목 수정 Menu+ Key+ Click S1-2 표 5 인텐트 테스트 케이스 생성 그림 5 소스코드 정보 추출 2 테스트 케이스 생성 모듈 4.1절에서 설명한 테스트 시나리오를 바탕으로 테스트 케이스를 생성한다. 생명주기 이벤트와 런타임 환경변화는 그림 6과 같이 해당 뷰의 생명주기 콜백함수를 호출할 수 있도록 테스 트 케이스를 생성한다. 생명주기 이벤트 발생 시 액티비 티 상태가 변경되면서 콜백함수가 호출되는데 이를 기 반으로 표 3과 같이 테스트 케이스를 생성한다. GUI 이벤트는 그림 7과 같이 해당 뷰의 UI 컴포넌트 에 발생시킬 이벤트, 발생 시 상태 변화를 기준으로 테 스트 케이스를 생성한다. 인텐트는 구성 요소인 액션, 카테고리, 데이터를 추출한 정보를 갖고 생성하여 각 상 태변화 경로에서 액티비티가 수신할 수 있도록 테스트 케이스를 생성한다. 표 4와 표 5는 구글에서 제공하는 노트패드 앱의 메인 액티비티에 적용한 사례이다. 3 테스트 코드 생성 모듈 안드로이드 애플리케이션 테스트 코드는 JUnit을 기 본으로 작성한다. 테스트 코드는 그림 8에서 테스트 드 라이버에 해당하며 셋업, 테스트, 티어다운 함수로 구성 ID 인텐트(액션, 카테고리, 데이터) 시나리오 C1 Main, Launcher, null S3-6 C2 View, Launcher, note DB S3-7 C3 Edit, Launcher, note DB S3-7 C4 Pick, Launcher, note DB S3-7 C5 GetContent, Default, note DB S3-8 그림 7 GUI Event와 Intent 테스트 케이스 생성 된다. 셋업 함수와 티어다운 함수는 각각 테스트 함수가 수행되기 전 후에 데이터와 리소스를 할당하고 반환하 는 역할을 한다. 테스트 함수는 테스트 케이스를 바탕으 로 직접 이벤트를 발생시켜 테스트를 수행하는 역할을 한다. 테스트 코드의 각 함수는 추출한 정보와 테스트 케이스를 바탕으로 생성한다. 그림 6 생명주기 테스트 케이스 생성 표 3 생명주기와 환경변화 테스트 케이스 생성 ID 이벤트(콜백함수 호출) 시나리오 C1 C2 C3 e()+onresume() e()+oncreate()+onstart()+onresume() e()+onstop()+ondestroy()+oncreate() S2-3 S4-9 그림 8 테스트 드라이버 구축 5. 테스트 수행 및 결과 그림 9는 테스트 코드 생성 프로그램의 UI를 나타내
880 정보과학회논문지 : 컴퓨팅의 실제 및 레터 제 18 권 제 12 호(2012.12) 며 각각의 설명은 다음과 같다. ① 입력 파일들이 로드되면 생성된 테스트 케이스를 로그의 내용과 캡쳐 파일의 이름에는 테스트 케이스 ID, 발생 이벤트 종류, 현재 상태, 기대 상태의 정보가 확인할 수 있다. 테스트 케이스의 추가, 삭제가 가능하 담겨있다. 로그는 에러발생 시 확인을 위해 기록하며 화 다. 하나의 테스트 케이스를 선택하면 발생시킬 이벤트 면 캡쳐는 JUnit을 통해 알기 어려운 이벤트 처리 결과 시퀀스 내용을 오른쪽 창에 출력한다. 를 확인하기 위한 것이다. JUnit은 각 테스트 프로시저의 ② 로드된 액티비티의 정보를 나타낸다. 클래스 정보, 성공, 실패, 에러상황을 표시하고 세부 사항을 Failure UI를 구성하는 XML 파일 정보, 구현한 콜백 함수(이벤 Trace에 기록한다. 따라서 개발자는 테스트 코드 실행 트 핸들러), 애플리케이션 정보들을 나타낸다. 후 테스트 결과를 쉽게 확인할 수 있다(그림 11). 생성된 테스트 코드를 실행하면 액티비티에 대한 테 스트를 수행할 수 있다. 표 4의 테스트 케이스 C1은 노트 삭제 후 뷰의 갱신을 테스트하기 위한 것으로 그림 10 과 같은 테스트 코드가 생성된다. 6. 결론 및 향후 연구 이 논문에서는 안드로이드 UI 단위 테스팅을 위해서 액티비티 중심의 테스트 케이스 설계 방법을 제시하였 테스트 코드의 내용을 살펴보면 먼저 현재 액티비티 다. 이를 통해 안드로이드 애플리케이션 특성을 고려한 의 상태와 이벤트 발생 후 예상되는 상태를 얻어온다. 여러 가지 GUI 테스트 요소들을 검증 할 수 있다. 테스 그 다음 해당 테스트 케이스에 대한 정보를 로그로 남 트 코드 생성 프로그램을 사용하면 제시한 방법으로 테 기고 실제 이벤트를 발생시킨 후 결과 화면을 캡쳐한다. 스트 케이스와 테스트 코드를 자동으로 생성한다. 생성 된 테스트 코드 내에 로그와 화면 캡쳐를 위한 코드도 자동으로 삽입되기 때문에 Junit과 더불어 테스트 수행 의 결과를 확인하기 쉽다. 따라서 개발자는 테스트 환경 을 구축하는데 드는 시간과 비용을 단축할 수 있으며 애플리케이션의 신뢰성을 향상시킬 수 있다. 향후에는 본 논문에서 제시한 단일 GUI 테스팅 방법 을 애플리케이션 전체로 확장하여 액티비티들의 통합적 인 테스트에 관해서 연구를 진행할 예정이다. 그림 9 테스트 코드 생성 프로그램의 UI 참 고 문 헌 그림 10 테스트 코드 그림 11 테스트 수행 결과 [ 1 ] Gartner, http://www.gartner.com/it/page.jsp?id=1924314, Feb. 2012. [ 2 ] IHS isuppli Market Research, http://www.isuppli. com, May 2011. [ 3 ] Google, "Android Developers," http://developer.android. com/index.html, 2012. [ 4 ] Atif M.Memon, "GUI Testing: Pitfalls and Process," IEEE Computer, pp.90-91, Aug. 2002. [ 5 ] K. Martin, M. Pamela, "Automated GUI Testing on the Android Platform," IMVS Fokus Report, vol.4, 2010. [ 6 ] J. G. Lee, S. H. Kuk, H. S. Kim, "Test Cases Generation Method for GUI Testing with Automatic Scenario Generation," Journal of KIISE: Software and Applications, vol.36, no.1, pp.45-53, Jan. 2009. (in Korean) [ 7 ] Y. C. Ma, E. M. Choi, "An Automatic Testing Method for Android GUI Using XML," Proc. of the KIISE Korea Computer Congress 2011, pp.102-105, 2011. (in Korean) [ 8 ] Bitbar, "Testdroid Recorder," http://testdroid.com/ product/testdroid-recorder, 2012. [ 9 ] C. X. Hu, "Automating GUI Testing for Android Applications," AST, vol.5, pp.10-17, 2011.