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

25,413
-1

Published on

システムテスト自動化カンファレンス2013 発表資料
https://sites.google.com/site/testautomationresearch/event
http://togetter.com/li/597476

Published in: Technology
0 Comments
39 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
25,413
On Slideshare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
79
Comments
0
Likes
39
Embeds 0
No embeds

No notes for slide

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

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

    Clipping is a handy way to collect important slides you want to go back to later.

×