Tag: Objective-C Xcode
目次 †
参考情報 †
基本 †
- 標準のSenTestingKitが使いにくいので(デバッガ使えないし)、iUnitTestを使ってみる。
インストール †
ダウンロード †
http://github.com/katsuyoshi/iunittest からダウンロード
git clone http://github.com/katsuyoshi/iunittest.git
自分用
git clone git@github.com:src256/iunittest.git
本体のインストール †
ダウンロードしたフォルダに移動しsetup実行
sudo ./setup
オープンコードのインストール †
サンプルプロジェクト作成 †
- チュートリアル通りに実行できなかった。
- UINavigationBarBasedTestのテンプレートがなくなっているのでUITableViewControllerTest subclassを使ってみた(2010/07/30)
ターゲットの作成 †
- Navigationベースで新規プロジェクトを作成。名前は"Prefectures"。
- RootViewController.hを修正。
@interface RootViewController : UITableViewController {
NSArray* dataSource;
}
- RootViewController.mを修正。
- (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;
}
テストプロジェクトの作成 †
- ファイル→新規プロジェクト→User Templates →Application→iUnitTest Applicationを選択。名前は"PrefecturesTest"。
- とりあえず一回実行して失敗することを確認。
- TargetClassに"Prefectures"プロジェクトのRootViewController.[h,m]を追加。参照。
- Testsクラスを右クリックして、追加→新規ファイルで、UITableViewControllerTest subclassを選択。名前は"RootViewControllerTest"
- RootViewController.mを編集。デフォルトのテストを削除し以下に置き換える。
- (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 †
ASSERTマクロの使い分け †
[iPhone][Develop][Test] iUnitTestを使ってみた。 - Ni chicha, ni limona - 平均から抜けられない僕 - iPhoneアプリ開発グループより
| 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) | 例外指定 |
特定クラス・メソッドのみ実行 †
iUnitTestでやった事 - リンゴの水やり?(はてな)によるとiPhoneのUIには仕組みが準備されてないので、テストコード変更する。#define TEST_ALWAYSを有効にする。
// 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