スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
-
Upload
koji-hasegawa -
Category
Technology
-
view
1.051 -
download
0
Transcript of スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発 と自動化
~なじむ。実に!なじむぞ!~
2014.06.28 Asian Automation Alliance
@nowsprinting/Koji Hasegawa
自己紹介• @nowsprinting/Koji Hasegawa
• フリーランス (iOS/Androidアプリ受託開発)
• テスト自動化研究会、Androidテスト部
• 山吹色の茸疾走(Android)、フットサルルールと雑学(iOS)、電エースQuiz(iOS)
著書
アジェンダ
• アプリ開発における課題 • ビルド、デリバリの自動化 • テストの自動化 • まとめ
アプリ開発における課題
アプリ開発における課題
• テスト対象OSバージョン、機種が多い(古いものがなかなか切れない)
• 新OSバージョン、新機種への対応
• ビルドの種類が多い
ビルドの種類が多い• ステージング、プロダクションアプリの接続先ごとに識別子を変え、別アプリとして端末にインストールしたい
• Debug、Releaseログ出力、証明書などの切り替え
• テストツールのエージェントをバンドル
手動ビルドの限界
• 入門書にはIDE(GUI)でのビルド方法が書かれている
• 設定を切り替えてビルドを繰り返す? • 手順書を作っても、IDEのGUIが変わるし、人間はオペミスする
手動デリバリの限界• QA担当者、顧客のUAT担当者、ベータテスター向けのビルドを配布
• 端末をUSBでつないでインストール、端末をUSBでつないでインストール、端末をUSBでつないでインストール、…
手動回帰テストの限界• エンハンス時の回帰テスト • 複数OS/機種でのテスト実行(ISTQBによるとこれも回帰テスト)
• 手作業での同じテストの繰り返し、オペミス、見落とし→人間の(集中力の)限界
ビルド、デリバリの自動化
ビルドの自動化
• iOS
• Build Target/Configurationで設定の異なるビルドを定義できる
• xcodebuildコマンドでビルド
• JenkinsではXcodeプラグイン
ビルドの自動化
• Android
• 新ビルドシステム(Gradle plugin for
Android)では、Build Flavor/Typeで設定の異なるビルドを定義できる
• gradleコマンドでビルド
CIツール• Jenkins
• OS X Server/Bots(複数OS/機種での実行もサポート)
• Travis CI
• language: objective-cでMac OS X
• language: androidでAndroid(beta)
OS X Server/Bots
デリバリの自動化
• QA担当者、顧客のUAT担当者、ベータテスター向けのビルドをAPIでアップロード、OTAでデリバリ
• TestFlight(iOSのみ)
• DeployGate(iOS/Android)
ただし、リリースの自動化は…
• App Store/Google Play Storeへのリリースは自動化できていない(APIは無く、UI
も突然変更される)
• ビルドスクリプトでファイル名の中にバージョン番号を入れるなど、オペミスを防ぐ工夫はするべき
テストの自動化
ユニットテスト• iOS
• XCTest, Kiwi(SpecBDD)
• OCMock, OCMockit
• Android
• JUnit 3 or JUnit 4 + JavaVM + Robolectric
• Mockito, EasyMockのDalvikサポート
ユニットテスト• iOS
• XCTest, Kiwi(SpecBDD)
• OCMock, OCMonkit
• Android
• JUnit 3 or JUnit 4 + JavaVM + Robolectric
• Mockito, EasyMockのDalvikサポート
自動化しない理由は無い
“L”はARTなので動かない
システムテスト• 機能テスト(回帰テスト)向けツール • ViewのツリーからUIコンポーネントを扱える、ロバストなテストを書ける
• Cucumber系(Scenario BDD)
• ユーザビリティテストは除外(機種ごとの表示ズレ、トランケートなども含め)
機能テスト向けツール
• iOS
• XCTestベース:KIF
• Instrumentsベース:UI Automation, Appium
• エージェントをバンドル:Frank,
MonkeyTalk
機能テスト向けツール
• Android
• Unit Testの拡張:Robotium
• Instrumentベース:uiautomator, Espresso,
Appium
• エージェントをバンドル:MonkeyTalk
FrankのFeature例 Given I should see a navigation bar titled "Detail" When I type "Newton Geizler" into the "name" text field using the keyboard And I select gender to "男性"
And I select age to "35" And I navigate back Then I wait to see a navigation bar titled "Master" And I should see a cell name "Newton Geizler” and division "M2層"
MonkeyTalkの例
ユーザビリティテスト• このあたりから「自動化ハイ」の危険
ユーザビリティテスト• このあたりから「自動化ハイ」の危険 • アプリのレイアウト変更、OSバージョンアップ、機種によって容易に壊れるテストは自動化するメリットが少ない
ユーザビリティテスト• このあたりから「自動化ハイ」の危険 • アプリのレイアウト変更、OSバージョンアップ、機種によって容易に壊れるテストは自動化するメリットが少ない
吸血鬼は日光に弱いッッ!のと同じです
ユーザビリティテスト• 使い心地は、実機を人間が操作して評価 • 機種ごとの表示ズレ、トランケートも、機能テストとは分けて評価する
• ショーストッパーではない • スクリーンショットは自動で撮って、目視確認するなどの工夫はする
メンテナンスコストの意識
• テストのメンテナンスコストまで考えて無理のない自動化を
• テスト自動化全般のROI(投資利益率)については、午後のテスト自動化研究会セッションをぜひご聴講ください
機能テストでだいたいまかなえる事例
iOSのUIAlertView
iOS6
iOS7
iOSのUIAlertView
iOS6
iOS7 CLASH!!!
iOSのUIPickerView
iOS6
iOS7
iOSのUIPickerView
iOS6
iOS7 CLASH!!!
その他 iOSの事例 1
CLASH!!!
UIAlertViewを非UIスレッドから表示できてしまっていたが、正しく例外となるようになった例
( アプリの潜在不良が顕在化 /iOS3前後くらい?)
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
まとめ
まとめ
• おれは人間を超越するッ!自動テストでだァーッ!!
• スマートフォンアプリ開発と自動化はなじむ。実に!なじむぞ!
• 最高に「ハイ!」tt 慢心ダメ絶対
まとめ
• おれは人間を超越するッ!自動テストでだァーッ!!
• スマートフォンアプリ開発と自動化はなじむ。実に!なじむぞ!
• 最高に「ハイ!」tt 慢心ダメ絶対
まとめ
• おれは人間を超越するッ!自動テストでだァーッ!!
• スマートフォンアプリ開発と自動化はなじむ。実に!なじむぞ!
• 最高に「ハイ!」tt 慢心ダメ絶対
まとめ今日お話したこと、iOS
についてはだいたい載ってます。 !また、某Web媒体でiOS/
Android自動化ツールに関する連載を準備中です