Appium Capabilities란?

appium은 크로스 플랫폼 테스트 자동화 프레임워크입니다. 그 중에서 모바일 테스트 자동화를 중점으로 프로젝트가 발전해 왔는데요. 테스트를 자동화시에 시나리오에 따라 원하는 설정변수들이 다를텐데요. Capabilities는 이 설정변수들이라고 볼 수 있습니다.

Appium 세션을 시작하면 Appium 클라이언트는 Appium 서버에 이 Capabilities를 전달하고 Appium 서버는 클라이언트가 제어할 수 있는 Session을 생성해줍니다.

Appium Capabilities는 처음 접하는 사람에게는 이해하기 어려운 값들도 종종 있는데요. 이 부분에 대해 설명하고자 합니다.

아래 내용들은 Appium 2.0, Android는 UIAutomator2, iOS는 XCUITest driver 기준입니다.

예시

아래는 Appium Python ClientWebdriverIO 를 사용하여 Capabilities를 설정하는 예시입니다.

from appium.webdriver import Remote
from appium.options.common import AppiumOptions

options = AppiumOptions().load_capabilities(
	{
		"platformName": "Android",
        "appium:automationName": "UiAutomator2",
        "appium:udid": "R9WZ10PKDEJ",
		"appium:app": "/Users/blah/blah.apk"
        
	}
)
driver = Remote(f"http://{localhost}:{appium_server.port}", options=options)

appium-capabilities-android-example-python

from appium.webdriver import Remote
from appium.options.common import AppiumOptions

options = AppiumOptions().load_capabilities(
	{
		"platformName": "iOS",
        "appium:automationName": "XCUITest",
        "appium:udid": "880evaf7defe1fegsa0d6d4718158dafb",
		"appium:app": "/Users/blah/blah.ipa"
        
	}
)
driver = Remote(f"http://{localhost}:{appium_server.port}", options=options)

appium-capabilities-ios-example-python


공통

먼저 이 글에서는 appium 관련 기능에는 appium: 접두사를 추가해서 설명합니다. 클라이언트 라이브러리에 따라 알아서 붙여주는 경우도 있지만, 명확성을 위해 포함합니다.

platformName

테스트하고자 하는 플랫폼입니다. 필수입니다.

ex) Android, iOS, ...

browserName

기기내에 Browser를 테스트할 때 사용됩니다. Browser를 테스트하는게 아니라면 지정하지 않아도됩니다.

ex) chrome, firefox, safari, ...

appium:automationName

테스트시에 사용하는 Appium Driver의 이름입니다. 필수입니다.

Android ex) UiAutomator2, Espresso, UiAutomator1
iOS ex) XCUITest

appium:app

설치 및 실행할 애플리케이션의 경로입니다. .apk, .ipa, .zip 파일 확장자가 가능합니다.
지정하지 않을 경우 app이 설치되지 않습니다. 앱은 실행되지 않지만 appium session에 다른 명령들을 요청할 수 있습니다.

ex) /Users/~/myapp.apk

appium:udid

테스트할 기기의 고유식별자입니다. 필수로 지정하는것을 권장합니다.
Android기기의 경우 adb devices 명령어를 통해 연결된 기기의 식별자를 조회할 수 있습니다.
iOS의 경우 Xcode > Window > Devices and Simulators를 통해 나오는 기기리스트에서
Identifier의 값입니다.
브라우저에 xcdevice://showDevicesWindow 를 입력하면 바로 Devices and Simulators창을 열 수 있습니다.

Android ex) R9WZ10PKDEJ
iOS ex) 00008031-001C13E51443802E

appium:deviceName

테스트할 기기의 이름입니다. 보통 iOS 시뮬레이터를 지정하는데에 사용된다고 합니다. appium:deviceName보다는 appium:udid를 사용하여 명확히 기기를 지정하는 것을 추천합니다.

appium:platformVersion

테스트할 기기의 운영체제 버전입니다. 사용하지 않아도 테스트 진행에는 문제가 없습니다.

appium:newCommandTimeout

이전 Command(findElement, clickElement, ... )가 끝나고 새로운 Command가 올때까지에 제한시간(초)입니다.
이 시간내에 Command가 오지않으면 새로운 Command는 실패하고 Session이 종료됩니다.
기본값이 60이어서 더 긴시간을 원한다면 명확히 지정하는게 좋습니다.

ex) 300

appium:noReset

기본값으로 noReset은 false이며 appium은 reset을 시도합니다. 이때 앱 데이터가 삭제되고 테스트가 종료되면 앱도 같이 종료됩니다.

ex) true, false

appium:fullReset

앱을 제거할지 여부입니다. 기본값은 false이며 이 값을 true로 할 경우 테스트 시작전 이전에 설치되었던 앱을 삭제합니다.

ex) true, false


언어 설정

언어는 appium:language, appium:locale 둘 다 모두를 명시적으로 지정해야 의도치않게 설정되는 것을 방지 할 수 있습니다.

appium:language

테스트할 기기의 언어입니다.
ISO 639-2 Code list
에서 확인할 수 있습니다.

ex) ko, en

appium:locale

테스트할 기기의 언어와 지역입니다. Android와 iOS가 설정하는 값이 다릅니다.
locale의 리스트들은
List of Country Locale Codes
ISO 3166-1 alpha-2 codes
에서 확인할 수 있습니다.

Android ex) KR, US
iOS ex) ko_KR, en_US


병렬 테스트

하나의 PC에 연결된 여러기기를 테스트할때는 기존 설정으로는 충분하지 않습니다.

우선 하나의 appium server는 병렬테스트를 지원하지 않습니다. 테스트하고자 하는 디바이스별로 appium server를 실행하고, appium server실행시에 각기 다른 port를 지정해야합니다.

npm 으로 설치한 appium서버 실행시에는 아래와 같이 port를 지정할 수 있습니다. appium server arguments

appium -p {PORT}

아래는 병렬테스트시 설정해줘야하는 Capabilities 입니다.

appium:mjpegServerPort

Android, iOS 모두 사용합니다.

MJPEG는 Motion JPEG입니다. jpg가 이미지 파일 확장자인데요. 따라서 이미지, 영상에 관련된 기능이라는 것을 알 수 있습니다.
병렬테스트시 mjpegServerPort를 제대로 지정하지 않으면 스크린샷이나 영상을 캡쳐할 수 없거나 의도하지 않은 기기의 영상이 파일로 남게 됩니다.

기기가 연결된 PC의 port를 지정해야합니다.
병렬테스트 기기별로 다른 port를 지정해야하고 해당 port는 다른 서버가 점유하고있지 않은 port이어야 합니다.

ex) 12000

appium:systemPort

Android에서만 사용합니다.

실제 Android UI를 조작하는 UIAutomator2를 위한 서버port입니다.

기기가 연결된 PC의 port를 지정해야합니다.
병렬테스트 기기별로 다른 port를 지정해야하고 해당 port는 다른 서버가 점유하고있지 않은 port이어야 합니다.

ex) 8200

appium:chromedriverPort

Android에서 chrome web view 테스트 진행 시 사용합니다.
WebView를 테스트 하지 않는다면 지정하지 않아도 됩니다.

기기가 연결된 PC의 port를 지정해야합니다.
병렬테스트 기기별로 다른 port를 지정해야하고 해당 port는 다른 서버가 점유하고있지 않은 port이어야 합니다.

appium:wdaLocalPort

iOS에서만 사용합니다.

WebDriverAgent는 Apple이 제공하는 XCTest라는 프레임워크를 사용하여 iOS기기의 UI조작을 자동화 해주는 서버입니다. Appium은 내부에서 이 WebDriverAgent를 빌드하고 iOS 설치해주는데요. 설치된 이 WebDriverAgent와 통신을 하기위한 port입니다.
WebDriverAgent가 iOS설정에서 제일 까다로운 부분일 것 같은데요. 이 부분은 추후 다른 글에서 다루면 좋을 것 같습니다.

기기가 연결된 PC의 port를 지정해야합니다.
병렬테스트 기기별로 다른 port를 지정해야하고 해당 port는 다른 서버가 점유하고있지 않은 port이어야 합니다.

ex) 8100