指摘、要望などはこちらからお願いします。

OCUnitの使い方(Cocoa Application編)


更新日:2010/06/13

目的

OCUnitを使いCocoa Applicationをテストする方法を理解する。
また、日本語で解説している資料がほとんどないため、ここで簡単に解説する。

前提条件

「実習環境」の環境要件を満たしていること。
TDDで一般的な、レッド/グリーン/リファクタリングの流れでは説明していない。

実習環境

 OSMac OS X 10.6.2
 XcodeXcode 3.2.1 
OCUnitはXcodeをインストールすると一緒にインストールされる。

実習開始

新規プロジェクトを作成

  1. 新規プロジェクトとして Cocoa Application を作成する。


  2. 名前を付けて適当なフォルダに保存する。(ここではOCTと名前を付けた)


  3. Xcode左側の [グループとファイル] ペインから [ターゲット] を開くと、OCTというターゲットが追加されている。
    このターゲットがテスト対象となる。

テストケースとなるターゲットを追加

  1. 作成したプロジェクトに、テストケースとなるターゲットを追加する。
    [プロジェクト] メニューから [新規ターゲット] を選択。
    [Unit Test Bundle] を選択し、次へ。


  2. Unit Testsと名前を付け、[完了] をクリック。


  3. ターゲットの情報ウィンドウが表示されるので [一般] タブを選択し、直接依存関係にOCTを追加する。
    これでUnit TestsのコンパイルをトリガにしてOCTがコンパイルされるようになる。
    (つまり、常に最新のOCTのコードをテストできるようになる)



  4. 次に [ビルド] タブを選択し、[テストホスト] が見付かるまでスクロールする。
    そして、テスト対象プログラムの実行形式ファイルへのパスを入力する。
    $(BUILT_PRODUCTS_DIR)/OCT.app/Contents/MacOS/OCT



  5. [テストホスト] に設定したパスを、[バンドルローダー] にも設定する。


  6. テストケースとなるターゲットの追加完了。
    単体テストを行う準備は整ったので、後はテスト対象となるプログラムとテストケースを書いていく。

テスト対象プログラムの作成

ここで追加するコードはすべてガベージコレクションが有効になっていることを前提にしている。
ガベージコレクションの設定方法は「ガベージコレクションの設定」で解説する。
  1. 新規ファイルとして、[Objective-C class](スーパークラスはNSObject)をCounter.mという名前で追加。
    さらにターゲットとしてOCTを選択する。


  2. Counter.hに下記コードを追加。

    #import <Cocoa/Cocoa.h>


    @interface Counter : NSObject {

    int number;

    }


    @property(readwrite) int number;


    - (void)countUp;

    @end



  3. Counter.mに下記コードを追加。

    #import "Counter.h"


    @implementation Counter


    @synthesize number;


    - (void)countUp

    {

    number++;

    }

    @end



テストケースの作成

ここで追加するコードはすべてガベージコレクションが有効になっていることを前提にしている。
ガベージコレクションの設定方法は「ガベージコレクションの設定」で解説する。
      1. 新規ファイルとして、[Objective-C test case class] をCounterTestCase.mという名前で追加。
        さらにターゲットとしてUnit Testsを選択する。


      2. CounterTestCase.hに下記コードを追加。

        #import <SenTestingKit/SenTestingKit.h>

        #import "Counter.h"


        @interface CounterTestCase : SenTestCase {


        }

        - (void)testCountUp;

        @end


        ここで重要なポイントが2つある。
        1つ目は、テストケースとして作成したクラス(CounterTestCase)が SenTestCase のサブクラスであるということ。
        2つ目は、テスト用メソッド(testCountUp:)の名前が「test」から始まっていること。
        Unit Testsターゲットをビルドする際には、SenTestCaseのサブクラスのうち、testから
        始まるメソッドが実行される。そのため、どちらかが抜けていた場合はテストが実行されないことになる。


      3. CounterTestCase.mに下記コードを追加。

        #import "CounterTestCase.h"


        @implementation CounterTestCase

        - (void)testCountUp

        {

        Counter *testCounter = [[Counter alloc] init];

        [testCounter countUp];

        STAssertEquals([testCounter number], 1, @"testCountUp failed");

        }

        @end


        STAssertEquals()等のマクロの使用方法は「参考文献」のリンク先を参照。

      ガベージコレクションの設定

      ガベージコレクションの設定はOCUnitとは無関係だが、メモリ管理が面倒なので有効にする。
      1. Xcode左側の [グループとファイル] ペインから、一番上にある [OCT] を選択。

      2. [ファイル] メニューから [情報を見る] を選択し、情報ウィンドウを開く。
        そして設定内容が Debug 構成と Release 構成の両方で有効になるように
        左上にある [構成] で [すべての構成] を指定する。

      3. [ビルド] タブで [Objective-C ガベージコレクション] が見付かるまでスクロールする。
        そして [必須[-fobjc-gc-only]] を選択。

      ビルド(テスト開始)

      1. ビルド対象となるターゲットを Unit Tests に変更する。


      2. ビルドを実行すると、自動的にテストが実行される。
        テスト結果はビルド結果ウィンドウで確認する。



      3. testCountUp:メソッドの STAssertEquals() の第2引数を「1」から「2」に変更して
        ビルドすると、テストに失敗する。


      4. おわり


      テストが成功するはずなのにビルドできない

      テストが失敗してビルドできないのではなく、他の原因が考えられる場合
      下記内容をチェックすると何か分かるかもしれない。
      • SenTestingKit.frameworkの場所
        いくつかのウェブサイトで「SenTestingKit.framework が /System/Library/Frameworks ではなく
        /Developer/Library/Frameworks に存在するためXcodeでビルドに失敗する」という記述を見かけた。
        ビルドするには下記コマンドで、/System/Library/Frameworks にシンボリックリンクを貼る必要があるらしい。
        $ sudo ln -s /Developer/Library/Frameworks/SenTestingKit.framework /System/Library/Frameworks/SenTestingKit.framework
        しかし、今回の実習環境では上記の現象は発生しておらず、シンボリックリンクを貼る必要もなかった。

      ダウンロード

      実習で作成したプロジェクト: OCT.zip

      参考文献

      Automated Unit Testing with  Xcode 3 and Objective-C
      http://developer.apple.com/mac/articles/tools/unittestingwithxcode3.html

      Č
      ċ
      ď
      OCT.zip
      (26k)
      old sm,
      2010/07/29 3:53