*

Xcode5でUnitTest(XCTestフレームワーク)を利用してみる。

公開日: : 最終更新日:2014/06/30 Objective-C , , , ,


スポンサードリンク



Xcode5(iOS7対応バージョンの統合開発)を利用するので、当然言語はObjective-Cです。
今回のエントリーはタイトル通りの繰り返しになりますが
「Xcode5でUnitTestを利用してみる。」となります。

Xcodeに限らず、Eclipse,Visual StudioでもUnitTestを実装しながら
アプリ開発を行う開発手法は存在しています。しかしまだまだ成熟しているとはお世辞にも言えないです。

今までのXcodeでは、UnitTestを利用するのに手間がかかっていましたが、Xcode5からは簡単に利用できるようになったそうです。

と言う事で、まずはXcode5のUnitTestがどの様な物かとの概要を掴む必要があると思い、本エントリーを作成するに至りました。ほんと、UnitTestを効率的に使ったアプリ開発を行うことは色々な意味で困難です。無念すぎる・・・

本エントリーの内容は以下の通りとなります。

  1. Xcode5でのUnitTestの作成、実行方法
  2. Xcode5におけるUnitTestの概要
  3. ユニットテストの利用例

 

1 Xcode5でのUnitTestの作成、実行方法

プロジェクトの作成

まずはプロジェクトを作成します。

Empty Application templateを指定して
Project NameにHelloUnitTest、Company Identifierにcom.exampleを指定しプロジェクトを作成してください。

テストの作成方法

Xcode5ではプロジェクト作成時にデフォルトのテストクラスが作成されていますが
もう1つ追加してみます。
スクリーンショット 2013-12-18 15.40.22

テストのクラスの追加はナビゲーションエリア右クリックし
「New File…」をクリックした後
「iOS」>「Cocoa Touch」>「Objective-C testcase class」を選択し「Next」ボタンをクリックします。
スクリーンショット 2013-12-18 15.47.36

次の画面で「Class」に”Tests”で終わる任意の名前を指定します。
今回はClassTestsを指定しました。
Subclass ofの値を変更することで利用するテストフレームワークを変更できます。
Subclass ofのコンボは、XCTestCaseのままにし「Next」ボタンをクリックします。
スクリーンショット 2013-12-18 15.48.51

次の画面は、テストクラスの格納パスと対象スキーム(scheme)を指定可能です。
今回は何も変更せずに「Create」ボタンをクリックします。
スクリーンショット 2013-12-18 15.49.16

これでClassTests.mがHelloUnitTestTestsの配下に追加されました。
スクリーンショット 2013-12-18 16.05.28

テストの実行方法

ナビゲーションエリアのTest Navigatorをクリックします。
スクリーンショット 2013-12-18 16.11.39

するとナビゲーションエリアが以下のように変わります。
スクリーンショット 2013-12-18 16.13.50

HelloUnitTestTetstsを選択後に右クリックしメニューを表示した後
Run “HelloUnitTestTetsts”をクリックします。
スクリーンショット 2013-12-18 15.50.36

するとテストが実行されます。
Run “HelloUnitTestTetsts”なので
ClassTestsとHelloUnitTestTestの両方が実行されます。
ClassTestを指定してテストを実行することも可能です。

実行後の画面は以下のようになると思います。
スクリーンショット 2013-12-18 16.17.59

少し見にくいですが
XCTFail(@”No implementation for \”%s\””, __PRETTY_FUNCTION__);
の右側には
failed – No implementation for “-[ClassTests testExample]”
との情報が表示されています。

元々testExampleメソッドはXCTFailで必ず失敗するように、
テストのひな形として生成されたものですで、その通りの動きですね。

なおXCTFailの利用方法は
XCTFail(messages)となっており、失敗した時にmessagesのメッセージが表示されます。
XCTFail(@”No implementation for \”%s\””, __PRETTY_FUNCTION__);
の場合は%sの部分に__PRETTY_FUNCTION__ある-[ClassTests testExample]が置換されて表示されます。
他の言語でも一般的な文字列のテンプレートとテンプレートに含まれるプレースフォルダ数に対応する引数の形式ですね。

ちなみにツールバーでDebug areaを表示すると全ての実行時の情報が参照可能です。
スクリーンショット 2013-12-18 16.28.21

当たり前ですがtestExampleのXCTFailの行をコメントアウトして実行するとテストは成功します。
スクリーンショット 2013-12-18 16.44.12

Debug area表示時の画面
スクリーンショット 2013-12-18 16.29.53

2 Xcode5におけるUnitTestの概要

Xcode5におけるUnitTestの概要と言ってもXCTestテストフレームワークの概要となります。

利用可能なAssert一覧

利用可能なAssert一覧は以下の通りです。

メソッドAPI 説明
XCTFail(messages…) 必ず失敗
XCTAssertNil(value_1, messages…) value_1がnilであるか検証
XCTAssertNotNil(value_1, messages…) value_1がnilでないか検証
XCTAssert(expression, messages…) expressionがYES検証
XCTAssertTrue(expression, messages…) expressionがYESであることを検証
XCTAssertFalse(expression, messages…) expressionがNOであることを検証
XCTAssertEqualObjects(value_1, value_2, messages…) value_1とvalue_2のオブジェクトの内容を比較し、同じであることを検証
XCTAssertNotEqualObjects(value_1, value_2, messages…) XCTAssertEqualObjectsのNot版
XCTAssertEqual(value_1, value_2, messages…) value_1とvalue_2を比較し、同じであることを検証。XCTAssertEqualObjectsとの違いは、int等のスカラー型、構造体、共用体を対象とすることです。
XCTAssertNotEqual(value_1, value_2, messages…) XCTAssertEqualのnot版
XCTAssertEqualWithAccuracy(value_1, value_2, accuracy, messages…) value_1とvalue_2を比較し、accuracy 以内の差に収まっていることを検証
XCTAssertNotEqualWithAccuracy(value_1, value_2, accuracy, messages…) value_1とvalue_2を比較し、accuracy より差が大きいことを検証
XCTAssertThrows(expression, messages…) expression で 例外が発生することを検証
XCTAssertThrowsSpecific(expression, specificException, messages…) expression で特定のクラス(specificException)の例外が発生することを検証
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, messages…) expressionで特定のクラス(specificException)の例外が特定の名前(exception_name)で発生することを検証
XCTAssertNoThrow(expression, messages…) expressionで例外が発生しないことを検証
XCTAssertNoThrowSpecific(expression, specificException, messages…) expressionで特定のクラス(specificException)の例外が発生しないことを検証
XCTAssertNoThrowSpecificNamed(expression, specificExcepton, exceptionName, messages…) expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生しないことを検証

 

3 ユニットテストの利用例

利用可能なAssert一覧のメソッドAPIを見ただけではいまいちしっくりこないメソッドの利用例を以下に示します。

XCTAssertEqualでintを指定

XCTAssertEqualはintなどの値型を検証するメソッドです。まあこれは問題ないと思います。

XCTAssertNotEqualObjectsで独自クラスを指定

検証を行うために独自クラスPersonを作成しました。

Person.h

Person.m

XCTAssertNotEqualObjectsの引数にPersonを指定するテストを記載しました。

XCTAssertNotEqualObjects(tarou, hnako, “tarouとhnakoは異なるはず”);は当然成功します。
XCTAssertEqualObjects(tarou, fakeTarou, “tarouとfakeTarouは同じ?”);は失敗しました。

失敗時の画面イメージと注目すべき部分を拡大した物が以下のようになります。
スクリーンショット 2013-12-19 14.01.14

注目すべき部分を拡大した物
スクリーンショット 2013-12-19 13.59.47

画像の通りですが、tarouとfakeTarouのアドレスが異なるので失敗しています。
今は独自クラスをXCTAssertEqualObjectsの引数に指定しているのでオブジェクト自体の格納アドレスが異なると同じでないと識別されます。
しかしObjective-Cが提供している標準のクラスNSStringを指定した場合は格納アドレスではなく、
中身の値で同じかどうかが識別されます。

例として以下のようなテストを書いてみました。

注目していただきたいのは9行目となります。このテストは成功します。
Personを指定した時の動きとは矛盾するように思えますが
isEqualメソッドの実装に大きく依存するだけです。
(他の要素もありそうですが・・・)

isEqualの利用サンプル
if ([object1 isEqual:object2])

JUnitのAssertもJavaのequalsメソッドに依存しますよね。
そこでPersonクラスでisEqualをオーバーライドしてみました。

変更後のPerson.m

再度testPersonテストケースを実行すると成功しました。

XCTAssertThrowsSpecificの利用例

最後にXCTAssertThrowsSpecificを試してみます。
XCTAssertThrowsSpecificの動作が理解できれば他の例外検証系のメソッドも理解できると思います。

ClassTestsに常に例外をスローするメソッド:throwExceptionを追加しました。

XCTAssertNoThrowSpecificを試すためのtestXCTAssertNoThrowSpecificテストケースを追加しました。

実行するとテストは成功しました。
スクリーンショット 2013-12-19 15.09.42

JUnitみたいに赤or緑のバーが表示されるテストランナーに慣れている
AND
画面イメージが地味
なのでテスト結果が成功したことを確認していただくのがイマイチインパクトないですね・・・

「Xcode5でUnitTestを利用してみる。」のエントリーは以上で終了なのですが、この情報だけでは、実際のアプリ開発への利用は無理ですよね、少なくともモックの考え方が欠落していますし、他にも何点か更なる調査が必要と思える機能がありますので、後日、続編エントリーを作成したいと思います。

他にもXcode5に関するエントリーがございますので、「Xcode5の使い方」
もしくは、ページ右側にある「カテゴリー」の「Objective-C」
もしくは、ページ上部にあるタブメニューの「Objective-C」をクリックしていただければ、
何らかお役に立てる情報があるかも知れません。


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcodeのユーティリティエリアの使い方[ストーリーボード表示時の「File」,「Quick Help」,「Identity」]

本エントリーでは、「Xcodeのユーティリティエリアの使い方」に引き続き、「ストーリーボード」表示時

記事を読む

Xcode5&Objective-Cでセグエを利用して画面遷移を実現する。[後編:データのやり取り]

では、セグエを利用した画面遷移を実装しました。 後編では、各画面間でデータのやり取りを行えるよ

記事を読む

Xcode5で画面にツールバーを配置して利用する。

「ナビゲーションバー」と同様に「ツールバー」もナビゲーションコントローラ(UINavigationC

記事を読む

iOS(Xcode6とObjective-C)におけるマルチスレッド処理の実装方法その1[NSThreadクラスの簡単な利用例]

「iOS(Xcode6)におけるマルチスレッド処理の実装方法その1」に引き続きiOSに置けるマルチス

記事を読む

Xcodeの使い方[エディタエリアの環境設定]

「Xcodeの使い方」に引き続き「Xcodeの使い方[エディタエリアの環境設定]」となります。

記事を読む

Xcode5の「Auto Layout」機能の使い方[簡単な画面レイアウトを構成してみる。]

「基礎知識と制約(Align:アライメント)の設定方法」 で「Auto Layout」機能の利

記事を読む

Xcode5でInterface Builderの接続状態の確認と切断を行う。

「Xcode5で画面コンポーネントを利用するための基本」で本来説明すべき内容でしたが あちらのエン

記事を読む

Objective-Cでコールバック処理を@Selectorで実現する方法

最近はSwiftばっかり読み書きしていますが、既存のライブラリをカスタマイズして使うことも多いので

記事を読む

Xcodeのナビゲーションコントローラの使い方[「Single View Application」テンプレートからナビゲーションコントローラを利用する方法]

「Master-Detail Application」テンプレートを利用すれば、始めから「ナビゲーシ

記事を読む

Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認する。[NSStringを数値に変換する方法]

「Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認

記事を読む

Comment

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑