やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

iOSアプリのテスト自動化本を執筆しました

まだ校正中なのですが、iOSアプリのテスト自動化入門(仮)的な*1タイトルの本を執筆しました。秀和システムさんから3月中旬ごろ発売予定です。

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門

【3/7追記】Amazonさんで予約はじまりましたのでリンク追加しました

昨年Androidテスト部で書いた『Androidアプリテスト技法』は、テスト技法とテスト自動化が半々という構成でしたが、本書はほぼテスト自動化について特化した一冊です。

内容、想定読者

Xcode 5・iOS 7環境*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.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 性能テスト(処理時間の測定)

Chapter 3 ユニットテストフレームワーク

  • 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 非同期処理のテスト

Chapter 4 ユニットテストの補助ツール

  • 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 レスポンス操作のバリエーション

Chapter 5 システムテストの自動化

  • 5.1 システムテスト自動化の予備知識
    • 5.1.1 システムテストの位置付け
    • 5.1.2 Drive, Judge, Report
    • 5.1.3 システムレベルの機能テスト自動化のROI
  • 5.2 UI Automation
  • 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 テスターの登録

Chapter 7 CI(継続的インテグレーション

  • 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 Travis CI
    • 7.3.1 Travis CIの利用登録
    • 7.3.2 .travis.yml
    • 7.3.3 ビルド結果の確認

Chapter 8 メトリック

  • 8.1 コードカバレッジ
  • 8.2 静的解析
    • 8.2.1 Analyzeビルドアクション
    • 8.2.2 OCLintによる解析
    • 8.2.3 OCLintをJenkinsで実行する

Appendix

サンプルコードについて

サンプルコードは発売に合わせてGitHubで公開予定ですしました。

nowsprinting/iosAppsTestAutomationSamples · GitHub

ひとつのシンプルなアプリに対し、本書で紹介しているテスティングフレームワークを使ってゴテゴテとテストを書いています。それぞれのフレームワークによるテスト記述を比較できるはずです。

発売および予約開始はまだ先ですが、興味を持たれた方はお楽しみにお待ちください。

サポート

本書発売後のサポート、Xcodeバージョンアップへの対応などは、下記エントリを参照してください。

*1:あの日書いた本の名前を僕達はまだ知らない

*2:あんな変更やこんな変更がなければ、もっと早く出せていたはず…