まだ校正中なのですが、iOSアプリのテスト自動化入門(仮)的な*1タイトルの本を執筆しました。秀和システムさんから3月中旬ごろ発売予定です。
【3/7追記】
Amazonさんで予約はじまりましたのでリンク追加しました
昨年Androidテスト部で書いた﹃Androidアプリテスト技法﹄は、テスト技法とテスト自動化が半々という構成でしたが、本書はほぼテスト自動化について特化した一冊です。
内容、想定読者
Xcode5・iOS7環境*2における、ユニットテストの書きかた、システムテスト〜受け入れテスト向けのツール・フレームワークのほか、ビルドやAdHoc配布の自動化、CI、メトリック︵メトリクス︶採取など、アプリ開発にまつわる﹁自動化﹂できるものは盛り込みました。
また、自動化の手法・手段だけでなく、テストケースの洗い出し方、テストしやすいプロダクトコードを書くためのヒントなども、テスト用語の解説とともに書いてあります。
テストに関する用語は開発現場ごとにまちまちだと思いますが、開発者間でデザインパターンによる意思疎通ができるように、テスト用語にも拠り所があれば色々捗ると思っています。なので極力、ISTQBのソフトウェアテスト標準用語集に準拠し、引用も交えて紹介するようにしています。
﹁アプリ開発はできているが、テストは書いていない﹂という開発者をメインターゲットとしたテストの入門書として、過不足ない内容になっているはずです。
目次
全8章で、ページ数はChapter 2と3が多め、1と8は少なめ、他はほぼバランスしています。詰め混み具合は推して知るべし。
Chapter 1 テスト自動化への取り組み
●1.1 テスト自動化とは
●1.1.1 テスト自動化の必要性
●1.1.2 自動テストと手動テスト
●1.1.3 テスト自動化のROI
●1.2 テストの種類と自動化のスコープ
●1.2.1 テストレベル
●1.2.2 テストタイプ
Chapter 2 テストコードの書きかた
●2.1 モデルのユニットテストを書く
●2.1.1 XCTestの導入
●2.1.2 テストクラスの新規作成
●2.1.3 テストメソッドの作成
●2.1.4 テストの実行
●2.1.5 テストメソッドとアサーションの関係
●2.1.6 テスタビリティの高い設計
●2.2 既存のアプリにテストを追加する
●2.2.1 不具合修正の前にテストを書く
●2.2.2 タイミング依存の問題に対してテストを書く
●2.2.3 テストを書くことが困難な場合
●2.3 ユニットテストのテクニック
●2.3.1 構造テストと仕様テスト
●2.3.2 仕様化テスト
●2.3.3 テストファーストとフェイルイット
●2.3.4 TDD︵テスト駆動開発︶
●2.3.5 テストダブル
●2.3.6 テストコードの保守性とリファクタリング
●2.4 iOSアプリのテストTips
●2.4.1 テストフィクスチャをファイルでバンドルする
●2.4.2 NSUserDefaultsをクリアする
●2.4.3 アプリケーションデータを再現してテスト実行する
●2.4.4 Core Dataを使用しているアプリのテスト
●2.4.5 Core Dataをインメモリストアで使用する
●2.4.6 非公開メソッドをテストする
●2.4.7 例外発生をテストする
●2.4.8 性能テスト︵処理時間の測定︶
●3.1 XCTest
●3.1.1 既存プロジェクトにXCTestを導入する
●3.1.2 テストターゲットの依存関係
●3.1.3 XCTestのアサーション
●3.1.4 コマンドラインからXCTestを実行する
●3.1.5 OCUnitからXCTestへのコンバート
●3.2 GHUnit
●3.2.1 GHUnitをプロジェクトに導入する
●3.2.2 GHUnitのテスト実行
●3.2.3 GHUnitのアサーション
●3.2.4 非同期処理のテスト
●3.2.5 UIViewの表示テスト
●3.2.6 コマンドラインからGHUnitを実行する
●3.3 Kiwi
●3.3.1 Kiwiをプロジェクトに導入する
●3.3.2 Spec︵仕様︶の記述方法
●3.3.3 Expectations︵期待値の評価︶
●3.3.4 テストスタブによる間接入力の操作
●3.3.5 モックオブジェクトによる間接出力の検証
●3.3.6 プロトコルのモックオブジェクト
●3.3.7 非同期処理のテスト
●4.1 OCHamcrest
●4.1.1 OCHamcrestをプロジェクトに導入する
●4.1.2 OCHamcrestの使いかた
●4.2 OCMock
●4.2.1 OCMockをプロジェクトに導入する
●4.2.2 テストスタブによる間接入力の操作
●4.2.3 特殊な間接入力の操作
●4.2.4 モックオブジェクトによる間接出力の検証
●4.2.5 プロトコルのモックオブジェクト
●4.2.6 クラスメソッドの置き換え
●4.2.7 Nice Mock, Partial Mock
●4.3 OCMockito
●4.3.1 OCMockitoをプロジェクトに導入する
●4.3.2 テストスタブによる間接入力の操作
●4.3.3 モックオブジェクトによる間接出力の検証
●4.3.4 プロトコルのモックオブジェクト
●4.3.5 OCMockitoでは実現できないこと
●4.4 NLTHTTPStubServer
●4.4.1 NLTHTTPStubServerをプロジェクトに導入する
●4.4.2 NLTHTTPStubServerの使いかた
●4.4.3 レスポンス操作のバリエーション
●5.1 システムテスト自動化の予備知識
●5.1.1 システムテストの位置付け
●5.1.2 Drive, Judge, Report
●5.1.3 システムレベルの機能テスト自動化のROI
●5.2 UI Automation
●5.2.1 UI Automationの使いかた
●5.2.2 テストスクリプトの記述
●5.2.3 コマンドラインからテストを実行する
●5.2.4 Tuneup JS
●5.3 Frank
●5.3.1 Frankをプロジェクトに導入する
●5.3.2 cucumberコマンドオプション
●5.3.3 フィーチャとステップの記述
●5.3.4 Symbioteインスペクトツールの利用
●5.4 MonkeyTalk
●5.4.1 MonkeyTalkのセットアップ
●5.4.2 テスト対象アプリとの接続、キャプチャ&リプレイ
●5.4.3 MonkeyTalkのComponentとAction
●5.4.4 MonkeyTalkエージェントのアプリへの組み込み
●5.5 その他のテスティングフレームワーク
●5.5.1 KIF(Keep It Functional)
●5.5.2 Appium
●5.5.3 Calabash
●5.5.4 Zucchini
Chapter 6 ビルドと配布の自動化
●6.1 テスト用のビルドを作る
●6.1.1 Target, Configuration, Scheme
●6.1.2 xcconfigファイルの利用
●6.2 ビルドとテスト実行の自動化
●6.2.1 xcodebuild
●6.2.2 xctool
●6.2.3 バージョン番号、Copyrightの更新を自動化する
●6.2.4 ビルドの配布方法
●6.3 TestFlightによるビルドの配布
●6.3.1 TestFlightの利用登録
●6.3.2 Upload API
●6.3.3 テスターの登録
●7.1 OS X Server/Bots
●7.1.1 OS X Serverのインストールと設定
●7.1.2 Botsによるビルド実行設定
●7.1.3 ビルド結果の確認
●7.2 Jenkins
●7.2.1 Jenkinsのインストールと設定
●7.2.2 ジョブの設定
●7.2.3 ビルド結果の確認
●7.2.4 xctoolによるテスト実行とレポート
●7.3 TravisCI
●7.3.1 TravisCIの利用登録
●7.3.2 .travis.yml
●7.3.3 ビルド結果の確認
Chapter 8 メトリック
●8.1 コードカバレッジ
●8.1.1 Xcodeによるコードカバレッジの採取
●8.1.2 CoverStoryによる表示
●8.1.3 Jenkins Coberturaプラグインによる表示
●8.1.4 Coverallsを利用する
●8.2 静的解析
●8.2.1 Analyzeビルドアクション
●8.2.2 OCLintによる解析
●8.2.3 OCLintをJenkinsで実行する
Appendix
●Appendix.A Xcodeコマンドラインツールの切り替え
●Appendix.B CocoaPodsの利用
●Appendix.C コーディングスタイル
サンプルコードについて
サンプルコードは発売に合わせてGitHubで公開予定ですしました。
nowsprinting/iosAppsTestAutomationSamples · GitHub
ひとつのシンプルなアプリに対し、本書で紹介しているテスティングフレームワークを使ってゴテゴテとテストを書いています。それぞれのフレームワークによるテスト記述を比較できるはずです。
発売および予約開始はまだ先ですが、興味を持たれた方はお楽しみにお待ちください。
サポート
本書発売後のサポート、Xcodeバージョンアップへの対応などは、下記エントリを参照してください。