ちょっと話題の記事

[Xcode 5] Test Navigator と XCTestを使ってみる

2013.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Xcode 5 で XCTest という新しいテストフレームワークが投入されました。OCUnitを使ったプロジェクトからのコンバートもできるので、それを置き換えるものと考えて良さそうです。また Test Navigator という新しいナビゲータが導入され、テストターゲットとの親和性が高くなっているようです。さらにコマンドラインからのテスト実行もサポートされました。

導入

何も考えなくてもプロジェクトを作成すると勝手にTestターゲットが作成されます。素敵です。
メニューからProduct -> Test 又は Command + U でテストが実行されます。Testクラス新規作成時はXCFailが1つ設定されているので必ずテストが失敗します。この辺はOCUnitと変わりません。
xcinit

Test Navigator で動作させる

ナビゲータから↓のアイコンを選択します。
xct_test_navigator
最後に実行したテストのメソッドやクラス単位での 成功/失敗 が 緑/赤 のアイコンで表示されます。そのアイコン上にカーソルを置くとテスト実行アイコンに変わります。例えば失敗したテストのみを選択して実行できるので、全てのテストを実行しなくてもよくなり、実行時間を短縮できます。

また、テストターゲットの追加やテストクラスの追加が左下のメニューから簡単にできます。
xctest_add_test

Assistant editorで表示する

Assistant editorで左ペインに実装ファイル(.m)を選択すると右ペインにテストクラスを自動的に横に並べて表示できます。これがこの記事で一番便利になった機能だと思ってます。
xct_assistant_editor

XCUnit の Assert 一覧

Assert 説明
XCTFail(format...) 必ず失敗します
XCTAssertNil(a1, format...) a1がnilであることを期待します
XCTAssertNotNil(a1, format...) a1がnilでないことを期待します
XCTAssert(expression, format...) expressionがYESであることを期待します
XCTAssertTrue(expression, format...) expressionがYESであることを期待します
XCTAssertFalse(expression, format...) expressionがNOであることを期待します
XCTAssertEqualObjects(a1, a2, format...) a1とa2のオブジェクトの内容を比較し、同じであることを期待します< !{ [a1 isEqual:a2] } >
XCTAssertNotEqualObjects(a1, a2, format...) a1とa2のオブジェクトの内容を比較し、違いがあることを期待します< { [a1 isEqual:a2] } >
XCTAssertEqual(a1, a2, format...) a1とa2を比較し、同じであることを期待します。int等のスカラー型、構造体、共用体に使用します
XCTAssertNotEqual(a1, a2, format...) a1とa2を比較し、違いがあることを期待します。int等のスカラー型、構造体、共用体に使用します
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...) a1とa2を比較し、accuracy 以内の差に収まっていることを期待します
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) a1とa2を比較し、accuracy より差が大きいことを期待します
XCTAssertThrows(expression, format...) expression で 例外が発生することを期待します
XCTAssertThrowsSpecific(expression, specificException, format...) expression で特定のクラス(specificException)の例外が発生することを期待します
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...) expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生することを期待します。例えばNSExceptionでNSInvalidArgumentExceptionなど
XCTAssertNoThrow expression で 例外が発生しないことを期待します
XCTAssertNoThrowSpecific expression で特定のクラス(specificException)の例外が発生しないことを期待します
XCTAssertNoThrowSpecificNamed expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生しないことを期待します。例えばNSExceptionでNSInvalidArgumentExceptionなど

 これもOCUnitと同じようです。

OCUnitからのコンバート

そんなわけで、OCUnitからのコンバートも可能になっています。
xct_oc_convert

#import や アサーションを書き換えてくれます。

コマンドラインからのテストの実行

xcodebuild でテスト実行できます。Jenkins 等使っている場合にこれで実行できそうです。

xcodebuild test -scheme {テスト対象のスキーム} -destination 'name={Xcodeに表示されているシミュレータも含むデバイスの名前},OS={テスト対象OSバージョン}'

例えば↓のような感じです。

xcodebuild test -scheme CIApp2 -destination 'name=iPhone Retina (3.5-inch),OS=7.0'

xctest_xcodebuild

まとめ

大きな変更は無いようですが、Test Navigator や Assistant editor 、xcodebuild からのテストなどで地味に着実に使いやすくなっているようでした。