Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

本スライドは、NTTソフトウェア社内技術者育成研修(ソフト道場研修)テキストです。 【著作権・免責事項】 !  本セミナーコースの内容、本資料のすべての著作権は、NTTソフトウェア株式会社に帰属します。 !  無断での本資料の複写、複製、再利⽤、転載、転⽤を禁じます。 !  本資料と演習等で利⽤するすべての教材は、NTTソフトウェア株式会社からの保証なしに提供されます。 !  本書に記載されている会社名および製品名は、⼀般に各社の商標または登録商標です。 56 ˞  演習問題に関するスライドは、⼀部を除き、本ファイルには含まれておりません。 また、演習に必要なソースコードも含まれておりません。ご了承ください。 Copyright © 2016, NTT Software Corporation.

Slide 3

Slide 3 text

2. システムテストの⾃動化 !  この研修で紹介するツールの使い分け !  Robotium (座学+演習) !  Espresso (座学+演習) !  UI Automator (座学+演習) !  Appium (座学) 57 Copyright © 2016, NTT Software Corporation.

Slide 4

Slide 4 text

この研修で紹介するツールの使い分け ! 画⾯単位のホワイトボックステストがしたい " Espresso ! 1アプリ内複数画⾯にまたがるブラックボックス テストがしたい " Robotium・UI Automator・Appium ! 複数アプリにまたがる(ブラックボックス) テストがしたい " UI Automator: 1テストケース内でEspressoと併⽤OK " Appium: Selenium WebDriver経験者向け。 iOSもテストOK 58 Copyright © 2016, NTT Software Corporation.

Slide 5

Slide 5 text

59 Robotium Copyright © 2016, NTT Software Corporation.

Slide 6

Slide 6 text

【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 よりロゴを引⽤

Slide 7

Slide 7 text

【Robotium】おすすめポイント ! ネイティブアプリ・WebView両⽅ともテストできる " WebView対応はAndroid 4.0以降 ! テストシナリオの書き⽅が直感的で分かりやすい " 画⾯のレイアウトヒエラルキーを気にせず、⾒た⽬だけで書ける。 " 「OKと表⽰されたButtonを押せ」 " 「画⾯上から6番⽬のEditTextに"Hello"と⼊⼒せよ」 " etc. ! 複数画⾯(Activity)にまたがるテストができる 61 Copyright © 2016, NTT Software Corporation.

Slide 8

Slide 8 text

【Robotium】注意点 ! Google公式ではない " Android最新バージョンへの追随が遅いことも ! Androidの⾮公開APIを利⽤して実装されている " 機種によっては動作しない可能性あり " うまく動かない場合はFAQ参照 https://goo.gl/nbWkTA ! 複数アプリにまたがったテストができない Copyright © 2016, NTT Software Corporation. 62

Slide 9

Slide 9 text

【Robotium】環境設定 ! ATSLの設定に加えて、app/build.gradleに以下を追加 63 dependencies { // ATSLの設定は省略 androidTestCompile \ 'com.jayway.android.robotium:robotium-solo:5.5.4' } Copyright © 2016, NTT Software Corporation.

Slide 10

Slide 10 text

【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.

Slide 11

Slide 11 text

【Robotium】テストコードの書き⽅: tear down 65 ... @After public void tearDown() throws Exception { solo.finishOpenedActivities(); } } ! Solo#finishOpenedActivities()を呼び出す Copyright © 2016, NTT Software Corporation.

Slide 12

Slide 12 text

【Robotium】テスト⽤APIの紹介: 概要 Javadoc http://recorder.robotium.com/javadoc/ Soloクラス 全てのテスト⽤APIは、Soloクラスのメソッドに集約 Copyright © 2016, NTT Software Corporation. 66

Slide 13

Slide 13 text

【Robotium】テスト⽤APIの紹介: ⽂字列指定操作 ! UI部品の表⽰⽂字列(正規表現)を指定してクリック 67 solo.clickOnText("Dialog"); solo.clickOnButton("Text Entry dialog"); 「.」「+」「*」などの メタキャラクタはエスケープが必要 Copyright © 2016, NTT Software Corporation.

Slide 14

Slide 14 text

【Robotium】テスト⽤APIの紹介: 位置指定操作 ! UI部品の番号を指定してクリック 68 ⑦ ② ③ ④ ⑤ ⑥ ① solo.clickInList(4); リストの4⾏⽬(1始まり)をクリック ⑦ ② ③ ④ ⑤ ⑥ ① ⓪ index 7(0始まり)のボタンをクリック solo.clickOnButton(7); Copyright © 2016, NTT Software Corporation.

Slide 15

Slide 15 text

【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.

Slide 16

Slide 16 text

【Robotium】テスト⽤APIの紹介: そのほか ! そのほか 70 メソッド(Soloクラス) 概要 assertCurrentActivity(St ring, Class) 現在の画⾯が指定されたActivity(クラス) であることをassertする。 takeScreenshot() 画⾯のスクリーンショットを撮る。 /sdcard/Robotium-Screenshots/に保存。 clickOnWebElement(By) 指定された検索条件(Byオブジェクト)に合致した WebView内HTML部品をクリックする。 typeTextInWebElement(By, String) 指定された検索条件(Byオブジェクト)に合致した WebView内HTML部品(フォーム)に対して、 指定された⽂字列を⼊⼒する。 ˞ スクリーンショットを撮る場合は、テスト対象アプリ側に、以下のパー ミッション宣⾔が必要 Copyright © 2016, NTT Software Corporation.

Slide 17

Slide 17 text

【Robotium】演習2-2 ! Robotiumを使って、以下のテストシナリオを実現してくだ さい。 " 1つめのEditTextに「5」を⼊⼒する " 2つめのEditTextに「8」に⼊⼒する " 「この画⾯に表⽰」ボタンをクリックする " 画⾯のどこかに「13」と表⽰されることを確認する ! テストクラス名: RobotiumTest ! 参考スライド " ①基礎編【演習1-1】ATSLのための設定 " 【Robotium】環境設定 " 【Robotium】テストコードの書き⽅ " 【Robotium】テスト⽤APIの紹介: 表⽰⽂字列の取得・テキスト⼊⼒ 71 Copyright © 2016, NTT Software Corporation.

Slide 18

Slide 18 text

72 Espresso Copyright © 2016, NTT Software Corporation.

Slide 19

Slide 19 text

【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 よりロゴを引⽤

Slide 20

Slide 20 text

【Espresso】おすすめポイント ! Google謹製なので最新バージョンへの素早い追随が期待 できる " Google社内で実際に使われている " テスト結果もRobotiumより安定 ! ネイティブアプリ・WebView両⽅ともテストできる ! テストシナリオの書き⽅がシンプル ! ⽐較的実⾏速度が速い 74 Copyright © 2016, NTT Software Corporation.

Slide 21

Slide 21 text

【Espresso】注意点 ! 複数Activityにまたがったテストができない " 複数アプリにまたがったテストもできない ! APIが独特なので学習コストが⾼い 75 Copyright © 2016, NTT Software Corporation.

Slide 22

Slide 22 text

【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.

Slide 23

Slide 23 text

【Espresso】テストコードの書き⽅: setup/tear down 77 @RunWith(AndroidJUnit4.class) public class MyEspressoTest { @Rule public ActivityTestRule<...> activityTestRule = ...; ... } ! ATSLのための準備だけでOK Copyright © 2016, NTT Software Corporation.

Slide 24

Slide 24 text

【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.

Slide 25

Slide 25 text

【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

Slide 26

Slide 26 text

【Espresso】テスト⽤APIの紹介: ViewMatchers ! 検索条件を表すメソッドが定義されている 80 メソッド 概要 withId(int) 指定されたIDを持つView withText(String) 指定されたテキストが表⽰されている View withContentDescription(String) 指定されたcontentDescription属性を 持ったView withClassName(Matcher) 指定されたクラス名のView ※引数には「is(クラス名)」を指定する ! hamcrestのmatcherを使うこともある(CoreMatchers) " allOf(条件1, 条件2, ...) " anyOf(条件1, 条件2, ...) " is() " not() Copyright © 2016, NTT Software Corporation.

Slide 27

Slide 27 text

【Espresso】テスト⽤APIの紹介: ViewActions ! onView()で特定したViewに対する操作を表すメソッド が定義されている 81 メソッド 概要 click() クリックする pressBack() 戻るキーを押す(どのViewに対して実⾏しても同じ) typeText(String) 指定された⽂字列を⼊⼒する scrollTo() onView()で指定されたViewまでスクロールする Copyright © 2016, NTT Software Corporation.

Slide 28

Slide 28 text

【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.

Slide 29

Slide 29 text

【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.

Slide 30

Slide 30 text

【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.

Slide 31

Slide 31 text

【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

Slide 32

Slide 32 text

【Espresso】演習2-3 ! Espressoを使って、以下のテストシナリオを 実現してください。 " 1つめのEditTextに「5」を⼊⼒する " 2つめのEditTextに「8」に⼊⼒する " 「この画⾯に表⽰」ボタンをクリックする " 「結果:」の右にあるTextViewに「13」と表⽰されることを確認する ! テストクラス名: EspressoTest ! 参考スライド " ①基礎編【演習1-1】ATSLのための設定 " 【Espresso】環境設定 " 【Espresso】テストコードの書き⽅ " 【Espresso】テスト⽤APIの紹介 86 Copyright © 2016, NTT Software Corporation.

Slide 33

Slide 33 text

87 UI Automator Copyright © 2016, NTT Software Corporation.

Slide 34

Slide 34 text

【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

Slide 35

Slide 35 text

【UI Automator】おすすめポイント ! 3rd-party製アプリの試験ができる " apkが無くても試験可能 ! Espressoと共⽤できる 89 Copyright © 2016, NTT Software Corporation.

Slide 36

Slide 36 text

【UI Automator】注意点 ! できることが限定されている " UI部品の操作と状態確認、表⽰⽂字列確認に限定 " Instrumentation対象のアプリ以外が持つ インスタンス(ActivityやViewなど)へのアクセス不可 ! 明⽰的に同期を取る必要がある " EditTextに⼊⼒した直後だと、 まだ⼊⼒された⽂字列が取得できないことも。 ! 同じ⽬的のAPIが複数ある (動作仕様や、できることが微妙に違う) " UiObject: スクロールサポート充実。同期系APIが貧弱。 " UiObject2: スクロールサポートなし。柔軟な同期系API。 90 Copyright © 2016, NTT Software Corporation.

Slide 37

Slide 37 text

【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.

Slide 38

Slide 38 text

【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.

Slide 39

Slide 39 text

【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.

Slide 40

Slide 40 text

【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.

Slide 41

Slide 41 text

【UI Automator】テスト⽤APIの紹介: UiObject系 ! UiObject/UiObject2で同名のメソッド 95 メソッド 概要 click() クリックする setText(String) 指定された⽂字列を⼊⼒する getText() 設定されている⽂字列を取得する isFocused() フォーカスが当たっているかどうかを取得する Copyright © 2016, NTT Software Corporation.

Slide 42

Slide 42 text

【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.

Slide 43

Slide 43 text

【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.

Slide 44

Slide 44 text

【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.

Slide 45

Slide 45 text

【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.

Slide 46

Slide 46 text

【UI Automator】テスト⽤APIの紹介: 同期系(4/4) 同期APIを使えば使うほど遅くなる! ! 使いすぎ注意! ! 独⽴した複数のボタンやテキストボックスを 連続操作するような場合は同期不要 同期APIの使いどころ ! ⼀連の操作による、画⾯の変化を確認したい場合 →確認する直前で同期する ! ある操作によって画⾯遷移・ダイアログ表⽰が発⽣する場合 →その操作の直後に同期する 100 Copyright © 2016, NTT Software Corporation.

Slide 47

Slide 47 text

【UI Automator】テスト⽤APIの紹介: 検索契機 ! いつ部品を検索しに⾏くか? UiObject系の場合 " 操作メソッド(click()など)呼び出し時に検索する " ⾒付からなかったらUiObjectNotFoundException " 同じ検索条件なら、複数画⾯で使い回しOK UiObject2系の場合 " findObject(BySelector)呼び出し時に検索する " ⾒付からなかったらnullが返される " 画⾯レイアウトが変わるとUiObject2は無効になる →StaleObjectException 101 Copyright © 2016, NTT Software Corporation.

Slide 48

Slide 48 text

【UI Automator】インスペクタの利⽤ ! Viewの検索条件は、画⾯の⾒た⽬だけでは分からない ! 調査ツール uiautomatorviewer を使う 1.  Android Device Monitor起動 2.  [Devices]タブで調査したい デバイスを選ぶ 3.  uiautomatorボタンを押す 102 Copyright © 2016, NTT Software Corporation.

Slide 49

Slide 49 text

【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.

Slide 50

Slide 50 text

【UI Automator】Tips: ⽇本語⼊⼒ ! UiObject/UiObject2クラスの setText(String)メソッド " Android 5.0以上: ⽇本語⼊⼒OK " Android 4.4以下: 指定できるのはASCII⽂字のみ ! Android 4.4以下で⽇本語を使う場合は専⽤のIMEを使う " UIAutomator Unicode Input Helper https://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("ありがとう"));

Slide 51

Slide 51 text

【UI Automator】演習2-4 ! UI Automatorを使って、以下のテストシナリオを 実現してください。 " 1つめのEditTextに「5」を⼊⼒する " 2つめのEditTextに「8」に⼊⼒する " 「この画⾯に表⽰」ボタンをクリックする " 「結果:」の右「13」と表⽰されることを確認する ! テストクラス名: UiautomatorTest ! UiObject2系のAPIを使ってください ! リソースIDの⽂字列表現はuiautomatorviewerで 調べましょう 105 Copyright © 2016, NTT Software Corporation.

Slide 52

Slide 52 text

106 Appium Copyright © 2016, NTT Software Corporation.

Slide 53

Slide 53 text

【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 よりロゴを引⽤

Slide 54

Slide 54 text

【Appium】アーキテクチャ Copyright © 2016, NTT Software Corporation. 108 http://www.atmarkit.co.jp/ait/articles/1504/27/news025.html より引⽤ ! Appiumサーバ: クライアント-テスト対象端末間のプロ キシとして動作 ! テストスクリプトのプログラム⾔語は⾊々選べる

Slide 55

Slide 55 text

【Appium】おすすめポイント ! Selenium WebDriver経験者にとって学習コストが低い ! テストスクリプトの⾔語を選べる " Ruby, Python, Java, ... ! ネイティブ・WebViewどちらもテスト可能 ! Android・iOS両⽅とも同じようなコードでテストが書ける ! 簡単にインストールできるGUI版が配布されている (Mac/Windows) 109 Copyright © 2016, NTT Software Corporation.

Slide 56

Slide 56 text

【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

Slide 57

Slide 57 text

【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

Slide 58

Slide 58 text

【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.

Slide 59

Slide 59 text

【Appium】テストコードの書き⽅: setup ! AndroidDriverを初期化する ! そのためにDesired Capabilityの指定が必要 113 public class AppiumTest { private AndroidDriver 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.

Slide 60

Slide 60 text

【Appium】テストコードの書き⽅: tear down ! AndroidDriverを終了する 114 ... @After public void tearDown() throws Exception { mDriver.quit(); } } Copyright © 2016, NTT Software Corporation.

Slide 61

Slide 61 text

【Appium】テストコードの書き⽅: Desired Capabilities ! テストが実⾏されるAppiumサーバの性質・機能を表す 詳細は http://www.atmarkit.co.jp/ait/articles/1506/02/news017.html#021 参照 Copyright © 2016, NTT Software Corporation. 115

Slide 62

Slide 62 text

【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

Slide 63

Slide 63 text

【Appium】テスト⽤APIの紹介: 記述例 解説記事のサンプルプログラム https://goo.gl/chfSjz 参照 ! Appium最新版に対応するために以下の修正が必要 " 依存ライブラリバージョンの最新化(p.112参照) " AndroidDriverをAndroidDriverに " MobileCapabilityTypeをAndroidMobileCapabilityTypeに ! ChromeDriver関係のエラーが発⽣する場合 " 以下から古い(現時点でv2.20)chromedriverをダウンロード、展開 https://goo.gl/0lVlTE " 展開した実⾏ファイルのフルパスを、Appiumの 「Chromedriver Path」に⼊⼒ Copyright © 2016, NTT Software Corporation. 117

Slide 64

Slide 64 text

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