Appium 연동 기능은 넥사크로에서 제공하는 UIAutomation2 인터페이스를 사용해 Android NRE에서 실행하는 앱의 속성을 읽거나 쓰고 파라미터를 지정해 메소드를 실행하는 것을 지원합니다. 셀레니움 같은 UI 자동화 테스트 도구를 사용해 단위 테스트를 작성하고 테스트할 수 있습니다.
이번 장에서는 Appium를 설치하고 비주얼 스튜디오 코드에서 기본적인 Java 프로젝트를 생성해 넥사크로 앱에 연결하는 단계를 살펴봅니다.
아래 내용은 Appium 1.19.1, 안드로이드 스튜디오 4.1.1 버전을 기준으로 작성했습니다.
Appium 연동 환경 설정하기
Appium 설치하고 단말기 연결 확인하기
1
안드로이드 스튜디오와 안드로이드 SDK, JDK가 설치되어 있는지 확인합니다.
2
테스트할 단말기에 개발자 옵션을 활성화하고 아래 3개 옵션을 사용으로 체크해줍니다.
USB debugging
Install via USB
USB debugging (Security settings)
3
테스트를 진행할 PC에 Appium 설치파일을 내려받고 설치합니다.
https://github.com/appium/appium-desktop/releases/latest
4
단말기와 PC를 USB 케이블을 사용해 연결합니다.
5
adb 명령어로 연결된 단말기 일련번호를 확인합니다.
아래에서는 "0a388e93"이 연결된 단말기 일련번호입니다.
$ adb devices List of devices attached 0a388e93 device usb:1-1 product:razor model:Nexus_7 device:flo
6
테스트할 단말기에 넥사크로 앱을 설치합니다.
앱 빌드 시 Package Name은 "nexacro", Program Name은 "TEST0120"으로 설정했습니다.
7
PC에서 Appium을 실행합니다.
8
[Start Server] 버튼을 클릭해 Appium 서버를 시작합니다.
윈도우 운영체제 환경이라면 Host 설정을 "127.0.0.1"로 변경합니다.
9
[Start Inspector Session] 버튼을 클릭해 Appium Inspector 창을 띄웁니다.
10
[Custom Server] 탭에서 JSON Representaion 항목을 아래와 같이 입력합니다.
{ "platformName": "Android", "platformVersion": "10", "appPackage": "nexacro.TEST0120", "appActivity": ".MainActivity", "automationName": "UIAutomator2", "autoGrantPermissions": "true", "deviceName": "0a388e93" }
항목 | 설명 (굵게 표시한 항목은 고정값) |
---|---|
platformName | "Android" |
platformVersion | 테스트할 단말기 운영체제 버전 |
appPackage | 테스트할 앱 (빌드 시 설정한 값) [Package Name].[Program Name] 형식 |
appActivity | 앱 빌더로 빌드한 경우에는 ".MainActivity" 안드로이드 스튜디오에서 빌드한 경우에는 설정한 액티비티 |
automationName | "UIAutomator2" |
autoGrantPermissions | "true" |
deviceName | adb 명령어로 확인한 단말기 일련번호 |
추가로 설정할 수 있는 항목은 아래 링크를 참고하세요.
11
[Start Session] 버튼을 클릭합니다.
최초 실행 시에는 단말기에 Appium Settings 앱이 설치됩니다.
12
테스트할 단말기에서 앱이 실행되고 Appium Inspector 창에 앱이 실행된 상태가 표시되는지 확인합니다.
테스트 프로젝트 실행 환경 설정하고 테스트하기
1
Visual Studio Code를 설치합니다.
2
사이드바에서 Extensions를 선택하고 Java Extension Pack을 설치합니다.
3
프로젝트 실행에 필요한 appium, selenium, testng 라이브러리를 설정합니다.
Maven, Gradle, Eclipse plug-in 등의 설정은 관련 문서를 참고하세요.
client-combined-3.141.59.jar (https://www.selenium.dev/downloads/)
byte-buddy-1.8.15.jar
commons-exec-1.3.jar
guava-25.0-jre.jar
okhttp-3.11.0.jar
okio-1.14.0.jar
testng-7.3.0.jar (https://testng.org/doc/download.html)
jcommander-1.78.jar
java-client-7.4.1.jar (https://github.com/appium/java-client)
commons-lang3-3.11.jar (https://commons.apache.org/proper/commons-lang/)
4
Java Project를 생성하고 BaseClass.java 파일을 아래와 같이 작성합니다.
package tests; import java.net.MalformedURLException; import java.net.URL; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; public class BaseClass { AndroidDriver<MobileElement> driver; final String URL_STRING = "http://127.0.0.1:4723/wd/hub"; @BeforeTest public void setup() { System.out.println("setup"); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("automationName", "UiAutomator2"); capabilities.setCapability("platformName", "Android"); capabilities.setCapability("platformVersion", "10"); capabilities.setCapability("deviceName", "0a388e93"); capabilities.setCapability("autoGrantPermissions", "true"); capabilities.setCapability("appPackage", "nexacro.TEST0120"); capabilities.setCapability("appActivity", ".MainActivity"); try { driver = new AndroidDriver<MobileElement>(new URL(URL_STRING), capabilities); } catch (MalformedURLException e) { System.out.println("MalformedURLException"); e.printStackTrace(); } catch (Exception e) { System.out.println("Exception"); e.printStackTrace(); } } @Test public void sampleTest() { System.out.println("sampleTest"); } @AfterTest public void teardown() { System.out.println("teardown"); driver.close(); } }
5
사이드바에서 Test를 선택하고 BaseClass 항목에 있는 [Run] 버튼을 클릭합니다.
6
테스트할 단말기에서 앱이 실행되고 DEBUG CONSOLE에 정상적으로 테스트 성공 메시지가 표시되는 것을 확인합니다.
단위 테스트 만들고 실행하기
1
넥사크로 앱을 아래와 같이 수정하고 업데이트합니다.
상단에 Button 컴포넌트를 배치하고 그 아래에 Edit 컴포넌트를 배치합니다.
Button 컴포넌트의 onclick 이벤트 핸들러 함수를 아래와 같이 작성합니다.
this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo) { this.Edit00.set_value("BUTTON CLICK"); };
2
Tests.java 파일을 아래와 같이 작성합니다.
package tests; import java.net.MalformedURLException; import java.util.concurrent.TimeUnit; import org.testng.annotations.Test; public class Tests extends BaseClass { @Test public void testOne() throws MalformedURLException, InterruptedException { System.out.println("testOne"); int nTestSpeed = 2000; driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); driver.findElementById("mainframe.WorkFrame.form.Button00").click(); Thread.sleep(nTestSpeed); } }
3
사이드바에서 Test를 선택하고 Tests 항목에 있는 [Run] 버튼을 클릭합니다.
4
테스트할 단말기에서 앱이 실행되고 Button 클릭 이벤트가 정상적으로 처리되어 Edit 컴포넌트의 값이 변경되는지 확인합니다.
지원 인터페이스
Method | Return | Argument | Requirement |
---|---|---|---|
AndroidDriver
| |||
findElement | WebElement | By by | |
findElementById | WebElement | String id | |
findElementByName | WebElement | String using | |
findElementByClassName | WebElement | String using | |
findElementByXPath | WebElement | String using | |
getKeyboard | Keyboard | - | |
pressKeyCode | - | AndroidKeyCode | |
WebElement
| |||
getText | String | - | |
getAttribute | String | String name | |
getClass | String | - | |
getRect | Rectangle | - | |
getSize | Dimension | - | |
getLocation | Point | - | |
isEnabled | Boolean | - | |
click | - | - | |
sendKeys | - | CharSequence... keysToSend | |
TouchAction
| |||
longPress | PointOption | - | |
waitAction | WaitOptions | - | |
moveTo | PointOption | - | |
release | - | - | |
perform | - | - | |
Keyboard
| |||
sendKeys | - | CharSequence... keysToSend | |
pressKey | - | CharSequence... keysToSend | |
releaseKey | - | CharSequence... keysToSend |