안드로이드 운영체제 NRE에서 단위 테스트 실행하기

Appium 연동 기능은 넥사크로플랫폼 17에서 제공하는 UIAutomation2 인터페이스를 사용해 Android NRE에서 실행하는 앱의 속성을 읽거나 쓰고 파라미터를 지정해 메소드를 실행하는 것을 지원합니다. 셀레니움 같은 UI 자동화 테스트 도구를 사용해 단위 테스트를 작성하고 테스트할 수 있습니다.

이번 장에서는 Appium를 설치하고 비주얼 스튜디오 코드에서 기본적인 Java 프로젝트를 생성해 넥사크로플랫폼 앱에 연결하는 단계를 살펴봅니다.

아래 내용은 Appium 1.19.1, 안드로이드 스튜디오 4.1.1 버전을 기준으로 작성했습니다.

Appium 연동 기능은 17.1.3.100 이후 버전에서만 지원합니다.

지원 버전이 아니라면 넥사크로플랫폼을 업데이트해주어야 합니다.

17.1.3.100 버전에서는 안드로이드 10 운영체제에서 ID로 Element를 찾는 기능이 정상 동작하지 오류를 포함하고 있습니다. 안드로이드 10 미만 운영체제에서 확인해주세요.

Appium 연동 환경 설정하기

Appium 설치하고 단말기 연결 확인하기

1

안드로이드 스튜디오와 안드로이드 SDK, JDK가 설치되어 있는지 확인합니다.

2

테스트할 단말기에 개발자 옵션을 활성화하고 아래 3개 옵션을 사용으로 체크해줍니다.

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 명령어로 확인한 단말기 일련번호

추가로 설정할 수 있는 항목은 아래 링크를 참고하세요.

http://appium.io/docs/en/writing-running-appium/caps/

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 등의 설정은 관련 문서를 참고하세요.

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

driver.findElementById("mainframe.WorkFrame.form.Button00")

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

driver.findElementByClassName("android.widget.CheckBox").click();

getText

String

-


getAttribute

String

String name


getClass

String

-


getRect

Rectangle

-


getSize

Dimension

-


getLocation

Point

-


isEnabled

Boolean

-


click

-

-


sendKeys

-

CharSequence... keysToSend

17.1.3.300 or later

TouchAction

TouchAction touch = new TouchAction(driver);

touch.longPress(PointOption.point(500,1100))

.release()

.perform();

longPress

PointOption

-


waitAction

WaitOptions

-


moveTo

PointOption

-


release

-

-


perform

-

-


Keyboard

driver.getKeyboard().sendKeys("Keyboard Input Test");

sendKeys

-

CharSequence... keysToSend


pressKey

-

CharSequence... keysToSend


releaseKey

-

CharSequence... keysToSend