Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Androidテスティング実践2 システムテスト編
Search
NTTテクノクロス株式会社
July 22, 2016
Technology
1
300
Androidテスティング実践2 システムテスト編
NTTソフトウェア社内のソフト道場研修で実施した、Androidテスティング実践研修テキストの2. システムテスト編です。
NTTテクノクロス株式会社
July 22, 2016
Tweet
Share
More Decks by NTTテクノクロス株式会社
See All by NTTテクノクロス株式会社
NTT TechConference #2 Closing Keynote
ntttechnocross
4
2.5k
僕らはStackStormをどう使うべきか / NTT TechConference #2 StackStorm
ntttechnocross
1
3.3k
ネットワークスイッチ構築実践 2.STP・RSTP・PortSecurity・StormControl・SPAN・Stacking編
ntttechnocross
0
310
ネットワークスイッチ構築実践 1.VLAN・LinkAggregation編
ntttechnocross
0
340
ネットワーク構築訓練入門
ntttechnocross
1
240
Androidテスティング実践 基礎編
ntttechnocross
2
310
Androidテスティング実践3 ユニットテスト・CI編
ntttechnocross
0
290
WebRTC Training
ntttechnocross
0
300
Androidアプリケーション開発中級研修 前編
ntttechnocross
2
510
Other Decks in Technology
See All in Technology
話題のGraphRAG、その可能性と課題を理解する
hide212131
4
1.5k
いまならこう作りたい AWSコンテナ[本格]入門ハンズオン 〜2024年版 ハンズオンの構想〜
horsewin
9
2.1k
わたしとトラックポイント / TrackPoint tips
masahirokawahara
1
240
チームを主語にしてみる / Making "Team" the Subject
ar_tama
4
310
Shift-from-React-to-Vue
calm1205
3
1.3k
AIを駆使したゲーム開発戦略: 新設AI組織の取り組み / sge-ai-strategy
cyberagentdevelopers
PRO
1
130
ガバメントクラウド単独利用方式におけるIaC活用
techniczna
3
270
Nix入門パラダイム編
asa1984
2
200
とあるユーザー企業におけるリスクベースで考えるセキュリティ業務のお話し
4su_para
3
320
MAMを軸とした動画ハンドリングにおけるAI活用前提の整備と次世代ビジョン / abema-ai-mam
cyberagentdevelopers
PRO
1
110
Amazon_CloudWatch_ログ異常検出_導入ガイド
tsujiba
4
1.6k
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
3.6k
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
43
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
14
1.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Documentation Writing (for coders)
carmenintech
65
4.4k
Making Projects Easy
brettharned
115
5.9k
Designing Experiences People Love
moore
138
23k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Adopting Sorbet at Scale
ufuk
73
9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
3
370
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
Transcript
Androidテスティング実践 ②システムテスト編
本スライドは、NTTソフトウェア社内技術者育成研修(ソフト道場研修)テキストです。 【著作権・免責事項】 ! 本セミナーコースの内容、本資料のすべての著作権は、NTTソフトウェア株式会社に帰属します。 ! 無断での本資料の複写、複製、再利⽤、転載、転⽤を禁じます。 ! 本資料と演習等で利⽤するすべての教材は、NTTソフトウェア株式会社からの保証なしに提供されます。 ! 本書に記載されている会社名および製品名は、⼀般に各社の商標または登録商標です。
56 ˞ 演習問題に関するスライドは、⼀部を除き、本ファイルには含まれておりません。 また、演習に必要なソースコードも含まれておりません。ご了承ください。 Copyright © 2016, NTT Software Corporation.
2. システムテストの⾃動化 ! この研修で紹介するツールの使い分け ! Robotium (座学+演習) ! Espresso (座学+演習)
! UI Automator (座学+演習) ! Appium (座学) 57 Copyright © 2016, NTT Software Corporation.
この研修で紹介するツールの使い分け ! 画⾯単位のホワイトボックステストがしたい " Espresso ! 1アプリ内複数画⾯にまたがるブラックボックス テストがしたい " Robotium・UI Automator・Appium ! 複数アプリにまたがる(ブラックボックス) テストがしたい " UI
Automator: 1テストケース内でEspressoと併⽤OK " Appium: Selenium WebDriver経験者向け。 iOSもテストOK 58 Copyright © 2016, NTT Software Corporation.
59 Robotium Copyright © 2016, NTT Software Corporation.
【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 よりロゴを引⽤
【Robotium】おすすめポイント ! ネイティブアプリ・WebView両⽅ともテストできる " WebView対応はAndroid 4.0以降 ! テストシナリオの書き⽅が直感的で分かりやすい " 画⾯のレイアウトヒエラルキーを気にせず、⾒た⽬だけで書ける。 " 「OKと表⽰されたButtonを押せ」 " 「画⾯上から6番⽬のEditTextに"Hello"と⼊⼒せよ」 " etc. ! 複数画⾯(Activity)にまたがるテストができる
61 Copyright © 2016, NTT Software Corporation.
【Robotium】注意点 ! Google公式ではない " Android最新バージョンへの追随が遅いことも ! Androidの⾮公開APIを利⽤して実装されている " 機種によっては動作しない可能性あり " うまく動かない場合はFAQ参照 https://goo.gl/nbWkTA ! 複数アプリにまたがったテストができない Copyright ©
2016, NTT Software Corporation. 62
【Robotium】環境設定 ! ATSLの設定に加えて、app/build.gradleに以下を追加 63 dependencies { // ATSLの設定は省略 androidTestCompile \ 'com.jayway.android.robotium:robotium-solo:5.5.4'
} Copyright © 2016, NTT Software Corporation.
【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.
【Robotium】テストコードの書き⽅: tear down 65 ... @After public void tearDown() throws
Exception { solo.finishOpenedActivities(); } } ! Solo#finishOpenedActivities()を呼び出す Copyright © 2016, NTT Software Corporation.
【Robotium】テスト⽤APIの紹介: 概要 Javadoc http://recorder.robotium.com/javadoc/ Soloクラス 全てのテスト⽤APIは、Soloクラスのメソッドに集約 Copyright © 2016, NTT
Software Corporation. 66
【Robotium】テスト⽤APIの紹介: ⽂字列指定操作 ! UI部品の表⽰⽂字列(正規表現)を指定してクリック 67 solo.clickOnText("Dialog"); solo.clickOnButton("Text Entry dialog"); 「.」「+」「*」などの メタキャラクタはエスケープが必要
Copyright © 2016, NTT Software Corporation.
【Robotium】テスト⽤APIの紹介: 位置指定操作 ! UI部品の番号を指定してクリック 68 ⑦ ② ③ ④ ⑤ ⑥
① solo.clickInList(4); リストの4⾏⽬(1始まり)をクリック ⑦ ② ③ ④ ⑤ ⑥ ① ⓪ index 7(0始まり)のボタンをクリック solo.clickOnButton(7); Copyright © 2016, NTT Software Corporation.
【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.
【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部品(フォーム)に対して、 指定された⽂字列を⼊⼒する。 ˞ スクリーンショットを撮る場合は、テスト対象アプリ側に、以下のパー ミッション宣⾔が必要 <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> Copyright © 2016, NTT Software Corporation.
【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.
72 Espresso Copyright © 2016, NTT Software Corporation.
【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 よりロゴを引⽤
【Espresso】おすすめポイント ! Google謹製なので最新バージョンへの素早い追随が期待 できる " Google社内で実際に使われている " テスト結果もRobotiumより安定 ! ネイティブアプリ・WebView両⽅ともテストできる ! テストシナリオの書き⽅がシンプル ! ⽐較的実⾏速度が速い 74 Copyright
© 2016, NTT Software Corporation.
【Espresso】注意点 ! 複数Activityにまたがったテストができない " 複数アプリにまたがったテストもできない ! APIが独特なので学習コストが⾼い 75 Copyright © 2016, NTT Software
Corporation.
【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.
【Espresso】テストコードの書き⽅: setup/tear down 77 @RunWith(AndroidJUnit4.class) public class MyEspressoTest { @Rule
public ActivityTestRule<...> activityTestRule = ...; ... } ! ATSLのための準備だけでOK Copyright © 2016, NTT Software Corporation.
【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.
【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
【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.
【Espresso】テスト⽤APIの紹介: ViewActions ! onView()で特定したViewに対する操作を表すメソッド が定義されている 81 メソッド 概要 click() クリックする pressBack()
戻るキーを押す(どのViewに対して実⾏しても同じ) typeText(String) 指定された⽂字列を⼊⼒する scrollTo() onView()で指定されたViewまでスクロールする Copyright © 2016, NTT Software Corporation.
【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.
【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.
【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.
【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
【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.
87 UI Automator Copyright © 2016, NTT Software Corporation.
【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
【UI Automator】おすすめポイント ! 3rd-party製アプリの試験ができる " apkが無くても試験可能 ! Espressoと共⽤できる 89 Copyright © 2016, NTT
Software Corporation.
【UI Automator】注意点 ! できることが限定されている " UI部品の操作と状態確認、表⽰⽂字列確認に限定 " Instrumentation対象のアプリ以外が持つ インスタンス(ActivityやViewなど)へのアクセス不可 ! 明⽰的に同期を取る必要がある " EditTextに⼊⼒した直後だと、 まだ⼊⼒された⽂字列が取得できないことも。 ! 同じ⽬的のAPIが複数ある
(動作仕様や、できることが微妙に違う) " UiObject: スクロールサポート充実。同期系APIが貧弱。 " UiObject2: スクロールサポートなし。柔軟な同期系API。 90 Copyright © 2016, NTT Software Corporation.
【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.
【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.
【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.
【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.
【UI Automator】テスト⽤APIの紹介: UiObject系 ! UiObject/UiObject2で同名のメソッド 95 メソッド 概要 click() クリックする setText(String)
指定された⽂字列を⼊⼒する getText() 設定されている⽂字列を取得する isFocused() フォーカスが当たっているかどうかを取得する Copyright © 2016, NTT Software Corporation.
【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.
【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.
【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.
【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.
【UI Automator】テスト⽤APIの紹介: 同期系(4/4) 同期APIを使えば使うほど遅くなる! ! 使いすぎ注意! ! 独⽴した複数のボタンやテキストボックスを 連続操作するような場合は同期不要 同期APIの使いどころ ! ⼀連の操作による、画⾯の変化を確認したい場合 →確認する直前で同期する
! ある操作によって画⾯遷移・ダイアログ表⽰が発⽣する場合 →その操作の直後に同期する 100 Copyright © 2016, NTT Software Corporation.
【UI Automator】テスト⽤APIの紹介: 検索契機 ! いつ部品を検索しに⾏くか? UiObject系の場合 " 操作メソッド(click()など)呼び出し時に検索する " ⾒付からなかったらUiObjectNotFoundException " 同じ検索条件なら、複数画⾯で使い回しOK UiObject2系の場合 " findObject(BySelector)呼び出し時に検索する
" ⾒付からなかったらnullが返される " 画⾯レイアウトが変わるとUiObject2は無効になる →StaleObjectException 101 Copyright © 2016, NTT Software Corporation.
【UI Automator】インスペクタの利⽤ ! Viewの検索条件は、画⾯の⾒た⽬だけでは分からない ! 調査ツール uiautomatorviewer を使う 1. Android Device Monitor起動
2. [Devices]タブで調査したい デバイスを選ぶ 3. uiautomatorボタンを押す 102 Copyright © 2016, NTT Software Corporation.
【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.
【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("ありがとう"));
【UI Automator】演習2-4 ! UI Automatorを使って、以下のテストシナリオを 実現してください。 " 1つめのEditTextに「5」を⼊⼒する " 2つめのEditTextに「8」に⼊⼒する " 「この画⾯に表⽰」ボタンをクリックする " 「結果:」の右「13」と表⽰されることを確認する ! テストクラス名:
UiautomatorTest ! UiObject2系のAPIを使ってください ! リソースIDの⽂字列表現はuiautomatorviewerで 調べましょう 105 Copyright © 2016, NTT Software Corporation.
106 Appium Copyright © 2016, NTT Software Corporation.
【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 よりロゴを引⽤
【Appium】アーキテクチャ Copyright © 2016, NTT Software Corporation. 108 http://www.atmarkit.co.jp/ait/articles/1504/27/news025.html より引⽤
! Appiumサーバ: クライアント-テスト対象端末間のプロ キシとして動作 ! テストスクリプトのプログラム⾔語は⾊々選べる
【Appium】おすすめポイント ! Selenium WebDriver経験者にとって学習コストが低い ! テストスクリプトの⾔語を選べる " Ruby, Python, Java, ... ! ネイティブ・WebViewどちらもテスト可能 ! Android・iOS両⽅とも同じようなコードでテストが書ける
! 簡単にインストールできるGUI版が配布されている (Mac/Windows) 109 Copyright © 2016, NTT Software Corporation.
【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
【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
【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.
【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.
【Appium】テストコードの書き⽅: tear down ! AndroidDriverを終了する 114 ... @After public void tearDown()
throws Exception { mDriver.quit(); } } Copyright © 2016, NTT Software Corporation.
【Appium】テストコードの書き⽅: Desired Capabilities ! テストが実⾏されるAppiumサーバの性質・機能を表す 詳細は http://www.atmarkit.co.jp/ait/articles/1506/02/news017.html#021 参照 Copyright © 2016,
NTT Software Corporation. 115
【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
【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
https://www.ntts.co.jp/products/soft_dojyo/index.html