iOS Unit Test

Presenter Notes

自己紹介

アイコン

Presenter Notes

ロジックテスト / アプリケーションテスト

ロジックテスト

  • iOSシミュレータSDKベースだが、iPhoneシミュレータでは実行しない
  • テスト対象のコードは対応するターゲットのビルドフェーズの間に実行
  • 実機では動かせない(そこまで挙動が違うケースがないのであまり困らないかもしれないけど)
  • faaasssttttt!!

例 ) OCUnit(SenTestingKit)、 Kiwi

Presenter Notes

アプリケーションテスト

  • iOSアプリとしてテストを実行する
  • 実機でも動く(アプリに関連付けて実行されるので)

例 ) OCUnit、GHUnit

sea also…

Presenter Notes

OCUnitでもアプリケーションテスト

  • Xcodeのプロジェクト作成で Include Unit Test にチェック
  • この時のTest Bundleには自動でアプリケーションテストの設定がされている

Xcode : Create Project

Presenter Notes

ロジックテスト to アプリケーションテスト

* Add Target から Test Bundleを追加した場合、ロジックテストになってる

Presenter Notes

ロジックテスト to アプリケーションテスト

  • Test Bundleの設定を幾つか加えるだけでできる

  • Bundle Loader の設定

  • Test Host の設定
  • SchemeのTests の設定

詳細 :

Presenter Notes

結局アプリケーションテストって?

  • Bundle Loader が設定されている
  • ビルド時のテストじゃなくてアプリ上でテストが動く
  • 実機でも動作するテストが書ける
  • このスライドでは アプリケーションテスト は Appleの用語の方を示す

一般的なイメージ

  • GHUnit みたいなテストコンソールが見えるアプリ!!
  • Viewをテスト方法

Presenter Notes

テスト可能なコードの記述

iPhone開発ガイド - iPhone_Development.pdf より

  • APIの要件を定義する
  • コードを記述するときにテストケースを記述する
  • 境界条件をチェックする
  • ネガティブテストを使用する
  • 網羅的なテストケースを記述する
  • バグ修正をテストケースでカバーする
    • バグを修正したら、修正結果を確認するテストケース を1つまたは複数記述します。

Presenter Notes

Kiwi

  • Kiwi はBDDなテストライブラリ
  • Mock/Stub/Async 等ひと通り揃ってる
  • テストの導入として無難で比較的安定している(OCUnit以外において)
  • AppCodeもKiwiをサポートしている

see also

Presenter Notes

CocoaPodsでの導入

  • CocoaPods はCocoaのライブラリ管理ツール
  • Cocoaに則ったアプリなら利用しない理由はあんまりない
  • (テスト)ライブラリの導入が手軽になる

VendorKit なんてなかった

see also…

Presenter Notes

CocoaPodsでKiwiを導入する例

Tests target に Kiwi をインストールする

platform :ios

target :Tests, :exclusive => true do
    pod 'Kiwi'
end

Presenter Notes

テストの実行

XCode

  • Product -> Test
  • Cmd + U

Presenter Notes

AppCode

  • Test SchemeのRun

Presenter Notes

AppCode の 利点

  • 見やすい結果表示
  • 単独のテストケースの実行
  • FileWatcher
  • テストファイルと実行ファイルの切り替えショートカット

note

Xcodeも類似のテスト切り替えの機能を加えるPlugin

Presenter Notes

あるあるロジックテスト

Presenter Notes

main bundleが使えない

テスト内で [[NSBundle mainBundle] pathForResource:@"fname" ofType:@"plist"];や [UIImage imageNamed:@"default.png"];null となってしまう

  • ロジックテストは ``Bundle Loader``` 示す場所がアプリケーションテストと異なる

コードで置き換えるなら

[NSBundle mainBundle];
の代わりに
[NSBundle bundleForClass:[self class]];
を使う

別の解法

  • Test Bundleをアプリケーションテストにする

Presenter Notes

CI と CLI

Presenter Notes

Travis CI

  • Travis CI はiOSのテストが実行できる
  • language: objective-c を指定するとOS Xを利用できる
  • ライブラリとか公開するならTravis CIでテストを回しておくと安心
    • 利用者的にも作成者的にも

see also...

Presenter Notes

xctool

  • xctool Facebookが最近だした xcodebuild の代わりになるCLIツール
  • xcodebuild よりわかりやすいオプション
  • アプリケーションテストのテストもちゃんと実行できる
  • reporter がある(pretty,json,JUnit等)
  • Configuration (.xctool-args) という設定ファイル

まだ CocoaPods との相性が不完全

Presenter Notes

どこからテスト始める問題

Presenter Notes

これからテストを始める場合

  • テスト書いてる人から学ぶと早い(ペアプロとか)
  • とりあえず書かないと始まらない
  • 楽しく書き始められる環境づくり大切j

テストで学ぶObjective-C

  • テストを習慣化するためにはとりあえずテストを書き始めることが大切
  • テストを書きながらObjective-Cも学べれば一石二鳥

そんなプロジェクト

Presenter Notes

DEMO

  • azu/AZDateBuilder · GitHub

  • NSArrayのカテゴリテスト

    • firstObject
    • lastObjectに合わせて見る
    • Categoryのoverwriteチェック
    • xctoolを使っての実行 OBJC_PRINT_REPLACED_METHOD でのカテゴリ衝突
    • http://blog.clickablebliss.com/2010/01/19/finding-colliding-cate gory-methods/
  • アプリケーションテストで端末特有の動作を見る

Presenter Notes

おわり

Presenter Notes