2013/12/04

Jenkins 에서 Genymotion 사용하기

Genymotion은 VirtualBox를 사용하여 안드로이드 단말의 이미지를 구동시키는 방식으로 제공되는 안드로이드 Emulator의 대체품입니다. 이를 사용하면 실제 단말에서 테스트를 돌리는 속도보다 최대 10배정도는 빠르게 테스트를 진행할 수 있어 최근 개발자들에게 급속도로 퍼지고 있는 중입니다.

http://cyrilmottier.com/2013/06/27/a-productive-android-development-environment/

보통 Jenkins에서 Android Emulator plugin를 사용하면 안드로이드 에뮬레이터를 이용해 테스트를 진행하게 됩니다. 이를 Genymotion으로 대체하여 테스트에 사용할 수 있습니다.


준비

이 글에서는 개발자가 Gradle를 사용하는 빌드를 구성하였다는 가정으로 설명합니다. Jenkins 에서 Gradle를 사용하기 위해서는 Jenkins Plugin 설정에서 Jenkins Gradle plugin 을 미리 설치해주어야 합니다. 또한 Jenkins가 설치되어 있는 기기에 Genymotion이 설치 되어있는것으로 가정합니다. Genymotion을 설치하는 방법은 이곳 을 참고하세요.

Genymotion VM 생성

Genymotion UI를 통해 테스트에 사용할 VM을 생성합니다.


콘솔에서 다음과 같이 입력하여 생성된 VM의 정확한 명칭을 확인합니다.
$ VBoxManage list vms
"Galaxy S4 - 4.3 - API 18 - 1080x1920_1" {c9cfec96-e28c-4ff5-bbb0-2dbe7dad9090}
VM의 명칭이 "Galaxy S4 - 4.3 - API 18 - 1080x1920_1" 인것을 확인할 수 있습니다.
이 VM을 구동시켜 테스트 가능한 기본 상태로 만들어둡니다.

  • 앱내 NDK가 arm용 so만을 포함하고 있다면 여기에서 ARM Translation 를 설치해주세요.
  • 기본 설정시 +Sewon Ann 님이 작성하신  을 참고하면 매우 유용합니다.

이후 이 상태의 snapshot을 저장합니다.
$ VBoxManage snapshot "Galaxy S4 - 4.3 - API 18 - 1080x1920_1" take "factory"
이렇게 하면 언제든 저장된 상태로 돌아올 수 있어 동일한 테스트 환경을  유지시킬 수 있습니다.

Jenkins Job설정

일반적인 프로젝트의 Job을 추가하는 방식으로 새로운 Job을 추가합니다. 저의 경우 free-style software project를 선택했습니다. 기존에 설정된 Job이 있으면 그걸 사용하면 됩니다.


VM띄우기 설정

Build항목에 Execute shell 항목을 추가 후에 아래 내용을 추가해서 빌드전에 VM이 초기화되고 구동되도록 설정합니다.



ps | grep "Genymotion\.app/Contents/MacOS/player" | awk '{print $1}' | xargs kill
VBoxManage snapshot "Galaxy S4 - 4.3 - API 18 - 1080x1920_1" restore "factory"
/Applications/Genymotion.app/Contents/MacOS/player --vm-name "Galaxy S4 - 4.3 - API 18 - 1080x1920_1" &

"/Applications/Android Studio.app/sdk/platform-tools/adb" wait-for-device
echo "sdk.dir=/Applications/Android Studio.app/sdk" > local.properties
각 항목에 대한 설명을 아래와 같습니다.
  • ps | grep "Genymotion\.app/Contents/MacOS/player" | awk '{print $1}' | xargs kill
    • 기존에 VM이 떠있는 경우 이를 종료시킵니다. 
  • VBoxManage snapshot "Galaxy S4 - 4.3 - API 18 - 1080x1920_1" restore "factory"
    • 기존에 저장되있던 snapshot으로 상태를 복원합니다.
  • /Applications/Genymotion.app/Contents/MacOS/player --vm-name "Galaxy S4 - 4.3 - API 18 - 1080x1920_1" &
    • VM을 띄웁니다. player의 경로는 사용자의 설정에 맞게 수정해야합니다.
  • "/Applications/Android Studio.app/sdk/platform-tools/adb" wait-for-device
    • adb명령을 사용해서 VM이 뜨기를 기다립니다. adb의 경로는 sdk경로에 맞게 수정 되어야 합니다.
  • echo "sdk.dir=/Applications/Android Studio.app/sdk" > local.properties
    • sdk 경로가 Jenkins마다 다를 수 있으므로 이를 local.properties 에 저장해줍니다.

빌드 및 테스트 설정

이 글에서는 Gradle빌드를 사용하므로 Gradle 명령으로 빌드와 테스트를 수행합니다.
clean build connectedCheck

Report 설정 추가

connectedCheck의 결과는 build디렉토리내의 instrumentTest-results/connected/에 저장되므로 이를 junit repoter가 처리하도록 추가합니다.
**/build/instrumentTest-results/connected/*.xml


확인하기

빌드 후에 다음처럼 예쁘게 테스트 결과가 보이는것을 확인합니다.


이제 열심히 테스트 코드를 추가하면 됩니다. -_-;

요 글은 http://blog.genymobile.com/genymotion-jenkins-android-testing/ 을 기초로 작성되었습니다.

Post a Comment