cedarJasmineRobolectric 等他の言語でもテスティングフレームワークを色々と作成しているPivotal Labs.によるObjective-C向けのBDDテスティングフレームワークです。

今回は適当な導入方法について

まずはCedar-iOS static frameworkをビルドするために、Githubからcedarをcloneします。

➜  objectiveC  git clone --recursive https://github.com/pivotal/cedar.git

submoduleも含めて持ってきたいので–recursiveオプションでまとめてcloneします。

ダウンロードしたプロジェクトをXCodeで開く

➜  objectiveC  open cedar/Cedar.xcodeproj

NewImage

NewImage

ビルドすると、ProductsディレクトリにiPhoneUniversalのディレクトリがあるので、そこからcedar-iOS.frameworkを取り出しておく。
(イマイチ簡単にProductsディレクトリを開く方法がわからなかったので、cedar.frameworkをShow In Finderするなどして辿った)

プロジェクトに組み込む

GHUnitのようにアプリケーションとして動作させるので、プロジェクト作成時にInclude Unit Testはチェックしなくていい。
適当なプロジェクト名でEmpty Applicationなどを選んでプロジェクトを作成する。

次にテスト用のTargetを追加する。
add Targetから”UISpecs”というような名前をつけたTargetを追加する。
(この時Unit Test Bundleではなくアプリケーションから選ぶ、今回はEmpty Application)

NewImage

Target UISpecsの方に対して、先程ビルドしたcedar-iOS.frameworkを追加する。

NewImage

Target UISpecsのBuild SettingのOther Linker Flagsに対して-ObjC と -all_load を追加する

NewImage

最後にmain.mの書き換えを行う。
CedarApplicationDelegateを見に行くように書き換える(元々あるAppDelegateは消しても問題ない)

#import <UIKit/UIKit.h>
#import <Cedar-iOS/Cedar-iOS.h>

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, @"CedarApplicationDelegate");
    [pool release];
    return retVal;
}

この状態になったら多分Runから起動できるようになる。
GHUnitと同じようにアプリケーションとして起動して、テスト毎にUITableViewで表示するような形になっている。

次はテストケースを書いてみる。
TestSample.mみたいな適当なクラスを追加する。

#import <Cedar-iOS/SpecHelper.h>

SPEC_BEGIN(FooSpecs)

describe(@"Something that shares behavior", ^{
    itShouldBehaveLike(@"a similarly-behaving thing");
});

describe(@"Something else that shares behavior", ^{
    itShouldBehaveLike(@"a similarly-behaving thing");
});

SPEC_END

実行してみると次のようにTableViewにグリーン、レッドが表示される

NewImage

 

これで、アプリケーションテストのために導入する方法は終わりなのだが、
cedarには C++ templatesを利用したMatchersというメソッドの書き方のセットが用意されていて、
それを利用するためにはObjective-C++でテストケースを書けるようにする必要がある。

先ほどの状態のままテストケースの書き方を少し変更するだけで Matchers の機能が利用できるようになる。
まずは、拡張子を.mmにしたTestSample.mmという感じにして次のようなファイルを作成する。

#import <Cedar-iOS/SpecHelper.h>

using namespace Cedar::Matchers;

SPEC_BEGIN(FooSpecs)

describe@"a similarly-behaving thing", ^{
    it(@"should do something common", ^{
        NSString *aString = @"something";
        expect(aString).to(equal(@"something"));
    });
});

describe(@"1 + 2", ^{
    it(@"should be 3", ^{
        1 + 2 should equal(3);
    });
});

SPEC_END

このようにusing namespace Cedar::Matchers;を入れることでMatchersを使ったテストケースを書けるようになる。
1 + 2 should equal(3); のように書けたりするので便利な気がする。

メソッドについては pivotal/cedar – GitHubを見る。

まとめると次のような変更を行えばいい。

  • 拡張子を.mmへ変更
  • using namespace Cedar::Matchers; をSPEC_BEGINの前に入れる

今回書いたサンプルはazu/Cedar-sample – GitHubに置いてあります

ものすごく簡略化した導入方法を紹介したが、Cedarはかなり色々な事ができるように作られてるようなので、今回の内容はごくごく一部な気がします。
OCUnit Logic Tests というように アプリケーションとしてではなくてOCUnitみたいにメニューのTestからテストできるようにもできたり、
標準でJUnit XMLレポートを出力できるなど 色々と奥が深そうです。

 

Post Navigation