iOS向けライブラリ/アプリの単体テスト手法について調査した内容のメモ。(Objective-C前提です、、)
Mantle 1.5
URL
構成
- すべてSpectaを利用した記述
- Specta開発元なのでSpecta利用の参考になる
- 環境定義用クラスはなし
- pchファイルで補助ツールのインポート
テスト実行
- TravisCI利用
- CI用のスクリプトを定義
補助ツール
- Expecta
- Specta
Octokit 0.5
URL
構成
- すべてSpectaを利用した記述
- Specta開発元なのでSpecta利用の参考になる
-
OCTClientSpec
で通信スタブのOHHTTPStubs
を利用- 通信の設定を簡略化させるblocks定義あり
- 環境定義用クラスはなし
- pchファイルで補助ツールのインポート
補助ツール
- Expecta
- Specta
- OHHTTPStubs
AFNetworking 1.3.4
URL
構成
- 環境定義用クラス
AFNetworkingTests.h/.m
- 補助ツールのインポート
- loadメソッドのオーバーライド
- ログ出力の設定
- プロトコル用のモック定義
テスト実行
- TravisCI利用
- rakeでコマンド定義
補助ツール
- Expecta
- OCMock
RestKit 0.23.3
URL
構成
- RestKit自体にテスト用クラス群あり
<RestKit/Testing.h>
- 環境定義用クラス
RKTestEnvironment.h/.m
- TestCaseクラスのサブクラス
RKTestCase
を定義 - 各テストは
RKTestCase
クラスのサブクラスで定義 - initializeメソッドをオーバーライド
- 補助ツールのインポート
- フィクスチャのバンドル定義
- ディレクトリの存在チェック
- モデルからテストファクトリ作成
- TestCaseクラスのサブクラス
- フィクスチャ
- 画像
- JSON
- XML
- 簡易的なモデルオブジェクトクラス定義
- テストファクトリの作成に利用
- Spectaの利用は局所的
-
RKResponseDescriptorTest
のみ
-
- テストごとにライブラリの利用などが異なる
テスト実行
- rakeでテストサーバーの制御とテスト実行を管理
- sinatoraをテストサーバーとして利用
補助ツール
- OCHamcrest 3.0.1
- Expecta 0.3.1
- OCMock 2.2.1
- Specta 0.2.1
iOctocat 1.8.1.7
URL
構成
- 環境定義用クラスはなし
- pchファイルで補助ツールをインポート
- pchファイルでアプリで利用する定数定義ファイルをインポート
- ヘルパークラス
IOCTestHelper.h/.m
を定義- フィクスチャ利用のためのヘルパーメソッド
- フィクスチャ
- JSON
テスト実行
- テスト実行のためのスクリプトあり (ruby)
- guardを利用してファイル変更時のテスト自動化が可能
- TravisCI利用
補助ツール
- Expecta
Overline 0.4.0
URL
構成
- カテゴリ拡張のメソッドに対するテスト
補助ツール
- OCHamcrest
BrowseOverflow
構成
- Model, View Controller, Data Source, Delegateのテストあり
- モックやスタブは自前で実装
補助ツール
- なし
参考
気付いたこと
- テストに慣れ親しみたいのなら、カテゴリを拡張したライブラリ(
Overline
など)から眺めてみるのが良さげ - Spectaを使いたいなら、
Mantle
とOctokit
を眺めてみるのが良さげ - 非同期テストも簡単にやりたいならExpectaか
AFNetworking 1.3.4 のテスト内容の一部
-
AFHTTPRequestOperationTests.m
- (区分けなし)
- 成功時に成功用の完了ブロックが実行されレスポンスオブジェクトを受け取れること
- 失敗時に失敗用の完了ブロックが実行されエラーを受け取れること
- リクエストをキャンセルするとキャンセルのエラーがセットされること
- リクエストをキャンセルすると失敗用の完了ブロックが実行されること
- 500ステータスコードによる失敗時に失敗用の完了ブロックが実行されエラーを受け取れること
- 302ステータスコードの遭遇によりリダイレクト用のブロックが実行されること
- 複数回の302ステータスコードの遭遇によりリダイレクト用のブロックが複数回実行されること
- 停止
- 停止ができること
- 停止後に再開ができること
- 停止から再開後に完了ブロックが実行されること
- レスポンス文字列のエンコード
- 文字パラメータが提供されない際に文字列エンコードがISOLatin1であること
- SiftJISの文字パラメータが提供された際に文字列エンコードがShiftJISであること
- 不正な文字パラメータが提供された際に文字列エンコードがUTF-8であること
- UTF-8の文字パラメータが提供された際に文字列エンコードがUTF-8であること
- (区分けなし)
-
AFHTTPClientTests.m
-
setUpメソッド
- AFHTTPClientのインスタンスをプロパティへセット
- イニシャライザのテスト以外はプロパティ経由でインスタンスを取得
- (区分けなし)
- イニシャライザメソッドが例外を発生させること
- イニシャライザメソッドで指定されたパスの末端にスラッシュが追加されること
- デフォルトの文字列エンコードが意図通りであること
- デフォルトのパラメータエンコードが意図通りであること
- デフォルトのヘッダー群が意図通りであること
- Reachabilityステータスが正しいこと
- JSONRequestOperationの設定が正しいこと
- XMLRequestOperationの設定が正しいこと
- ImageRequestOperationの設定が正しいこと
- すべてのリクエストが完了した際にエンキューされたバッチの完了ブロックが呼ばれること
- 不正なユーザー名とパスワードによる認証ヘッダーが意図通りであること
- 正しいユーザー名とパスワードによる認証ヘッダーが意図通りであること
- 認証ヘッダーがリセットされること
- デフォルトのクレデンシャルを利用すること
- 簡潔な辞書を与えたAFQueryStringFromParametersWithEncodingが意図通りであること
- 複雑な入れ子のパラメータを与えたAFQueryStringFromParametersWithEncodingが意図通りであること
- AFQueryStringFromParametersWithEncodingがパーセントエスケープを適用すること
- cancelAllHTTPOperationsWithMethod:path:メソッドがマッチしたオペレーションのみをキャンセルすること
- デフォルトの文字列エンコードがUTF-8であること
- FormURLParameterEncodingを指定してパラメータを与えたPOSTリクエストの生成が意図通りであること
- JSONParameterEncodingを指定してパラメータを与えたPOSTリクエストの生成が意図通りであること
- PropertyListParameterEncodingを指定してパラメータを与えたPOSTリクエストの生成が意図通りであること
- パラメータを与えたPOST通信が意図通りであること
- enqueueBatchOfHTTPRequestOperations:メソッドが登録したHTTPRequestOperationクラスを適切に利用してオペレーションを構成すること( OCMock利用 )
- enqueueBatchOfHTTPRequestOperations:メソッドが正しい順序でオペレーションをエンキューすること( OCMock利用 )
-