&tag(Objective-C, Xcode); *目次 [#b77a5860] #contents *参考情報 [#c0bff3e2] -[[iUnitTest - リンゴの水やり?(はてな):http://d.hatena.ne.jp/gutskun/20090130/1233285096]] -[[[iPhone][Develop][Test] iUnitTestを使ってみた。 - Ni chicha, ni limona - 平均から抜けられない僕 - iPhoneアプリ開発グループ:http://iphone-dev.g.hatena.ne.jp/paella/20090528/1243500045]] *基本 [#i098b51f] -標準のSenTestingKitが使いにくいので(デバッガ使えないし)、iUnitTestを使ってみる。 *インストール [#rb22da9b] **ソースのダウンロード [#x58ef51f] **ダウンロード [#x58ef51f] http://github.com/katsuyoshi/iunittest からダウンロード git clone http://github.com/katsuyoshi/iunittest.git 自分用 git clone git@github.com:src256/iunittest.git **セットアップ [#g05cbb48] **本体のインストール [#g05cbb48] ダウンロードしたフォルダに移動しsetup実行 sudo ./setup **オープンコードのインストール [#r56c7f7c] -シミュレータでエラーになった行をXcodeで表示してくれるopencodeというツールも同時にインストールしておく。 -tools/opencodeに移動。 cd tools/opencode -opencode.xcodeprojをXcodeで開きビルド(Releaseが良い?) -バイナリを/usr/local/binにコピー sudo cp build/Release/opencode /usr/local/bin -installスクリプトを実行。ログイン時に自動起動する設定になる。 ./install -ログアウト&ログイン。 *サンプルプロジェクト作成 [#q760a6bd] -チュートリアル通りに実行できなかった。 -UINavigationBarBasedTestのテンプレートがなくなっているのでUITableViewControllerTest subclassを使ってみた(2010/07/30) **ターゲットの作成 [#k53f986a] -Navigationベースで新規プロジェクトを作成。名前は"Prefectures"。 -RootViewController.hを修正。 #pre{{ @interface RootViewController : UITableViewController { NSArray* dataSource; } }} -RootViewController.mを修正。 #pre{{ - (void)viewDidLoad { [super viewDidLoad]; dataSource = [[NSArray alloc] initWithObjects: [NSArray arrayWithObject:@"Hokkaido"], [NSArray arrayWithObjects:@"Aomori", @"Iwate", @"Akita", @"Yamagata", @"Miyagi", @"Fukusima", nil], nil]; } - (void)dealloc { [dataSource release]; [super dealloc]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return dataSource.count; } }} **テストプロジェクトの作成 [#f90b0e85] -ファイル→新規プロジェクト→User Templates →Application→iUnitTest Applicationを選択。名前は"PrefecturesTest"。 -とりあえず一回実行して失敗することを確認。 -TargetClassに"Prefectures"プロジェクトのRootViewController.[h,m]を追加。参照。 -Testsクラスを右クリックして、追加→新規ファイルで、UITableViewControllerTest subclassを選択。名前は"RootViewControllerTest" -RootViewController.mを編集。デフォルトのテストを削除し以下に置き換える。 #pre{{ - (NSString *)viewControllerName { return @"RootViewController"; } - (BOOL)hasNavigationController { return YES; } - (void)testNumberOfSectionsInTableView { // ASSERT_FAIL(@"not implemented"); ASSERT_EQUAL_INT(2, [self.tableViewController numberOfSectionsInTableView:self.tableViewController.tableView]); } }} -実行して成功すればOK。 *Tips [#ad859bf1] **ASSERTマクロの使い分け [#x76ea0d1] [[[iPhone][Develop][Test] iUnitTestを使ってみた。 - Ni chicha, ni limona - 平均から抜けられない僕 - iPhoneアプリ開発グループ:http://iphone-dev.g.hatena.ne.jp/paella/20090528/1243500045]]より |ASSERT(value)|真の場合OK| |ASSERT_FAIL(m)|常に失敗| |ASSERT_SAME(_expected, _value)|==演算子で比較| |ASSERT_NOT_SAME(_expected, _value)|==演算子で比較| |ASSERT_EQUAL(_expected, _value)|isEqualメソッドで比較| |ASSERT_NOT_EQUAL(_expected, _value)|isEqualメソッドで比較| |ASSERT_EQUAL_INT(_expected, _value)|int型特化| |ASSERT_NOT_EQUAL_INT(_expected, _value)|int型特化| |ASSERT_EQUAL_FLOAT(_expected, _value)|float型特化| |ASSERT_NOT_EQUAL_FLOAT(_expected, _value)|float型特化| |ASSERT_EQUAL_FLOAT_DELTA(_expected, _value, _delta)|float型特化。許容誤差指定| |ASSERT_EQUAL_DOUBLE(_expected, _value)|double型特化| |ASSERT_NOT_EQUAL_DOUBLE(_expected, _value)|double型特化| |ASSERT_EQUAL_DOUBLE_DELTA(_expected, _value, _delta)|double型特化。許容誤差指定| |ASSERT_NIL(_value)|nilかどうか| |ASSERT_NOT_NIL(_value)|nilかどうか| |ASSERT_EQUAL_POINT(_expected, _value)|CGPoint型特化| |ASSERT_EQUAL_SIZE(_expected, _value)|CGSize型特化| |ASSERT_EQUAL_RECT(_expected, _value)|CGRect型特化| |ASSERT_RAISE(expr)|例外指定| |ASSERT_NOTHING_RAISED(expr)|例外指定| **特定クラス・メソッドのみ実行 [#ocf217e6] [[iUnitTestでやった事 - リンゴの水やり?(はてな):http://d.hatena.ne.jp/gutskun/20091126/1259173258]]によるとiPhoneのUIには仕組みが準備されてないので、テストコード変更する。#define TEST_ALWAYSを有効にする。 #pre{{ // Uncomment it, if you want to test this class except other passed test classes. //#define TESTS_ALWAYS #ifdef TESTS_ALWAYS - (void)testThisClassAlways { ASSERT_FAIL(@"fail always"); } + (BOOL)forceTestsAnyway { return YES; } #endif }}