androidテスティング実践 基礎編
Post on 25-Jan-2017
4.341 Views
Preview:
TRANSCRIPT
本スライドは、NTTソフトウェア社内技術者育成研修(ソフト道場研修)テキストです。
【著作権・免責事項】
本セミナーコースの内容、本資料のすべての著作権は、NTTソフトウェア株式会社に帰属します。
無断での本資料の複写、複製、再利用、転載、転用を禁じます。
本資料と演習等で利用するすべての教材は、NTTソフトウェア株式会社からの保証なしに提供されます。
本書に記載されている会社名および製品名は、一般に各社の商標または登録商標です。
Copyright © 2016, NTT Software Corporation. 2
※ 演習問題に関するスライドは、一部を除き、本ファイルには含まれておりません。また、演習に必要なソースコードも含まれておりません。ご了承ください。
本研修の対象者・受講条件
対象者
Androidアプリのユニットテスト自動化に興味があるが、どこから手を付けて良いかわからない方
Androidのユニットテストを書き始めてみたが、様々な理由で途中で諦めてしまった(または諦めてしまいそうな)方
Androidのシステムテスト(UI部分)の自動化に踏み出してみたい方
受講条件
Androidアプリケーション開発の入門知識、および、Javaプログラミングの経験を有していること
JUnitの利用経験があること
Copyright © 2016, NTT Software Corporation. 3
本研修の講義目的と到達目標(1/3)
4Copyright © 2016, NTT Software Corporation.
Androidアプリ開発プロジェクトで
• 実際の開発で無理なくユニットテストコードが書ける
• システム(UI)テスト自動化ツールについて
• 「どんな場面でどのツールを使えば良いか」分かる
• 簡単なテストシナリオを自動化できる
本研修の講義目的と到達目標(2/3)
5Copyright © 2016, NTT Software Corporation.
学習すること
自動ユニットテストの位置付けとメリット
Androidアプリのユニットテストの書き方
Android Studio、Robolectric、Mockitoを利用します
ありがちなシーン別に演習中心に学習します
システムテスト自動化ツールの特徴と
基本的なテストスクリプトの書き方
【座学+演習】Robotium、Espresso、UI Automator
【座学のみ】Appium
本研修の講義目的と到達目標(3/3)
6Copyright © 2016, NTT Software Corporation.
本研修で取り上げないこと
Android標準のユニットテスト
システムテスト自動化ツールの詳しい使い方
この研修のカバー範囲
Copyright © 2016, NTT Software Corporation. 7
ユニットテスト自動化スキル
システムテスト自動化スキル
色々なツールを広く薄く実アプリに対するテストコードが書けるレベルまで深く修得
本研修の講義内容
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.
本研修で紹介するツール
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.
1. Androidテスティング基礎 自動テストについての考え方
Androidの開発環境
Local Unit TestとInstrumented Test
JUnit4とAndroid Testing Support Library
テスト対象アプリの紹介
10Copyright © 2016, NTT Software Corporation.
【考え方】テスト自動化のメリット(1/2)
1. 新版リリース時に、既存の回帰テストを自動実行できる
間違った修正をすればテストに失敗する(デグレ防止)
安心してソースコードの整理(リファクタリング)・改造ができる
2. テストをもっと頻繁に、たくさん実行できる
3. 手動では困難・不可能なテストができる
4. 人的リソースの有効活用
テスト担当者はより良いテストケース設計に注力できる
CI (Continuous Integration) ツールと連携すれば、自動テストの定期的な実行ですら機械任せにできる。
Copyright © 2016, NTT Software Corporation. 12
(参考)Mark Fewster, Dorothy Graham著「システムテスト自動化標準ガイド」(翔泳社) 第1章
【考え方】テスト自動化のメリット(2/2)
5. テストの一貫性と再現性
同一のテストを異なるデバイス上で実行できる
6. テストの再利用
何度もテストを実行することで、初期コスト(テスト設計、実装など)を分散できる
7. 市場に早く提供できる
8. 自信が持てる
Copyright © 2016, NTT Software Corporation. 13
(参考)Mark Fewster, Dorothy Graham著「システムテスト自動化標準ガイド」(翔泳社) 第1章
【考え方】テスト自動化に共通する問題
1. 自動テストツールの採用で全て解決すると思ってしまう
2. ダメなテストの自動化してしまう
ダメなテストを自動化してもダメなまま
3. 自動テストは新しいバグを発見しない
自動テストスクリプトを書く段階で新規バグは見つかる!
4. 自動テストを全てパスしても、バグは存在する
5. 自動テストのメンテナンスコストが高くなる
テスト対象が仕様変更する度に、テストスクリプトの修正が必要
6. 自動テストツールにバグがある
7. 組織のサポートが得られない
「初回は導入コストが大きいため、ほとんど利益は得られない」ことを上司に分かってもらう必要がある
Copyright © 2016, NTT Software Corporation. 14
(参考)Mark Fewster, Dorothy Graham著「システムテスト自動化標準ガイド」(翔泳社) 第1章
【考え方】どうすれば良いのか(1/4)
Copyright © 2016, NTT Software Corporation. 15
自動化の目的は効率化手作業を繰り返すよりもコスト(稼働)が減る
「自動化」には自動化するためのコストがかかる
学習コスト
最初にテストコードを書くコスト
改造時にメンテし続けていくコスト
自動化すべき箇所はどこ?
【考え方】どうすれば良いのか(2/4)
自動化すべき箇所
テストコードが簡単に(少ない稼働で)書けるところ
イニシャルコストが少なくて済む
何度も繰り返しテストするところ
繰り返すほどペイする
改造しても仕様があまり変わらないところ
テストコードの修正稼働が少なくて済む
Copyright © 2016, NTT Software Corporation. 16
まずはここからはじめよう
【考え方】どうすれば良いのか(3/4)
ツール選定の考え方
「やりたいことが簡単にできるかどうか」が重要
ありがちなアンチパターン
1つのツールで全部やろうとする
全てのテストを自動化しようと頑張る
おすすめ!
複数ツールを併用する。そのツールが得意なところだけ活用する。
テストクラス単位でのツール選択OK
簡単に書けるところだけ自動化する
Copyright © 2016, NTT Software Corporation. 17
【考え方】どうすれば良いのか(4/4)
ユニットテスト vs システム(UI)テスト
(原則)ユニットテスト自動化から着手すべき
ソース変更の度に再テストできるので効果が高い
改造時に最低限の品質が担保できる
テストを書くことで、曖昧だった仕様が明確になる(例)引数にnullを指定したらどうなるか?
事情によってはシステムテスト自動化からでもOK
どちらに稼働がかかっているか?
何度もやるはめになっているのはどちらか?
Copyright © 2016, NTT Software Corporation. 18
全部自動化しようと思わないこと!
【考え方】ユニットテスト自動化で大事なこと(1/2)
サクサク実行できること
開発者はコードを書きながらテストも書く
テストの実行に時間がかかると効率が落ちてしまう
モックライブラリが使えること
簡単にテストを書くにはモックライブラリは必須
意味のあるテストを自動化すること
コスト的に見合うか考える
GUIや非同期処理など、大変すぎる箇所はやらない→後フェーズで手動でテストすれば良い
ミスが入りそうな複雑なロジックのテストを優先する
単純なsetter/getterのテストを沢山書く意義は薄い
19Copyright © 2016, NTT Software Corporation.
【考え方】ユニットテスト自動化で大事なこと(2/2)
ユニットテスト自動化ツールは、以下の組み合わせがおすすめ(詳細は第4章で)
Mockito: モックライブラリの定番
Robolectric: サクサク実行できる!
Copyright © 2016, NTT Software Corporation. 20
【考え方】システムテスト自動化で大事なこと
テストスクリプトが簡単に書けること
UIは移ろいやすい
UI変更により作り直してもダメージが少ない
UI変更に強いテストコード設計にすること
Page Objectパターンは必須!(参考)「4時間で学ぶ、効率的な自動テストスクリプトのメンテナンス」https://goo.gl/PTdOfB (テスト自動化研究会 チュートリアル資料)
簡単に自動化できるテスト項目に絞ること
テストツールによって得手不得手がある
各テストツールの得意な部分をつまみ喰いする
例外: (自動化コスト以上に)手動でのテストが面倒な場合
Copyright © 2016, NTT Software Corporation. 21
【考え方】(参考)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)
【考え方】(参考)Android特有の試験観点(2/3)
機種に依存する振る舞いに関する試験
ネットワーク接続の種類・状況の違い
画面密度、解像度、物理的なサイズの違い
各種センサー(加速度センサーなど)のサポート状況の違い
入力デバイス(キーボードなど)の違い
etc
Copyright © 2016, NTT Software Corporation. 23
(参考)Diego Torres Milano著「Android Application Testing Guide」(Packt Publishing)
【考え方】(参考)Android特有の試験観点(3/3)
公式ドキュメント: Core App Quality Guidelineshttp://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
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/
26Copyright © 2016, NTT Software Corporation.
※Eclipse+ADTは2015年12月で公式サポートが打ち切られました
Android Studioの特徴
ビルド環境の一元化
GUIからもコマンドライン(Gradle)からも同一バイナリを生成できる
Mavenベースの依存関係解決システム
ビルド設定ファイルに1行書くだけでOSSが利用できる
ビルドバリアントサポート
機能の大部分は同じだが、一部だけ振る舞いの異なるような、複数のアプリケーションを開発できる
Copyright © 2016, NTT Software Corporation. 27
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
28Copyright © 2016, NTT Software Corporation.
Android Studioの初期設定
プロキシ設定
[Configure]→[Settings]→[HTTP Proxy]
C:¥Users¥ユーザー名¥.gradle¥gradle.properties
文字コード設定
[Configure]→[Settings]→[Editor]→[File Encoding]
3箇所全て「UTF-8」にする
29Copyright © 2016, NTT Software Corporation.
Android Studioでプロジェクト作成/インポート
30
新規プロジェクト作成
Eclipseのプロジェクトをインポート
Copyright © 2016, NTT Software Corporation.
ソースコードのディレクトリ構成
31
Projectの中にModule(アプリ本体)がある
テストコード①
プロダクトコード
Moduleのビルド定義ファイル
Projectのビルド定義ファイル
Copyright © 2016, NTT Software Corporation.
テストコード②
Android StudioのProjectビューで確認する
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]で好みのショートカットに変更できます。
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を参考にしています
Androidが用意しているテストの仕組み(2/2)
Instrumented Test
Android上で動作する
実環境で動作するが、遅い
Android Framework API呼び出しOK
Copyright © 2016, NTT Software Corporation. 35
(出典) https://developer.android.com/studio/test/index.html#Instrumentation
テストコードの配置
36
プロダクトコード
(src/main)
Copyright © 2016, NTT Software Corporation.
Instrumented Test
(src/androidTest)
Local Unit Test
(src/test)
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)
コマンドラインからの実行
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.
テストコードが緑になっている
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.
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.
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)
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
テスト対象アプリの特徴
足し算をするシンプルなアプリケーション
テキストボックスの入力値を足し算した結果を表示
ダイアログによる表示
同一画面の「結果:」欄への表示
数字以外の入力時はエラーダイアログを表示
Copyright © 2016, NTT Software Corporation. 45
テスト対象アプリの画面遷移(1/3)
「ダイアログ表示」ボタンを押下した場合
「ダイアログ表示」ボタンを押下する
AdditionViewActivity
Copyright © 2016, NTT Software Corporation. 46
テスト対象アプリの画面遷移(2/3)
「この画面に表示」ボタンを押下した場合
「この画面に表示」ボタンを押下する
計算結果が表示される
Copyright © 2016, NTT Software Corporation. 47
テスト対象アプリの画面遷移(3/3)
エラー時に表示するダイアログ値1・値2のいずれかが数字以外の場合に表示
Copyright © 2016, NTT Software Corporation. 48
テスト対象アプリの内部仕様
入力内容を確認するバリデータ:
AdditionViewActivity#isValid(String, String): boolean
引数の両方がintに変換可能な場合: true
いずれかがintに変換できない場合や、nullの場合: false
Copyright © 2016, NTT Software Corporation. 49
ViewのリソースID
R.id.value1
R.id.value2R.id.result_value
R.id.page_buttonR.id.dialog_button
Copyright © 2016, NTT Software Corporation. 50
演習課題
以下の作業を通じて、単純な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
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'
}
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
https://www.ntts.co.jp/products/soft_dojyo/index.html
top related