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
320
ネットワークスイッチ構築実践 1.VLAN・LinkAggregation編
ntttechnocross
0
360
ネットワーク構築訓練入門
ntttechnocross
1
250
Androidテスティング実践 基礎編
ntttechnocross
2
310
Androidテスティング実践3 ユニットテスト・CI編
ntttechnocross
0
300
WebRTC Training
ntttechnocross
0
310
Androidアプリケーション開発中級研修 前編
ntttechnocross
2
510
Other Decks in Technology
See All in Technology
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
260
podman_update_2024-12
orimanabu
1
270
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
170
祝!Iceberg祭開幕!re:Invent 2024データレイク関連アップデート10分総ざらい
kniino
3
300
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
540
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
310
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
15
12k
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
レンジャーシステムズ | 会社紹介(採用ピッチ)
rssytems
0
150
LINEヤフーのフロントエンド組織・体制の紹介【24年12月】
lycorp_recruit_jp
0
530
成果を出しながら成長する、アウトプット駆動のキャッチアップ術 / Output-driven catch-up techniques to grow while producing results
aiandrox
0
340
統計データで2024年の クラウド・インフラ動向を眺める
ysknsid25
2
850
Featured
See All Featured
Unsuck your backbone
ammeep
669
57k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Being A Developer After 40
akosma
87
590k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Code Review Best Practice
trishagee
65
17k
Embracing the Ebb and Flow
colly
84
4.5k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Documentation Writing (for coders)
carmenintech
66
4.5k
Automating Front-end Workflow
addyosmani
1366
200k
Six Lessons from altMBA
skipperchong
27
3.5k
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