모바일 테스팅 프레임워크 - Appium

모바일 테스팅 프레임워크

어플리케이션에 기능이 추가됨에 따라 테스트 해야할 기능들이 너무 많아진다. 하지만, 테스트를 제대로 하지 않아 나중에 에러를 발견하게 되면 그게 더 큰 문제가 된다. 기능의 추가, 수정 등의 변화로부터 앱이 안정적인 품질을 유지하는 것은 굉장히 중요하다. 테스트를 하는 건 중요하지만, 매번 같은 기능에 대해 버튼을 클릭하고 값을 확인하는 것은 번거로운 짓이다. Appium을 통해서 모바일 UI 자동화 테스트를 구현해보고자 하였다.

Appium 이란?

Appium은 Android, iOS의 2가지 모바일 플랫폼을 지원한다. (link)

Appium 동작 방식

Appium_archi

  1. Client는 JSON Wire 프로토콜을 사용해 Appium 서버와 통신합니다.
  2. Appium 서버는 테스트하는 디바이스의 OS에 맞게 명령을 전송합니다.
  3. 디바이스는 명령을 수행 후 Appium 서버에 응답을 보냅니다.
  4. Appium 서버는 콘솔에 결과 처리합니다.

Appium 설치

테스트 프로젝트 생성

테스트 케이스 구현을 위해 Python 프로젝트를 생성하였습니다. 테스트 코드 작성을 위해 unittest 프레임워크를 이용하여 진행하였습니다.
파이썬 코드 상에서 Appium 서버와 연결하고 명령을 보내기 위해서는 다음의 패키지 설치가 필요합니다.

pipenv install Appium-Python-Client

테스트 코드 실행에 앞서 appium 서버와 연결이 필요합니다. 테스트할 플랫폼, 디바이스명, 앱 패키지명, 액티비티명 등을 지정해줘야 합니다. capabilities에 대한 정보는 여기에서 확인 가능합니다.

appium_driver = webdriver.Remote(
                command_executor="http://127.0.0.1:4723/wd/hub",
                desired_capabilities={
                    'app': '~/dev/wabi.apk',
                    'platformName': 'Android',
                    'platformVersion': 10,
                    'deviceName': app_info['device_name'],
                    'automationName': 'Appium',
                    'appPackage': cls.app_id,
                    'appActivity': app_info['app_activity'],
                    'autoGrantPermissions': true,
                })

코드 구현

다음 코드는 android의 seekbar를 이동시킨 후 확인을 누르는 예제입니다.

    def test_tap_seekbar_and_button(self):        
        seekbar = self.appium_driver.find_element_by_id("seekbar")

        end = seekbar.seekbar.get('width')
        ypos = age_seekbar.location.get('y')

        self.assertLogs("end value : {}, y value : {}".format(end, ypos))

        touch_action = TouchAction(self.appium_driver)
        touch_action.tap(seekbar, end, ypos).perform()

        time.sleep(5)

        start_button = self.appium_driver.find_element_by_id("button_start")
        touch_action.tap(start_button).perform()

        time.sleep(5)

여담

Unity로 구현된 Android/iOS 앱의 경우 appium을 통해서 object의 id를 가져올 수 없습니다. 통으로 이미지로 인식되기 때문입니다. Unity 앱으로 UI 테스트를 할 수 있는 방법은 2가지가 있습니다.

  1. OpenCV를 통한 이미지 템플릿 매칭
  2. AltUnity를 이용한 UnityObject 인식

OpenCV의 경우 찾고자 하는 요소에 대해 각 디바이스 별로 템플릿을 만들어야 하기 때문에 시간도 걸리고 복잡합니다. AltUnity의 경우 Unity 앱에 패키지를 설치하고 앱이 일종의 tcp 서버가 되어 클라이언트와 통신합니다. public으로 오픈되어 있는 객체를 id를 통해 접근할 수 있기 때문에 편리합니다.