スマートフォンアプリの テスト自動化をはじめよう
DESCRIPTION
システムテスト自動化カンファレンス2013 発表資料 https://sites.google.com/site/testautomationresearch/event http://togetter.com/li/597476TRANSCRIPT
スマートフォンアプリの テスト自動化をはじめよう
システムテスト自動化カンファレンス2013
2013.12.1 #stac2013
自己紹介長谷川 孝二 @nowsprinting (twitter, github, etc...)
• テスト自動化研究会
• Androidテスト部
• iOS/Androidアプリ開発者
• 受託開発(フリーランス)
• 自社開発
自己紹介長谷川 孝二 @nowsprinting (twitter, github, etc...)
• テスト自動化研究会
• Androidテスト部
• iOS/Androidアプリ開発者
• 受託開発(フリーランス)
• 自社開発
アジェンダ• テスト自動化の現状 • システムテスト自動化のROI
• システムテスト自動化フレームワークの紹介 • デモ • Tips
テスト自動化の現状
ユニットテスト/iOS
• Xcode標準のOCUnit(SenTestingKit)
• Xcode5ではXCTest、テスト実行の強化
• Mac OS 10.9でX Server(Bot)によるCI
• GHUnit, OCMockなど
モデルのユニットテストは容易
ユニットテスト/Android
• Android Testing Framework(Android SDK同梱/JUnit3ベース)
• UI操作を補完するオープンソースフレームワーク(Robotiumなど)
• Mockito, EasyMock, Robolectricなど
モデルのユニットテストは容易
システムテスト• iOS/Androidとも自動化ツール/フレームワークは多数存在する(後ほど紹介)
• UI変更頻度が高い、トランジションアニメーション等の重要度が高いが、そのテストは自動化しにくい
システムテスト• iOS/Androidとも自動化ツール/フレームワークは多数存在する(後ほど紹介)
• UI変更頻度が高い、トランジションアニメーション等の重要度が高いが、そのテストは自動化しにくい
自動化は(現実的に)可能なのか?
システムテスト自動化のROI
理想の高い利益
• テスト実行時間の短縮 • “正しい”画面表示のテスト(Judge)
• 複数のOSバージョン/機種で実行できる
• OS/機種依存問題を検出できる
Return
投資
• 自動化ツールの選定/習得
• 自動化スクリプトの作成(高度なJudgeを求められる)
• 自動化スクリプトの保守(同上) • テストデータ、スタブサーバの準備
理想の高い利益を 得るための
Investment
投資
• 自動化ツールの選定/習得
• 自動化スクリプトの作成(高度なJudgeを求められる)
• 自動化スクリプトの保守(同上) • テストデータ、スタブサーバの準備
理想の高い利益を 得るための
Investment
コストの増大、工程遅延、保守の放棄
理想の高い利益
• テスト実行時間の短縮 • “正しい”画面表示のテスト(Judge)
• 複数のOSバージョン/機種で実行できる
• OS/機種依存バグを検出できる
Return
現実的な利益に絞る
• テスト実行時間の短縮 • “正しい”画面表示のテスト(Judge)
• 複数のOSバージョン/機種で実行できる
• OS/機種依存バグを検出できる
Return
“テストの目的”に立ち返る
• 欠陥を摘出する • 対象ソフトウェアの品質レベルが十分であることを確認する
• 意思決定のための情報を示す • 欠陥の作り込みを防ぐ
※JSTQBシラバスより引用
• 欠陥を摘出する • 対象ソフトウェアの品質レベルが十分であることを確認する
• 意思決定のための情報を示す • 欠陥の作り込みを防ぐ
※JSTQBシラバスより引用
スコープを“回帰テスト”に絞っても満たせるもの“テストの目的”に立ち返る
• 欠陥を摘出する • 対象ソフトウェアの品質レベルが十分であることを確認する
• 意思決定のための情報を示す • 欠陥の作り込みを防ぐ
※JSTQBシラバスより引用
対象OS/機種で”とりあえず”動くことが確認できれば“テストの目的”に立ち返る
欲張らないROI
• 利益 • テスト実行時間の短縮 • 複数OSバージョン/機種で実行できる
• 投資 • 自動化ツールの選定/習得 • 自動化スクリプトの作成/保守(高度な頑張らないテストスクリプト)
• テストデータ、スタブサーバの準備
頑張らないテストスクリプト
• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない
• レイアウト崩れまでJudgeしようとしない
• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)
頑張らないテストスクリプト
• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない
• レイアウト崩れまでJudgeしようとしない
• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)
ユニットテストでモックを使って実施
頑張らないテストスクリプト
• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない
• レイアウト崩れまでJudgeしようとしない
• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)
ユニットテストでモックを使って実施
スクリーンショットを目視確認
頑張らないテストスクリプト
• 日時、天気、株価、為替、乱数などに
起因するJudgeを無理にはしない
• レイアウト崩れまでJudgeしようとしない
• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)
ユニットテストでモックを使って実施
内容次第で手動で確認
スクリーンショットを目視確認
頑張らなくても ここまでできる事例
iOSのUIAlertView
iOS6
iOS7
iOSのUIAlertView
iOS6
iOS7 CLASH!!!
iOSのUIPickerView
iOS6
iOS7
iOSのUIPickerView
iOS6
iOS7 CLASH!!!
その他 iOSの事例 1
CLASH!!!
UIAlertViewを非UIスレッドから表示できてしまっていたが、正しく例外となるようになった例
( アプリの潜在不良が顕在化 /iOS3前後くらい?)
その他 iOSの事例 2
CLASH!!!
開放/上書きされるはずのインスタンスを参照していたが、iOSバージョンアップでインスタンスが正しく開放されるようになった
(アプリの潜在不良が顕在化)
何か操作
AndroidのdrawRect()
Android 4.1
Canvas#drawRect(100,100,10,10);
(10,10)
(100,100)
Android 4.2
AndroidのdrawRect()
Android 4.1
Canvas#drawRect(100,100,10,10);
(10,10)
(100,100)
描画されない!Android 4.2
※left<=right, top<=bottomでないと描画されない仕様
Android機種依存の例 1一定量のViewヒエラルキーの上でソフトウェアキーボードが出現するときにStackOverflowErrorが発生(某メーカーのAndroid 2.3
搭載端末のみ)
普通の端末
奇妙な端末
Android機種依存の例 2
普通の端末
奇妙な端末
Android機種依存の例 2
押さえておきたいポイント• 全ての画面は網羅する(エラーケースの
AlertView表示等も含むことが望ましい)
• CIなどで繰り返し行なう段階であれば、スクリーンショットの比較はImageMagickなどで自動化する(但し全てCI化は目指さない)
• 実行時間も0ではないので、テストケースの絞り込みは意識する
利益を拡大するReturn
欲張らないROI
• テスト実行時間の短縮 ➡時間と集中力を高度なテストに割り振る ➡リリース頻度の向上(4~6週間ごとが理想)
• 複数OSバージョン/機種で実行できる ➡さらにテスト実行環境を増やす。端末の回転、ロケール、タイムゾーン、12h/24h表記、IME(Android)、文字サイズ(Android 4.0)
利益を拡大する• テスト実行時間の短縮 ➡時間と集中力を高度なテストに割り振る ➡リリース頻度の向上(4~6週間ごとが理想)
• 複数OSバージョン/機種で実行できる ➡さらにテスト実行環境を増やす。端末の回転、ロケール、タイムゾーン、12h/24h表記、IME(Android)、文字サイズ(Android 4.0)
Return
手動ではできないことができる• ロードテスト(ヒートラン) • メモリリークの調査 • 低メモリ状態での動作
• コンカレンシーテスト • 再現率の低い(タイミングがシビアな)問題の確認テスト
システムテスト自動化 フレームワークの紹介
monkeyrunner
• Android SDK同梱の自動テストツール。スクリプトはPythonで記述。キャプチャツール有り
• 座標を指定してタップ、ドラッグ • スクリーンショット、画像比較でのJudge
• http://developer.android.com/tools/help/monkeyrunner_concepts.html
• サンプル https://github.com/nowsprinting/nameko-harvest
Robotium• Android Testing Frameworkのヘルパーで、
Seleniumライクなテスト記述が可能(JUnitの知識が必要)
• 端末回転、スクリーンショットなど必要機能は揃っている
• https://code.google.com/p/robotium/
• サンプル https://github.com/mike-neck/AllowLog
uiautomator• Android 4.1で利用できるSDK同梱の自動テストツール。端末の回転とスクリーンショットは4.2から利用可能。JUnitベース
• SeleniumのようにViewのヒエラルキーを辿って画面要素を指定可能
• Viewのdescriptionでも要素を指定可能
• http://developer.android.com/tools/help/uiautomator/index.html
• サンプル https://gist.github.com/nowsprinting/4131415
Espresso
• 10月に公開された、Google謹製のAndroid
向けテスティングフレームワーク
• Android 2.2以上で利用可能
• テスト記述は JUnitベース
• https://code.google.com/p/android-test-kit/
UIAutomation
• Xcodeに同梱のInstrumentツールで自動実行を行なうフレームワーク
• スクリプトはJavaScriptで記述
• 標準でassert機能が無いのでJSのライブラリを使う( tuneup_js等)
Appium• iOS/Androidで利用できるオープンソースのテストツール
• 複数のスクリプト言語で記述可能 • テスト対象にAgentを組み込む必要がない
• AndroidはAPI Level 17 (JellyBean)以上が必要
• http://appium.io/
Calabash
• Cucumberのテスト(feature)を、iOS/
Androidデバイスで実行できる
• iOS版はテスト対象にAgentを組み込む必要あり
• https://github.com/calabash/calabash-android
• https://github.com/calabash/calabash-ios
MonkeyTalk
• Gorilla Logic社が開発/公開しているOSSでiOS/Androidで利用可。旧”FoneMonkey”
• 専用の表形式IDEでテストを記述可能
• テスト対象にAgentを組み込む必要あり
• ATI 2012 Awards iOS/Android部門winner
• https://www.gorillalogic.com/monkeytalk
その他 iOS向けフレームワーク• Franc • Cucumber系、 ATI 2012 Awards iOS部門
finalists • http://www.testingwithfrank.com/
• Zucchini • DSL系、ATI 2012 Awards iOS部門finalists
• http://www.zucchiniframework.org/
• KIF • https://github.com/kif-framework/KIF
ツール選定のポイント• スクリプトを書けるチームかどうか (将来も保守していけるのか)
• iOS/Androidでテストを共有したいのか(但しUIが異なるので期待しすぎない)
• 「何が実行できるか」は余り重視しない(ツールの実行機能の差は縮まる)
デモ
Tips
テスト用ビルドを作る
• 複数のTarget/Configurationを持つiOSプロジェクトの構成Tips http://nowsprinting.hatenablog.com/entry/2012/11/
18/031511
• Gradle+Androidプラグインでプロダクトフレーバーを試してみた http://nowsprinting.hatenablog.com/entry/
2013/05/23/153941
Agentの組み込みの他、接続先サーバ別など自動生成できると便利です
UAT/ベータテスト
• iOS/Android
• TestFlight https://testflightapp.com/
• Android
• deploy gate https://deploygate.com/
• Google Play Storeのベータ版配布機能
On The Airでビルドを配布できるサービス
リモートテストサービス• AppKit Box Remote TestKit
• インターネット経由で実機をレンタルし、テストできるサービス
• Android向けサービスだったが、9月にiOSデバイスも利用可能に
• http://appkitbox.com/testkit
まとめ
まとめ
•欲張らない •頑張らない
まとめ
•欲張らないROI
•頑張らないテストスクリプト