androidテスティング実践2 システムテスト編

64
Androidテスティング実践 ②システムテスト編

Upload: -ntt

Post on 22-Jan-2018

1.705 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Androidテスティング実践2 システムテスト編

Androidテスティング実践

②システムテスト編

Page 2: Androidテスティング実践2 システムテスト編

本スライドは、NTTソフトウェア社内技術者育成研修(ソフト道場研修)テキストです。

【著作権・免責事項】

本セミナーコースの内容、本資料のすべての著作権は、NTTソフトウェア株式会社に帰属します。

無断での本資料の複写、複製、再利用、転載、転用を禁じます。

本資料と演習等で利用するすべての教材は、NTTソフトウェア株式会社からの保証なしに提供されます。

本書に記載されている会社名および製品名は、一般に各社の商標または登録商標です。

56

※ 演習問題に関するスライドは、一部を除き、本ファイルには含まれておりません。また、演習に必要なソースコードも含まれておりません。ご了承ください。

Copyright © 2016, NTT Software Corporation.

Page 3: Androidテスティング実践2 システムテスト編

2. システムテストの自動化 この研修で紹介するツールの使い分け

Robotium (座学+演習)

Espresso (座学+演習)

UI Automator (座学+演習)

Appium (座学)

57Copyright © 2016, NTT Software Corporation.

Page 4: Androidテスティング実践2 システムテスト編

この研修で紹介するツールの使い分け

画面単位のホワイトボックステストがしたい

Espresso

1アプリ内複数画面にまたがるブラックボックステストがしたい

Robotium・UI Automator・Appium

複数アプリにまたがる(ブラックボックス)テストがしたい

UI Automator: 1テストケース内でEspressoと併用OK

Appium: Selenium WebDriver経験者向け。iOSもテストOK

58Copyright © 2016, NTT Software Corporation.

Page 5: Androidテスティング実践2 システムテスト編

59

Robotium

Copyright © 2016, NTT Software Corporation.

Page 6: Androidテスティング実践2 システムテスト編

【Robotium】概要

UIテストを容易に自動化できるフレームワーク

ブラックボックステスト向け

Android 2.2以上対応

Instrumented Testとして実装

URL: https://github.com/RobotiumTech/robotium

Apache License 2.0

Copyright © 2016, NTT Software Corporation. 60

https://github.com/RobotiumTech/robotium よりロゴを引用

Page 7: Androidテスティング実践2 システムテスト編

【Robotium】おすすめポイント

ネイティブアプリ・WebView両方ともテストできる

WebView対応はAndroid 4.0以降

テストシナリオの書き方が直感的で分かりやすい

画面のレイアウトヒエラルキーを気にせず、見た目だけで書ける。

「OKと表示されたButtonを押せ」

「画面上から6番目のEditTextに"Hello"と入力せよ」

etc.

複数画面(Activity)にまたがるテストができる

61Copyright © 2016, NTT Software Corporation.

Page 8: Androidテスティング実践2 システムテスト編

【Robotium】注意点

Google公式ではない

Android最新バージョンへの追随が遅いことも

Androidの非公開APIを利用して実装されている

機種によっては動作しない可能性あり

うまく動かない場合はFAQ参照

https://goo.gl/nbWkTA

複数アプリにまたがったテストができない

Copyright © 2016, NTT Software Corporation. 62

Page 9: Androidテスティング実践2 システムテスト編

【Robotium】環境設定

ATSLの設定に加えて、app/build.gradleに以下を追加

63

dependencies {

// ATSLの設定は省略

androidTestCompile ¥

'com.jayway.android.robotium:robotium-solo:5.5.4'

}

Copyright © 2016, NTT Software Corporation.

Page 10: Androidテスティング実践2 システムテスト編

【Robotium】テストコードの書き方: setup

64

@RunWith(AndroidJUnit4.class)

public class MyRobotiumTest {

// ActivityTestRuleの宣言は省略

@Rule

public ActivityTestRule<...> activityTestRule = ...;

private Solo solo;

@Before

public void setUp() throws Exception {

solo = new Solo(InstrumentationRegistry.

getInstrumentation(),

activityTestRule.getActivity());

}

Robotiumの主要クラスSoloをインスタンス化する

Copyright © 2016, NTT Software Corporation.

Page 11: Androidテスティング実践2 システムテスト編

【Robotium】テストコードの書き方: tear down

65

...

@After

public void tearDown() throws Exception {

solo.finishOpenedActivities();

}

}

Solo#finishOpenedActivities()を呼び出す

Copyright © 2016, NTT Software Corporation.

Page 12: Androidテスティング実践2 システムテスト編

【Robotium】テスト用APIの紹介: 概要

Javadoc

http://recorder.robotium.com/javadoc/

Soloクラス

全てのテスト用APIは、Soloクラスのメソッドに集約

Copyright © 2016, NTT Software Corporation. 66

Page 13: Androidテスティング実践2 システムテスト編

【Robotium】テスト用APIの紹介: 文字列指定操作

UI部品の表示文字列(正規表現)を指定してクリック

67

solo.clickOnText("Dialog");

solo.clickOnButton("Text Entry dialog");

「.」「+」「*」などのメタキャラクタはエスケープが必要

Copyright © 2016, NTT Software Corporation.

Page 14: Androidテスティング実践2 システムテスト編

【Robotium】テスト用APIの紹介: 位置指定操作

UI部品の番号を指定してクリック

68

solo.clickInList(4);

リストの4行目(1始まり)をクリック

index 7(0始まり)のボタンをクリック

solo.clickOnButton(7);

Copyright © 2016, NTT Software Corporation.

Page 15: Androidテスティング実践2 システムテスト編

【Robotium】テスト用APIの紹介: 文字列取得・入力

表示文字列の取得・テキスト入力

69

メソッド(Soloクラス) 概要

searchText(String) 指定された正規表現にマッチする文字列を表示しているUI部品を探す。見付かればtrueを返す。

enterText(int, String) 指定されたindex(0始まり)に存在するEditTextに対して、指定された文字列を入力する。

getText(String) 指定された正規表現にマッチする文字列を表示しているTextViewを返す。

getEditText(int) 指定されたindex(0始まり)に存在するEditTextを返す。

画面のどこにでも良いから文字列が表示されているか確認する場合はsearchText()が便利

特定のViewに表示されている文字列を確認する場合は、getText()・getEditText()でTextView・EditTextを取得してからTextView#getText()・EditText#getText()を使う

Copyright © 2016, NTT Software Corporation.

Page 16: Androidテスティング実践2 システムテスト編

【Robotium】テスト用APIの紹介: そのほか

そのほか

70

メソッド(Soloクラス) 概要

assertCurrentActivity(String, Class)

現在の画面が指定されたActivity(クラス)であることをassertする。

takeScreenshot() 画面のスクリーンショットを撮る。/sdcard/Robotium-Screenshots/に保存。

clickOnWebElement(By) 指定された検索条件(Byオブジェクト)に合致したWebView内HTML部品をクリックする。

typeTextInWebElement(By, String)

指定された検索条件(Byオブジェクト)に合致したWebView内HTML部品(フォーム)に対して、指定された文字列を入力する。

※スクリーンショットを撮る場合は、テスト対象アプリ側に、以下のパーミッション宣言が必要

<uses-permission android:name=

"android.permission.WRITE_EXTERNAL_STORAGE" />

Copyright © 2016, NTT Software Corporation.

Page 17: Androidテスティング実践2 システムテスト編

【Robotium】演習2-2

Robotiumを使って、以下のテストシナリオを実現してください。

1つめのEditTextに「5」を入力する

2つめのEditTextに「8」に入力する

「この画面に表示」ボタンをクリックする

画面のどこかに「13」と表示されることを確認する

テストクラス名: RobotiumTest

参考スライド

①基礎編【演習1-1】ATSLのための設定

【Robotium】環境設定

【Robotium】テストコードの書き方

【Robotium】テスト用APIの紹介: 表示文字列の取得・テキスト入力

71Copyright © 2016, NTT Software Corporation.

Page 18: Androidテスティング実践2 システムテスト編

72

Espresso

Copyright © 2016, NTT Software Corporation.

Page 19: Androidテスティング実践2 システムテスト編

【Espresso】概要

Google謹製の、ホワイトボックステスト向けUIテストフレームワーク

コードの簡潔さ、信頼性の高さに定評有り

APIレベル8, 10, 15-19, 21に対応

概ねAndroid 2.2以上(3.x除く)

Instrumented Testとして実装

URL: https://goo.gl/x8eP5C

https://goo.gl/lmrlJI

Apache License 2.0

Copyright © 2016, NTT Software Corporation. 73

https://google.github.io/android-testing-support-library/docs/espresso/cheatsheet/index.html よりロゴを引用

Page 20: Androidテスティング実践2 システムテスト編

【Espresso】おすすめポイント

Google謹製なので最新バージョンへの素早い追随が期待できる

Google社内で実際に使われている

テスト結果もRobotiumより安定

ネイティブアプリ・WebView両方ともテストできる

テストシナリオの書き方がシンプル

比較的実行速度が速い

74Copyright © 2016, NTT Software Corporation.

Page 21: Androidテスティング実践2 システムテスト編

【Espresso】注意点

複数Activityにまたがったテストができない

複数アプリにまたがったテストもできない

APIが独特なので学習コストが高い

75Copyright © 2016, NTT Software Corporation.

Page 22: Androidテスティング実践2 システムテスト編

【Espresso】環境設定

ATSLの設定に加えて、app/build.gradleに以下を追加

76

dependencies {

// ATSLの設定は省略

androidTestCompile ¥

'com.android.support.test.espresso:espresso-core:2.2.2'

}

モジュール名:バージョン 概要

espresso-intents:2.2.2 別Activity起動時に発行するIntentを確認できる起動元Intentのモックを作成できる

espresso-web:2.2.2 WebView内部をテストできる

以下の追加モジュールもあり(詳細は省略)

Copyright © 2016, NTT Software Corporation.

Page 23: Androidテスティング実践2 システムテスト編

【Espresso】テストコードの書き方: setup/tear down

77

@RunWith(AndroidJUnit4.class)

public class MyEspressoTest {

@Rule

public ActivityTestRule<...> activityTestRule = ...;

...

}

ATSLのための準備だけでOK

Copyright © 2016, NTT Software Corporation.

Page 24: Androidテスティング実践2 システムテスト編

【Espresso】テスト用APIの紹介: 概要

78

概要

ViewMatcher Viewの検索条件を指定する。ViewMatchersクラス参照。

withId(), withClassName(), withText(), ...※hamcrestのallOf(), not(), is(),なども使える

ViewAction Viewに対する操作を指定する。ViewActionsクラス参照。

clearText(), typeText(), click(), ...

ViewAssertion 確認条件を指定する。ViewAssertionsクラス参照。

doesNotExist(), matches(ViewMatcher), ...

onView(ViewMatcher).perform(ViewAction).check(ViewAssertion);

以下の基本形を理解する

※perform(), check()は省略可 「ViewMatcher」にあてはまるViewに対して

「ViewAction」を実行した結果 そのViewが「ViewAssertion」

を満たすことを確認する

Copyright © 2016, NTT Software Corporation.

Page 25: Androidテスティング実践2 システムテスト編

【Espresso】テスト用APIの紹介: 概要

Javadoc

http://goo.gl/UwGTdf(android.support.test.espresso.*パッケージ)

Espresso Cheat Sheet

https://goo.gl/6xcuqd

以下の3クラスが重要android.support.test.espresso.matcher.ViewMatchers

android.support.test.espresso.action.ViewActions

android.support.test.espresso.assertion.ViewAssertions

Copyright © 2016, NTT Software Corporation. 79

Page 26: Androidテスティング実践2 システムテスト編

【Espresso】テスト用APIの紹介: ViewMatchers

検索条件を表すメソッドが定義されている

80

メソッド 概要

withId(int) 指定されたIDを持つView

withText(String) 指定されたテキストが表示されているView

withContentDescription(String) 指定されたcontentDescription属性を持ったView

withClassName(Matcher<String>) 指定されたクラス名のView※引数には「is(クラス名)」を指定する

hamcrestのmatcherを使うこともある(CoreMatchers)

allOf(条件1, 条件2, ...)

anyOf(条件1, 条件2, ...)

is()

not()

Copyright © 2016, NTT Software Corporation.

Page 27: Androidテスティング実践2 システムテスト編

【Espresso】テスト用APIの紹介: ViewActions

onView()で特定したViewに対する操作を表すメソッドが定義されている

81

メソッド 概要

click() クリックする

pressBack() 戻るキーを押す(どのViewに対して実行しても同じ)

typeText(String) 指定された文字列を入力する

scrollTo() onView()で指定されたViewまでスクロールする

Copyright © 2016, NTT Software Corporation.

Page 28: Androidテスティング実践2 システムテスト編

【Espresso】テスト用APIの紹介: ViewAssertions

onView()で特定したViewに対してチェックするメソッドが定義されている

82

メソッド 概要

doesNotExist() そのViewが存在しないことを確認する

matches(Matcher) そのViewが、引数で指定した条件を満たしていることを確認する

maches()の引数には、任意のViewMatchersが指定できる

テキスト"text"が表示されているか確認するmatches(withText("text"))

Viewが画面に表示されていることを確認するmatches(isDisplayed())

Copyright © 2016, NTT Software Corporation.

Page 29: Androidテスティング実践2 システムテスト編

【Espresso】実例紹介(1/2)

TextView (IDはR.id.textview)に"Hello"と表示されていることを確認する。

83

onView(withId(R.id.textview))

.check(matches(withText("Hello")));

"Press Me"と書かれているボタンを押す。

onView(withText("Press Me")).perform(click());

"Hello"と書かれているボタンを押す。ただし、"Hello"と書かれているTextViewも存在。

onView(allOf(withClassName(is(Button.class.getName())),

withText("Hello")))

.perform(click());

Copyright © 2016, NTT Software Corporation.

Page 30: Androidテスティング実践2 システムテスト編

【Espresso】実例紹介(2/2)

EditText (IDはR.id.input)に"Hello"と入力してからソフトウェアキーボードを閉じる。

84

onView(withId(R.id.input))

.perform(typeText("Hello"), closeSoftKeyboard());

画面外にあるかも知れない"Press Me"と書かれているボタンを押す。

onView(withText("Press Me"))

.perform(scrollTo(), click());

※perform()の引数に複数ViewActionを並べると、左から順番に実行する。

Copyright © 2016, NTT Software Corporation.

Page 31: Androidテスティング実践2 システムテスト編

【Espresso】そのほかの応用的な機能

AdapterView (ListViewなど)の中身を検索したいとき

onView()の代わりにonData()を使うhttps://goo.gl/UFhj8h

WebViewの中身を検索したいとき

Espresso-Webを使う。APIも異なる。https://goo.gl/X3hu4K

そのほかいろいろ

「Espresso Advanced Samples」https://goo.gl/RN3vOc

Copyright © 2016, NTT Software Corporation. 85

Page 32: Androidテスティング実践2 システムテスト編

【Espresso】演習2-3

Espressoを使って、以下のテストシナリオを実現してください。

1つめのEditTextに「5」を入力する

2つめのEditTextに「8」に入力する

「この画面に表示」ボタンをクリックする

「結果:」の右にあるTextViewに「13」と表示されることを確認する

テストクラス名: EspressoTest

参考スライド

①基礎編【演習1-1】ATSLのための設定

【Espresso】環境設定

【Espresso】テストコードの書き方

【Espresso】テスト用APIの紹介

86Copyright © 2016, NTT Software Corporation.

Page 33: Androidテスティング実践2 システムテスト編

87

UI Automator

Copyright © 2016, NTT Software Corporation.

Page 34: Androidテスティング実践2 システムテスト編

【UI Automator】概要

Google謹製の、ブラックボックステスト向けUIテストフレームワーク

別アプリにまたがったテストができる他人が作ったアプリやプリインアプリでもOK

Android 4.3以上に対応安定性の面でAndroid 5.0以上が無難

Instrumented Testとして実装

Espressoと混ぜて使うのもOK

URL: https://goo.gl/6ZFz89

Apache License 2.0

Copyright © 2016, NTT Software Corporation. 88

Page 35: Androidテスティング実践2 システムテスト編

【UI Automator】おすすめポイント

3rd-party製アプリの試験ができる

apkが無くても試験可能

Espressoと共用できる

89Copyright © 2016, NTT Software Corporation.

Page 36: Androidテスティング実践2 システムテスト編

【UI Automator】注意点

できることが限定されている

UI部品の操作と状態確認、表示文字列確認に限定

Instrumentation対象のアプリ以外が持つインスタンス(ActivityやViewなど)へのアクセス不可

明示的に同期を取る必要がある

EditTextに入力した直後だと、まだ入力された文字列が取得できないことも。

同じ目的のAPIが複数ある(動作仕様や、できることが微妙に違う)

UiObject: スクロールサポート充実。同期系APIが貧弱。

UiObject2: スクロールサポートなし。柔軟な同期系API。

90Copyright © 2016, NTT Software Corporation.

Page 37: Androidテスティング実践2 システムテスト編

【UI Automator】環境設定

ATSLの設定に加えて、app/build.gradleに以下を追加

91

dependencies {

// ATSLの設定は省略

androidTestCompile ¥

'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

}

Copyright © 2016, NTT Software Corporation.

Page 38: Androidテスティング実践2 システムテスト編

【UI Automator】テストコードの書き方

92

@RunWith(AndroidJUnit4.class)

public class MyUiautomatorTest {

@Rule

public ActivityTestRule<...> activityTestRule = ...;

private UiDevice uiDevice;

@Before

public void setUp() throws Exception {

uiDevice = UiDevice.getInstance(InstrumentationRegistry

.getInstrumentation());

}

...

}

ATSLの設定に加えてUiDeviceオブジェクトの初期化が必要

Copyright © 2016, NTT Software Corporation.

Page 39: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 検索(1/2)

条件にあったUI部品を検索する

93

UiObject uiObject = uiDevice.findObject(<検索条件1>)

// または

UiObject2 uiObject = uiDevice.findObject(<検索条件2>)

検索条件1はUiSelectorオブジェクトで表現

//検索条件1

new UiSelector().text("OK").className(Button.class)

検索条件2はBySelectorオブジェクトで表現

//検索条件2

By.text("OK").clazz(Button.class)

Copyright © 2016, NTT Software Corporation.

Page 40: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 検索(2/2)

94

UiSelector検索条件 (UiObject向け)

メソッド 概要

className(Class) Viewのクラス(EditTextやButtonなど)を条件に指定する

text(String) Viewの表示文字列を条件に指定する

description(String) ViewのcontentDescription属性値を条件に指定する

resourceId(String) ViewのリソースID(文字列表現)を条件に指定する

BySelector検索条件 (UiObject2向け)

メソッド 概要

clazz(Class) Viewのクラス(EditTextやButtonなど)を条件に指定する

text(String) Viewの表示文字列を条件に指定する

desc(String) ViewのcontentDescription属性値を条件に指定する

res(String) ViewのリソースID(文字列表現)を条件に指定する

Copyright © 2016, NTT Software Corporation.

Page 41: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: UiObject系

UiObject/UiObject2で同名のメソッド

95

メソッド 概要

click() クリックする

setText(String) 指定された文字列を入力する

getText() 設定されている文字列を取得する

isFocused() フォーカスが当たっているかどうかを取得する

Copyright © 2016, NTT Software Corporation.

Page 42: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: UiObject系

96

「OK」ボタンをクリックする例

// UiObjectを使う場合

UiObject okButton =

uiDevice.findObject(new UiSelector().text("OK").

className(Button.class));

okButton .click();

// UiObject2を使う場合

UiObject2 okButton2 =

uiDevice.findObject(By.text("OK").clazz(Button.class));

okButton2.click();

Copyright © 2016, NTT Software Corporation.

Page 43: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 同期系(1/4)

UiObjectを使うときはUiObjectのメソッドを呼ぶ

97

メソッド(引数はタイムアウト値) 概要

clickAndWaitForNewWindow(long) クリックしてから、新しい窓(ダイアログなど)が表示されるまで待つ

waitForExists(long) このViewが表示されるまで待つ

// 「OK」ボタンを押して、ダイアログが表示されるまで待つ

UiObject okButton =

uiDevice.findObject(new UiSelector().text("OK").

className(Button.class));

// ダイアログが表示されるまで2000msec待つ。タイムアウト時はテスト失敗。

assertThat(okButton.clickAndWaitForNewWindow(2000L), is(true));

// ここから表示されたダイアログに対する操作を行う

サンプルコード

※タイムアウトした場合は、falseが返される

Copyright © 2016, NTT Software Corporation.

Page 44: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 同期系(2/4)

UiObject2は以下の汎用的なメソッドを使う

98

メソッド(引数は条件とタイムアウト値) 概要

clickAndWait(EventCondition, long)

クリックしてから、指定された条件が満たされるまで待つ

wait(SearchCondition, long)※UiObject2とUiDeviceの両方に存在

指定された条件が満たされるまで待つ

wait(UiObject2Condition, long) 指定された条件が満たされるまで待つ

良く使う「条件」はUntilクラスに用意されている

Untilクラスのstaticメソッド 概要

newWindow() 新しい窓(ダイアログ)が表示されるまで

textEquals(String) 表示文字列が引数で指定された通りになるまで

gone(BySelector) 条件に合致するViewが見付からなくなるまで

※タイムアウトした場合は、null/0/falseが返される

Copyright © 2016, NTT Software Corporation.

Page 45: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 同期系(3/4)

99

サンプルコード

// 「OK」ボタンを押して、ダイアログが表示されるまで待つ

UiObject2 okButton2 =

uiDevice.findObject(By.text("OK").clazz(Button.class));

// ダイアログが表示されるまで2000msec待つ

boolean result = okButton2.clickAndWait(Until.newWindow(),

2000L);

// タイムアウトしたときはテストを失敗させる

assertThat(result, is(true));

// ここからダイアログの操作などを行う

Copyright © 2016, NTT Software Corporation.

Page 46: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 同期系(4/4)

同期APIを使えば使うほど遅くなる!

使いすぎ注意!

独立した複数のボタンやテキストボックスを連続操作するような場合は同期不要

同期APIの使いどころ

一連の操作による、画面の変化を確認したい場合→確認する直前で同期する

ある操作によって画面遷移・ダイアログ表示が発生する場合→その操作の直後に同期する

100Copyright © 2016, NTT Software Corporation.

Page 47: Androidテスティング実践2 システムテスト編

【UI Automator】テスト用APIの紹介: 検索契機

いつ部品を検索しに行くか?

UiObject系の場合

操作メソッド(click()など)呼び出し時に検索する

見付からなかったらUiObjectNotFoundException

同じ検索条件なら、複数画面で使い回しOK

UiObject2系の場合

findObject(BySelector)呼び出し時に検索する

見付からなかったらnullが返される

画面レイアウトが変わるとUiObject2は無効になる→StaleObjectException

101Copyright © 2016, NTT Software Corporation.

Page 48: Androidテスティング実践2 システムテスト編

【UI Automator】インスペクタの利用

Viewの検索条件は、画面の見た目だけでは分からない

調査ツール uiautomatorviewer を使う

1. Android Device Monitor起動

2. [Devices]タブで調査したいデバイスを選ぶ

3. uiautomatorボタンを押す

102Copyright © 2016, NTT Software Corporation.

Page 49: Androidテスティング実践2 システムテスト編

【UI Automator】Tips: UiScrollable

スクロールすれば現れる画面外の要素を操作できる

103

// 標準ホームアプリのアプリ一覧から、画面外にある

//「足し算アプリ」アイコンをタップして起動する。

UiScrollable appViews

= new UiScrollable(new UiSelector().

scrollable(true));

// スクロール方向を水平方向に設定

appViews.setAsHorizontalList();

// "足し算アプリ"アプリを起動する

UiObject myApp

= appViews.getChildByText(new UiSelector().

className(TextView.class),

"足し算アプリ");

myApp.clickAndWaitForNewWindow();

Copyright © 2016, NTT Software Corporation.

Page 50: Androidテスティング実践2 システムテスト編

【UI Automator】Tips: 日本語入力

UiObject/UiObject2クラスのsetText(String)メソッドAndroid 5.0以上: 日本語入力OK

Android 4.4以下: 指定できるのはASCII文字のみ

Android 4.4以下で日本語を使う場合は専用のIMEを使う

UIAutomator Unicode Input Helperhttps://github.com/sumio/uiautomator-unicode-input-helper

Copyright © 2016, NTT Software Corporation. 104

// 上記IMEをインストールした状態で実行する。

// 「&」が含まれていないASCII文字の入力は今まで通り

UiObject editText = uiDevice.findObject(...);

editText.setText("Thank you");

// それ以外の文字を入力する時はUtf7ImeHelper.e()で文字列をラップする

editText.setText(Utf7ImeHelper.e("ありがとう"));

Page 51: Androidテスティング実践2 システムテスト編

【UI Automator】演習2-4

UI Automatorを使って、以下のテストシナリオを実現してください。

1つめのEditTextに「5」を入力する

2つめのEditTextに「8」に入力する

「この画面に表示」ボタンをクリックする

「結果:」の右「13」と表示されることを確認する

テストクラス名: UiautomatorTest

UiObject2系のAPIを使ってください

リソースIDの文字列表現はuiautomatorviewerで調べましょう

105Copyright © 2016, NTT Software Corporation.

Page 52: Androidテスティング実践2 システムテスト編

106

Appium

Copyright © 2016, NTT Software Corporation.

Page 53: Androidテスティング実践2 システムテスト編

【Appium】概要

Copyright © 2016, NTT Software Corporation. 107

End2End UIテストフレームワーク

Android 2.3.3以上/iOS 6.0以上両対応

別アプリにまたがったテストができる

Selenium WebDriverと同様にテストが書ける

URL: http://appium.io/

Apache License 2.0

https://github.com/appium よりロゴを引用

Page 54: Androidテスティング実践2 システムテスト編

【Appium】アーキテクチャ

Copyright © 2016, NTT Software Corporation. 108

http://www.atmarkit.co.jp/ait/articles/1504/27/news025.html より引用

Appiumサーバ: クライアント-テスト対象端末間のプロキシとして動作

テストスクリプトのプログラム言語は色々選べる

Page 55: Androidテスティング実践2 システムテスト編

【Appium】おすすめポイント

Selenium WebDriver経験者にとって学習コストが低い

テストスクリプトの言語を選べる

Ruby, Python, Java, ...

ネイティブ・WebViewどちらもテスト可能

Android・iOS両方とも同じようなコードでテストが書ける

簡単にインストールできるGUI版が配布されている

(Mac/Windows)

109Copyright © 2016, NTT Software Corporation.

Page 56: Androidテスティング実践2 システムテスト編

【Appium】注意点

アーキテクチャの性質上、実行速度が遅い

公式ドキュメントが最新化されていない・少ない

Appium 1.3.4向けの日本語解説記事あり@IT「SeleniumのUIテスト自動化をiOS/AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方」http://www.atmarkit.co.jp/ait/articles/1504/27/news025.html

テスト対象アプリのAndroidバージョンや、WebView利用有無によって、テストスクリプトの書き方が変化する

書きはじめる前に確認が必要

Copyright © 2016, NTT Software Corporation. 110

Page 57: Androidテスティング実践2 システムテスト編

【Appium】Appium Desktop Appのインストール

Appium ServerのGUI版

ダウンロードページhttps://bitbucket.org/appium/appium.app/downloads/

インストーラを実行するだけでOK

Android開発環境と同一PCにインストールすること

動作に必要なソフトウェア

.NET Framework 4.5再配布可能パッケージ (Windowsのみ)

JDK7以上

Android SDK

Copyright © 2016, NTT Software Corporation. 111

Page 58: Androidテスティング実践2 システムテスト編

【Appium】テストプロジェクトのセットアップ

(Androidではない)通常のJavaプロジェクト

EclipseやIntelliJ IDEAなどで。

build.gradle

112

apply plugin: 'java'

// JavaソースコードのエンコーディングをUTF-8とする。

def defaultEncoding = 'UTF-8'

tasks.withType(AbstractCompile).each {

it.options.encoding = defaultEncoding

}

repositories { mavenCentral() }

dependencies {

// Appiumクライアントライブラリを利用するための宣言

testCompile 'io.appium:java-client:3.4.0'

testCompile 'junit:junit:4.12'

}

Copyright © 2016, NTT Software Corporation.

Page 59: Androidテスティング実践2 システムテスト編

【Appium】テストコードの書き方: setup

AndroidDriverを初期化する

そのためにDesired Capabilityの指定が必要

113

public class AppiumTest {

private AndroidDriver<MobileElement> mDriver;

@Before

public void setUp() throws Exception {

DesiredCapabilities capabilities = new DesiredCapabilities();

capabilities.setCapability(CapabilityType.BROWSER_NAME, "");

...

mDriver =

new AndroidDriver<>(

new URL("http://localhost:4723/wd/hub"),

capabilities);

}

Copyright © 2016, NTT Software Corporation.

Page 60: Androidテスティング実践2 システムテスト編

【Appium】テストコードの書き方: tear down

AndroidDriverを終了する

114

...

@After

public void tearDown() throws Exception {

mDriver.quit();

}

}

Copyright © 2016, NTT Software Corporation.

Page 61: Androidテスティング実践2 システムテスト編

【Appium】テストコードの書き方: Desired Capabilities

テストが実行されるAppiumサーバの性質・機能を表す詳細はhttp://www.atmarkit.co.jp/ait/articles/1506/02/news017.html#021

参照

Copyright © 2016, NTT Software Corporation. 115

Page 62: Androidテスティング実践2 システムテスト編

【Appium】テスト用APIの紹介: 概要

基本形

Copyright © 2016, NTT Software Corporation. 116

WebElement elem = mDriver.findElement(<検索条件>);

elem.<操作>

検索条件(Byクラス・MobileByクラス)http://www.atmarkit.co.jp/ait/articles/1506/02/news017_2.html#031

操作(WebElementクラスのメソッド)http://www.atmarkit.co.jp/ait/articles/1506/02/news017_2.html#034

状態取得(WebElementクラスのメソッド)http://www.atmarkit.co.jp/ait/articles/1506/02/news017_2.html#035

Page 63: Androidテスティング実践2 システムテスト編

【Appium】テスト用APIの紹介: 記述例

解説記事のサンプルプログラム https://goo.gl/chfSjz 参照

Appium最新版に対応するために以下の修正が必要

依存ライブラリバージョンの最新化(p.112参照)

AndroidDriverをAndroidDriver<MobileElement>に

MobileCapabilityTypeをAndroidMobileCapabilityTypeに

ChromeDriver関係のエラーが発生する場合

以下から古い(現時点でv2.20)chromedriverをダウンロード、展開https://goo.gl/0lVlTE

展開した実行ファイルのフルパスを、Appiumの「Chromedriver Path」に入力

Copyright © 2016, NTT Software Corporation. 117

Page 64: Androidテスティング実践2 システムテスト編

https://www.ntts.co.jp/products/soft_dojyo/index.html