67
スマートフォンアプリの テスト自動化をはじめよう Meisters Salon 特別編 2014.05.23 @nowsprinting/Koji Hasegawa 色々

スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Embed Size (px)

DESCRIPTION

http://meisters.doorkeeper.jp/events/11134

Citation preview

Page 1: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

スマートフォンアプリの テスト自動化をはじめよう

Meisters Salon 特別編 2014.05.23

@nowsprinting/Koji Hasegawa

色々

Page 2: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

自己紹介• @nowsprinting/Koji Hasegawa

• フリーランス (iOS/Androidアプリ受託開発)

• テスト自動化研究会、Androidテスト部

• 著書『iOSアプリ テスト自動化入門』

  『Androidアプリテスト技法』(共著)

Page 3: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

著書

Page 4: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

アジェンダ• テストレベルと自動化 • システムテスト自動化のROI

• システムテスト自動化フレームワークの紹介 • ビルド・静的解析の自動化 • まとめ

Page 5: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

テストレベルと自動化

Page 6: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

テストレベル

Page 7: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

テストレベル

• テストフェーズ(工程)とは必ずしも一致しない

• プロダクト(アプリ)の結合度 • 担当者の変わり目

Page 8: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

ユニットテスト

• MVCのM(モデル、ビジネスロジック)を中心に行なう

• XCTest, GHUnit, Kiwi, OCMock, …

• JUnit, Robolectric, Mockito, EasyMock, …

Page 9: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

ユニットテスト

• MVCのM(モデル、ビジネスロジック)を中心に行なう

• XCTest, GHUnit, Kiwi, OCMock, …

• JUnit, Robolectric, Mockito, EasyMock, …

小さな単位でテスト、検証を厳密に行なうことができ、自動化の恩恵が大きい

Page 10: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

統合(結合)テスト• 個々のクラス間の統合(結合) • iOS/Android SDKとの統合

• UI(StoryBoard, nib, Layout XML)との統合

• サーバAPIとの統合

Page 11: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

統合(結合)テスト• 個々のクラス間の統合(結合) • iOS/Android SDKとの統合

• UI(StoryBoard, nib, Layout XML)との統合

• サーバAPIとの統合

網羅的に、結合箇所に着眼。この観点でUT/STにテスト項目があれば良いはず

Page 12: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

システムテスト• QA担当者が実施する、エンド・ツー・エンドのテスト

• アプリを実機にインストールして実施 • サーバAPIはステージング以上

• 機能テスト、非機能テストなど色々

Page 13: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

システムテスト• QA担当者が実施する、エンド・ツー・エンドのテスト

• アプリを実機にインストールして実施 • サーバAPIはステージング以上

• 機能テスト、非機能テストなど色々機能テストは自動化できるが、ユーザビリティや厳密な検証を欲張らないこと

Page 14: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

システムレベルの 機能テスト

• 近年のテスト自動化ツールは、Selenium

のようにViewのツリー構造を利用してオブジェクト指定が可能

• レイアウトや座標に左右されないテストが可能。(ただし機能テストに限る)

Page 15: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

システムテスト自動化のROI(投資利益率)

Page 16: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

理想の高い利益• テスト実行時間の短縮 • “正しい”画面表示のテスト(Judge/Assert)

• 複数のOSバージョン/機種で実行できる

• OS/機種依存問題を検出できる(表示崩れなども)

Return

Page 17: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

投資• 自動化ツールの選定/習得

• 自動化スクリプトの作成(高度なJudge/

Assertを求められる)

• 自動化スクリプトの保守(同上) • テストデータ、スタブサーバの準備

理想の高い利益を 得るための

Investment

Page 18: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

投資理想の高い利益を

得るためのInvestment

コストの増大、工程遅延、保守の放棄

• 自動化ツールの選定/習得

• 自動化スクリプトの作成(高度なJudge/

Assertを求められる)

• 自動化スクリプトの保守(同上) • テストデータ、スタブサーバの準備

Page 19: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

理想の高い利益Return

• テスト実行時間の短縮 • “正しい”画面表示のテスト(Judge/Assert)

• 複数のOSバージョン/機種で実行できる

• OS/機種依存問題を検出できる(表示崩れなども)

Page 20: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

現実的な利益に絞るReturn

• テスト実行時間の短縮 • “正しい”画面表示のテスト(Judge/Assert)

• 複数のOSバージョン/機種で実行できる

• OS/機種依存問題を検出できる(表示崩れなども)

Page 21: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

“テストの目的”に立ち返る

• 欠陥を摘出する • 対象ソフトウェアの品質レベルが十分であることを確認する

• 意思決定のための情報を示す • 欠陥の作り込みを防ぐ

※JSTQBシラバスより引用

Page 22: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

• 欠陥を摘出する • 対象ソフトウェアの品質レベルが十分であることを確認する

• 意思決定のための情報を示す • 欠陥の作り込みを防ぐ

※JSTQBシラバスより引用

スコープを“回帰テスト”に絞っても満たせるもの“テストの目的”に立ち返る

Page 23: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

• 欠陥を摘出する • 対象ソフトウェアの品質レベルが十分であることを確認する

• 意思決定のための情報を示す • 欠陥の作り込みを防ぐ

※JSTQBシラバスより引用

対象OS/機種で”とりあえず”動くことが確認できれば“テストの目的”に立ち返る

Page 24: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

欲張らないROI• 利益 • テスト実行時間の短縮 • 複数OSバージョン/機種で実行できる

• 投資 • 自動化ツールの選定/習得 • 自動化スクリプトの作成/保守(高度な頑張らないテストスクリプト)

• テストデータ、スタブサーバの準備

Page 25: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

頑張らないテストスクリプト

• 日時、天気、株価、為替、乱数などに

起因するJudgeを無理にはしない

• レイアウト崩れまでJudgeしようとしない

• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)

Page 26: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

頑張らないテストスクリプト

• 日時、天気、株価、為替、乱数などに

起因するJudgeを無理にはしない

• レイアウト崩れまでJudgeしようとしない

• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)

ユニットテストでモックを使って実施

Page 27: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

頑張らないテストスクリプト

• 日時、天気、株価、為替、乱数などに

起因するJudgeを無理にはしない

• レイアウト崩れまでJudgeしようとしない

• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)

ユニットテストでモックを使って実施

スクリーンショットを目視確認

Page 28: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

頑張らないテストスクリプト

• 日時、天気、株価、為替、乱数などに

起因するJudgeを無理にはしない

• レイアウト崩れまでJudgeしようとしない

• 機種依存の問題を狙ってテストしようとしない(OS/解像度のフラグメンテーションと、機種依存問題は分けて考える)

スクリーンショットを目視確認

ユニットテストでモックを使って実施

内容次第で手動で確認

Page 29: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

頑張らなくても ここまでできる事例

Page 30: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

iOSのUIAlertView

iOS6

iOS7

Page 31: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

iOSのUIAlertView

iOS6

iOS7 CLASH!!!

Page 32: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

iOSのUIPickerView

iOS6

iOS7

Page 33: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

iOSのUIPickerView

iOS6

iOS7 CLASH!!!

Page 34: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

AndroidのdrawRect()

Android 4.1

Canvas#drawRect(100,100,10,10);

(10,10)

(100,100)

Android 4.2

Page 35: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

AndroidのdrawRect()

Android 4.1

Canvas#drawRect(100,100,10,10);

(10,10)

(100,100)

描画されない!Android 4.2

※left<=right, top<=bottomでないと描画されない仕様

Page 36: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Android機種依存の例 1一定量のViewヒエラルキーの上でソフトウェアキーボードが出現するときにStackOverflowErrorが発生(某メーカーのAndroid 2.3

搭載端末のみ)

Page 37: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

普通の端末

奇妙な端末

Android機種依存の例 2

Page 38: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

普通の端末

奇妙な端末

Android機種依存の例 2

Page 39: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

利益を拡大するReturn

Page 40: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

欲張らないROI

• テスト実行時間の短縮 ➡時間と集中力を高度なテストに割り振る ➡リリース頻度の向上(4~6週間ごとが理想)

• 複数OSバージョン/機種で実行できる ➡さらにテスト実行環境を増やす。端末の回転、ロケール、タイムゾーン、12h/24h表記、IME(Android)、文字サイズ(Android 4.0)

Page 41: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

利益を拡大する• テスト実行時間の短縮 ➡時間と集中力を高度なテストに割り振る ➡リリース頻度の向上(4~6週間ごとが理想)

• 複数OSバージョン/機種で実行できる ➡さらにテスト実行環境を増やす。端末の回転、ロケール、タイムゾーン、12h/24h表記、IME(Android)、文字サイズ(Android 4.0)

Return

Page 42: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

利益を拡大する• テスト実行時間の短縮 ➡時間と集中力を高度なテストに割り振る ➡リリース頻度の向上(4~6週間ごとが理想)

• 複数OSバージョン/機種で実行できる ➡さらにテスト実行環境を増やす。端末の回転、ロケール、タイムゾーン、12h/24h表記、IME(Android)、文字サイズ(Android 4.0)

Return

ROIにとどまらず、製品の価値を上げられる!

Page 43: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

手動ではできないことができる• ロードテスト(ヒートラン) • メモリリークの調査 • 低メモリ状態での動作

• コンカレンシーテスト • 再現率の低い(タイミングがシビアな)問題の確認テスト

Page 44: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

システムテスト自動化 フレームワークの紹介

Page 45: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

monkeyrunner

• Android SDK同梱の自動テストツール。スクリプトはPythonで記述。キャプチャツール有り

• 座標を指定してタップ、ドラッグ • スクリーンショット、画像比較でのJudge

• http://developer.android.com/tools/help/monkeyrunner_concepts.html

• サンプル https://github.com/nowsprinting/nameko-harvest

Page 46: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Robotium• Android Testing Frameworkのヘルパーで、

Seleniumライクなテスト記述が可能(JUnitの知識が必要)

• 端末回転、スクリーンショットなど必要機能は揃っている

• https://code.google.com/p/robotium/

• サンプル https://github.com/mike-neck/AllowLog

Page 47: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

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

Page 48: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Espresso

• 10月に公開された、Google謹製のAndroid

向けテスティングフレームワーク

• Android 2.2以上で利用可能

• テスト記述は JUnitベース

• https://code.google.com/p/android-test-kit/

Page 49: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

UIAutomation

• Xcodeに同梱のInstrumentツールで自動実行を行なうフレームワーク

• スクリプトはJavaScriptで記述

• 標準でassert機能が無いのでJSのライブラリを使う( tuneup_js等)

Page 50: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Appium• iOS/Androidで利用できるオープンソースのテストツール

• 複数のスクリプト言語で記述可能 • テスト対象にAgentを組み込む必要がない

• AndroidはAPI Level 17 (JellyBean)以上が必要

• http://appium.io/

Page 51: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Calabash

• Cucumberのテスト(feature)を、iOS/

Androidデバイスで実行できる

• iOS版はテスト対象にAgentを組み込む必要あり

• https://github.com/calabash/calabash-android

• https://github.com/calabash/calabash-ios

Page 52: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

MonkeyTalk

• Gorilla Logic社が開発/公開しているOSSでiOS/Androidで利用可。旧”FoneMonkey”

• 専用の表形式IDEでテストを記述可能

• テスト対象にAgentを組み込む必要あり

• ATI 2012 Awards iOS/Android部門winner

• https://www.gorillalogic.com/monkeytalk

Page 53: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

その他 iOS向けフレームワーク• Frank • 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

Page 54: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

ツール選定のポイント• スクリプトを書けるチームかどうか (将来も保守していけるのか)

• iOS/Androidでテストを共有したいのか(但しUIが異なるので期待しすぎない)

• 「何が実行できるか」は余り重視しない(ツールの実行機能の差は縮まる)

• 仕様化、BDD

Page 55: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

ビルド・静的解析の自動化

Page 56: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

テスト用ビルドを作る

• 複数の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の組み込みの他、接続先サーバ別など自動生成できると便利です

Page 57: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

UAT/ベータテスト

• iOS/Android

• TestFlight https://testflightapp.com/

• Android

• deploy gate https://deploygate.com/

• Google Play Storeのベータ版配布機能

On The Airでビルドを配布できるサービス

Page 58: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

継続的インテグレーション• OS X Server/Bots

• Xcodeとの統合。自由度は低め

• Jenkins

• 豊富なプラグイン、コードカバレジ、静的解析

• Travis CI

• クラウドサービス、Immutable

Page 59: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

OS X Server/Bots

Page 60: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

OS X Server/Bots

Page 61: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Jenkins

Page 62: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Jenkins

Page 63: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

Jenkins

Page 64: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

ビルド・静的解析を 自動化するメリット

• 手作業によるオペミスを減らす • 内部品質の低いプロダクトを改善する 足がかり

• ひとりでも寂しくない!

Page 65: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

まとめ

Page 66: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

まとめ

•欲張らない •頑張らない

Page 67: スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編

まとめ

•欲張らないROI

•頑張らないテストスクリプト