2013年9月19日木曜日

GHUnit のさわりまで使ってみた

GHUnit の導入までを覚えてとして書いておく。
参考とさせていただいたのは、こちら

GHUnitで単体テストをしてみよう
http://alpha.mixi.co.jp/2012/10858/

そのまんまと言う事と、参考先の方が絵があるのでわかりやすい。
(じゃ何でコレ書くの?となるが、やった記録なので。。。)

1. ファイルの入手
github から
https://github.com/gabriel/gh-unit/downloads

今回は、GHUnitIOS-0.5.6.zip — GHUnitIOS 0.5.6 for iOS (Simulator/Device)を使う。

取得した zip を展開する。
GHUnitIOS.framework というフォルダが出来る。
これを組み込んでいく。

2. ターゲットプロジェクト作成
ここでは、確認用なので適当なプロジェクトを作成する。
Xcode から Single View Application を選択
オプションは好みで(Include Unit Tests は不要)

3. テストプロジェクトの追加
2. のプロジェクト作成後、プロジェクトのページを開き
Add Target を押す。

テスト用のプロジェクトなので、Empty Application で良いので選択する。
プロジェクト名はテスト用とわかりやすいようにした方が良いかもしれない。

これで、ターゲットプロジェクト内に、テストプロジェクトが作成される形となる。

4. テストプロジェクトの不要ファイルの削除
テストプロジェクト内(テストプロジェクトのフォルダ内)は、
  • xxxx-Info.plist
  • xxxx-Prefix.pch
以外は不要になるので、上記以外は全て削除する。

5. GHUnit フレームワークを組み込む
ターゲットプロジェクトの Frameworks のフォルダを右クリックし
Add Files to ... をクリックして 1. で入手したフォルダを指定する。
この時、Destination のチェックは要。
Add to targets には、ターゲット/テスト両プロジェクトを指定する。

これで、Frameworks のフォルダに GHUnitIOS.framework が追加される。

6. GHUnit を使ったコンパイル時の設定
プロジェクトのページの TARGET で、テストプロジェクトを選択し、
Build Settings の Other Linker Flags の項目に 「-ObjC」 を追加する。

7. テストメインファイルの作成
テストプロジェクトに、main となるファイルを作成する。
クラスファイルで良い。
名前は任意(SampleTestMain.m/h)
    
    #import <Foundation/Foundation.h>

    @interface SampleTestMain : NSObject

    @end
   
    #import <GHUnitIOS/GHUnit.h>
    #import <GHUnitIOS/GHTesting.h>


    void exceptionHandler(NSException *exception) {
    //    NSLog(@"%@\n%@", [exception reason], GHUStackTraceFromException(exception));
        NSLog(@"%@\n%@", [exception reason], [GHTesting descriptionForException:exception]);
    }

    int main(int argc, char *argv[]) {
        NSSetUncaughtExceptionHandler(&exceptionHandler);
        
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        
        int retVal = 0;
        if (getenv("GHUNIT_CLI")) {
            retVal = [GHTestRunner run];
        } else {
            retVal = UIApplicationMain(argc, argv, nil, @"GHUnitIPhoneAppDelegate");
        }
        
        [pool release];
        return retVal;
    }
GHUStackTraceFromException(exception) でエラーになるので変更した。

8. テストプロジェクトの確認
この状態で、テストプロジェクトを Scheme から選択して実行すると、
GHUnit 用のアプリが立ち上がるはず(テーブルの画面)

9. テスト対象メソッドの作成
ターゲットプロジェクトに、テスト対象となるクラスを作成する。
今回は、割り算して結果を切り上げる動きをするクラス Calc を作成。
    #import <Foundation/Foundation.h>

    @interface Calc : NSObject

    + (NSInteger)divideRoundUp:(NSInteger)numerator denominator:(NSInteger)denominator;

    @end
    #import "Calc.h"

    @implementation Calc

    + (NSInteger)divideRoundUp:(NSInteger)numerator denominator:(NSInteger)denominator {

        CGFloat value = (CGFloat)numerator / (CGFloat)denominator;
        return floor(value);

    }

    @end
10. テスト用クラスの作成
テストプロジェクトにテスト用のファイルを作成する。
今回は、上記の Calc をテストするので CalcTest と言う名前のクラスを作成
    #import <Foundation/Foundation.h>

    @interface CalcTest : GHTestCase{
        
    }

    @end
    #import <GHUnitIOS/GHUnit.h>

    #import "CalcTest.h"
    #import "Calc.h"

    @implementation CalcTest

    // デフォルトはNOですが、UIのテストやメインスレッドに依存するテストを行う場合はYESにします。
    - (BOOL)shouldRunOnMainThread {
        return NO;
    }

    // 本クラスが実行される前に呼び出されます。
    - (void)setUpClass {
    }

    // 本クラスが終了された後に呼び出されます。
    - (void)tearDownClass {
    }

    // 本クラスの各メソッドが実行される前に呼び出されます。
    - (void)setUp {
    }

    // 本クラスの各メソッドが終了された後に呼び出されます。
    - (void)tearDown {
    }

    // 「test~」というメソッド名にすることでテスト対象一覧に出力されます。
    - (void)testDivideRoundUp {
        NSInteger num = [Calc divideRoundUp:100 denominator:3];
        GHAssertEquals(num, 34, @"test");
    }

    @end
11. テストの実行
テスト記述ができたら、テストのプロジェクトを動かすとテストが動く
右上の Run ボタンを押しても良い

12. わざと間違う
間違えの検出ができるか確認するために、わざと間違えて確認する。
    #import "Calc.h"

    @implementation Calc

    + (NSInteger)divideRoundUp:(NSInteger)numerator denominator:(NSInteger)denominator {

        CGFloat value = (CGFloat)numerator / (CGFloat)denominator;
    //    return ceil(value); ここを変える
        return floor(value);

    }

    @end
この状態で、再度実行するとエラーが出るはず。

エラー内容については、シミュレータ側に表示される。

これで、とっかかりまではできたので作っていくだけ。

0 件のコメント:

コメントを投稿