Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidテスティング実践 基礎編

Androidテスティング実践 基礎編

NTTソフトウェア社内のソフト道場研修で実施した、Androidテスティング実践研修テキストの基礎編です。

More Decks by NTTテクノクロス株式会社

Other Decks in Technology

Transcript

  1. 本研修の講義⽬的と到達⽬標(1/3) 4 Copyright © 2016, NTT Software Corporation. Androidアプリ開発プロジェクトで • 

    実際の開発で無理なくユニットテストコードが書ける •  システム(UI)テスト⾃動化ツールについて •  「どんな場⾯でどのツールを使えば良いか」分かる •  簡単なテストシナリオを⾃動化できる
  2. 本研修の講義⽬的と到達⽬標(2/3) 5 Copyright © 2016, NTT Software Corporation. ! 学習すること " ⾃動ユニットテストの位置付けとメリット

    " Androidアプリのユニットテストの書き⽅ ! Android Studio、Robolectric、Mockitoを利⽤します ! ありがちなシーン別に演習中⼼に学習します " システムテスト⾃動化ツールの特徴と 基本的なテストスクリプトの書き⽅ ! 【座学+演習】Robotium、Espresso、UI Automator ! 【座学のみ】Appium
  3. この研修のカバー範囲 Copyright © 2016, NTT Software Corporation. 7 ユニットテスト ⾃動化スキル

    システムテスト ⾃動化スキル ⾊々なツールを広く薄く 実アプリに対するテストコードが 書けるレベルまで深く修得
  4. 本研修の講義内容 8 1⽇⽬ 2⽇⽬ 午前 9:30〜 12:00 !  Androidテスティング基礎 ! 

    ⾃動テストについての考え⽅ !  テストアーキテクチャ (演習あり) !  ユニットテストの⾃動化 !  基本的な使い⽅ !  ビジネスロジックのテスト (演習あり) 昼休憩 12:00〜13:00 午後 13:00〜 17:30 !  システムテストの⾃動化 !  Robotium (演習あり) !  Espresso (演習あり) !  UI Automator (演習あり) !  Appium !  イベントリスナのテスト (演習のみ) !  HTTP通信を⾏うメソッド のテスト (演習のみ) !  DBアクセスするメソッドの テスト (演習のみ) !  CI ※60〜90分ごとに適宜休憩を⼊れます Copyright © 2016, NTT Software Corporation.
  5. 本研修で紹介するツール 9 ツール名 概要 JUnit4 単体テストフレームワーク Robotium 直感的に書けるのが特徴のUIテストフレームワーク Espresso White-boxテストができるUIテストフレームワーク

    UI Automator アプリにまたがったテストができる UIテストフレームワーク Appium Seleniumと似たAPIを持つUIテストフレームワーク Robolectric 通常のJVM上でAndroidの単体試験を 実施するためのフレームワーク Mockito モッククラスを簡単に作成するためのライブラリ Android Studio Android向けの新しい統合開発環境 Gradle Android標準となったGroovyベースのビルドツール Copyright © 2016, NTT Software Corporation.
  6. 1. Androidテスティング基礎 !  ⾃動テストについての考え⽅ !  Androidの開発環境 !  Local Unit TestとInstrumented

    Test !  JUnit4とAndroid Testing Support Library !  テスト対象アプリの紹介 10 Copyright © 2016, NTT Software Corporation.
  7. 【考え⽅】テスト⾃動化のメリット(1/2) 1.  新版リリース時に、既存の回帰テストを⾃動実⾏できる " 間違った修正をすればテストに失敗する(デグレ防⽌) " 安⼼してソースコードの整理(リファクタリング)・改造ができる 2.  テストをもっと頻繁に、たくさん実⾏できる 3.  ⼿動では困難・不可能なテストができる 4. 

    ⼈的リソースの有効活⽤ " テスト担当者はより良いテストケース設計に注⼒できる " CI (Continuous Integration) ツールと連携すれば、 ⾃動テストの定期的な実⾏ですら機械任せにできる。 Copyright © 2016, NTT Software Corporation. 12 (参考)Mark Fewster, Dorothy Graham著「システムテスト⾃動化標準ガイド」(翔泳社) 第1章
  8. 【考え⽅】テスト⾃動化に共通する問題 1.  ⾃動テストツールの採⽤で全て解決すると思ってしまう 2.  ダメなテストの⾃動化してしまう " ダメなテストを⾃動化してもダメなまま 3.  ⾃動テストは新しいバグを発⾒しない " ⾃動テストスクリプトを書く段階で新規バグは⾒つかる! 4. 

    ⾃動テストを全てパスしても、バグは存在する 5.  ⾃動テストのメンテナンスコストが⾼くなる " テスト対象が仕様変更する度に、テストスクリプトの修正が必要 6.  ⾃動テストツールにバグがある 7.  組織のサポートが得られない " 「初回は導⼊コストが⼤きいため、ほとんど利益は得られない」 ことを上司に分かってもらう必要がある Copyright © 2016, NTT Software Corporation. 14 (参考)Mark Fewster, Dorothy Graham著「システムテスト⾃動化標準ガイド」(翔泳社) 第1章
  9. 【考え⽅】どうすれば良いのか(1/4) Copyright © 2016, NTT Software Corporation. 15 ! ⾃動化の⽬的は 効率化

    ! ⼿作業を繰り返すよりもコスト(稼働)が減る ! 「⾃動化」には⾃動化するための コスト がかかる !  学習コスト !  最初にテストコードを書くコスト !  改造時にメンテし続けていくコスト ⾃動化すべき箇所はどこ?
  10. 【考え⽅】システムテスト⾃動化で⼤事なこと ! テストスクリプトが簡単に書けること " UIは移ろいやすい " UI変更により作り直してもダメージが少ない ! UI変更に強いテストコード設計にすること " Page Objectパターンは必須! (参考)「4時間で学ぶ、効率的な⾃動テストスクリプトのメンテナンス」 https://goo.gl/PTdOfB (テスト⾃動化研究会

    チュートリアル資料) ! 簡単に⾃動化できるテスト項⽬に絞ること " テストツールによって得⼿不得⼿がある ! 各テストツールの得意な部分をつまみ喰いする " 例外: (⾃動化コスト以上に)⼿動でのテストが⾯倒な場合 Copyright © 2016, NTT Software Corporation. 21
  11. 【考え⽅】(参考)Android特有の試験観点(1/3) ! Activityのライフサイクルイベントに関する試験 " onPause()、onCreate()でのデータの永続化・復元 " 特にホームキーが押下された時の振る舞いは⾒落しがち! " 画⾯の向きが変わった時の動作 (onConfigurationChanged()) ! ネットワーク通信やDB操作などの重い処理に関する試験 " ANR (Application Not

    Responding) エラーが発⽣しないか ! データベース・ファイルシステム操作に関する試験 ! UIの細かい振る舞いに関する試験 " UIコンポーネントの押下時/⾮押下時、選択時/⾮選択時の⾊ " キーによるフォーカス移動の順番 " etc. Copyright © 2016, NTT Software Corporation. 22 (参考)Diego Torres Milano著「Android Application Testing Guide」(Packt Publishing)
  12. 【考え⽅】(参考)Android特有の試験観点(3/3) ! 公式ドキュメント: Core App Quality Guidelines http://developer.android.com/distribute/googleplay/quality/core.html " 4つの観点 (※) ! Visual

    Design and User Interaction ! Functionality ! Performance and Stability ! Google Play " Test Procedure ! CR-0: 全部の画⾯やダイアログについて、実際に遷移させてみる ! CR-1: 全部の画⾯について、 ホームキーを押してから再度アプリを起動してみる ! CR-2: 全部の画⾯について、別アプリに切り替えてから、 元のアプリに戻してみる ! etc. Copyright © 2016, NTT Software Corporation. 24 ˞ 具体例は、書籍「Androidアプリテスト技法」p.197参照 http://www.amazon.co.jp/dp/4798037044
  13. Androidの新しい開発環境: Android Studio ! 概要 " 「Google I/O 2013」で発表された、 新しいAndroid向け統合開発環境 " IntelliJ IDEA

    Community Editionから派⽣ ! インストール http://developer.android.com/sdk/index.html " インストーラが⽴ち上がるので、指⽰通りに進める " 「Android Studioセットアップガイド」が参考になる https://keiji.github.io/the-androidstudio-book/ 26 Copyright © 2016, NTT Software Corporation. ※Eclipse+ADTは2015年12⽉で公式サポートが打ち切られました
  14. Android Studioの動作環境 ! RAM: 最低2GB、推奨8GB ! HDD: 最低2GB、推奨4GB (Android SDK含む) ! 解像度: 最低1280×800

    ! Java: JDK8最新版 (JAVA_HOME環境変数) ! CPU: 以下の機能を搭載していること " Intel VT-x " Intel EM64T (Intel 64) " Execute Disable (XD) Bit 28 Copyright © 2016, NTT Software Corporation.
  15. Android Studioで良く使うショートカット ! ⾏の補完: Ctrl+Shift+Enter ! コンテンツアシスト: Ctrl+SPC ! テストの実⾏: Ctrl+Shift+F10 ! コードフォーマット: Ctrl+Alt+L

    ! 選択⾏の移動: Alt+Shift+↑↓ ! 選択⾏の複製: Ctrl+D ! テストメソッドの⽣成など: Alt+Insert ! インテンション(EclipseのCtrl+1): Alt+Enter ! Find Action: Shift2回押し Copyright © 2016, NTT Software Corporation. 32 ˞  [File]>[Settings...]>[Keymap]で好みのショートカットに 変更できます。
  16. Androidが⽤意しているテストの仕組み(1/2) Local Unit Test ! JVM上(開発マシン上)で動作 ⾼速だが実環境ではない ! Android Framework APIは原則呼び出せない (Robolectricを使えば可能。2⽇⽬に説明します。)

    Copyright © 2016, NTT Software Corporation. 34 local JVM (Java SE) テストコード JUnitなど Android Framework API (空実装) プロダクトコード ˞  ⽤語の定義は https://developer.android.com/training/testing/start/index.html を参考にしています
  17. app/build.gradleについて dependenciesブロックの書き⽅に注意 Copyright © 2016, NTT Software Corporation. 37 dependencies

    { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'commons-io:commons-io:2.5' androidTestCompile 'com.android.support.test:runner:0.5' testCompile 'org.robolectric:robolectric:3.0' } プロダクトコードで使うもの (compile) Instrumented Testで使うもの (androidTestCompile) Local Unit Testで使うもの (testCompile)
  18. ! コマンドラインからの実⾏ " Instrumented Testを実⾏する場合(端末を接続した状態で) " Local Unit Test を実⾏する場合 ! Android Studioからの実⾏ " テストしたいメソッドやクラスを選択して右クリック→[Run]

    (Ctrl+Shift+F10) ※Preferences→keymap→Run context configuration テストの実⾏ 38 gradlew connectedAndroidTest gradlew test Copyright © 2016, NTT Software Corporation. テストコードが緑に なっている
  19. JUnit4 (1/3) ! Javaで広く使われているテストフレームワーク ! http://junit.org/ 40 public class MyJUnit4Test { @Before

    public void setUp() { /* テスト開始前の処理 */ } @Test public void 何かのテストをする() { /* テスト本体 */ } @After public void tearDown() { /* テスト終了後の処理 */ } } Copyright © 2016, NTT Software Corporation.
  20. JUnit4 (2/3) ! テスト結果が期待通りかどうかは assertThat(actual, expected) を使う 41 // この2つをstatic importしておく

    import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; ... // 使⽤例 assertThat(x, is(3)); assertThat(x, is(not(4))); assertThat(myList, hasItem("3")); ˞  参考: マイナビニュース 『速攻解説! JUnit 4.4 - 新アサーションメソッド「assertThat」の⽤途とは』 http://news.mynavi.jp/articles/2007/07/20/junit1/ Copyright © 2016, NTT Software Corporation.
  21. JUnit4 (3/3) ! (参考)JUnit3との違い Copyright © 2016, NTT Software Corporation. 42

    JUnit3 JUnit4 テストクラス TestCaseクラスを継承 特に制限なし テストメソッ ド 「test」から始まる メソッド 「@Test」が付いているメソッド 前処理 「setUp()」を オーバーライド 「@Before」が付いているメソッド 後処理 「tearDown()」を オーバーライド 「@After」が付いているメソッド 検証 assertEquals(expected, actual) assertThat(actual, expected)
  22. ATSL (Android Testing Support Library) ! Instrumented Testで事実上必須のライブラリ 'com.android.support.test:<ライブラリ名>:<バージョン>' Copyright ©

    2016, NTT Software Corporation. 43 ライブラリ名 概要 runner 【必須】JUnit4が使えるようになる rules 【必須】JUnit4でActivityにアクセスできるようになる espresso:* Espressoが使えるようになる uiautomator:* UI Automatorが使えるようになる ! SDK Managerで以下をダウンロードしておく必要がある " Extras>Android Support Repository " Extras>Android Support Library
  23. 演習課題 ! 以下の作業を通じて、単純なInstrumented Test を完成させてください " Android Studioで 演習⽤プロジェクト「system-test-exercise」を開く " ATSLを使うように、build.gradleを修正する " 以下のテストケースを作成する ! テスト対象:

    AdditionViewActivity#isValid(String, String) ! テスト内容: 引数に"5", "8"を指定して呼び出した場合にtrueが返ること ! テストクラス名: SimpleInstrumentationTest ! テストメソッド名: isValid_normal() Copyright © 2016, NTT Software Corporation. 52
  24. ATSLのための設定: build.gradle ! app/build.gradle Copyright © 2016, NTT Software Corporation. 53

    android { defaultConfig { ... testInstrumentationRunner \ 'android.support.test.runner.AndroidJUnitRunner' } } dependencies { androidTestCompile \ 'com.android.support.test:runner:0.5' androidTestCompile \ 'com.android.support.test:rules:0.5' }
  25. ATSLのための設定: テストクラス ! テストクラス(app/src/androidTest/java/配下) Copyright © 2016, NTT Software Corporation. 54

    @RunWith(AndroidJUnit4.class) public class SimpleInstrumentationTest { @Rule public ActivityTestRule<AdditionViewActivity> activityTestRule = new ActivityTestRule<>( AdditionViewActivity.class ); private AdditionViewActivity activity; @Before public void setUp() throws Exception { activity = activityTestRule.getActivity(); } @Test public void isValid_normal() { ... } } ⽇本語名のテストメソッドだと メソッド指定のテスト実⾏不可 テスト対象Activity