iOSユニットテスト


変換元:http://www.cnblogs.com/kesalin/archive/2011/12/23/cocoa_ocunit_ocmock.html
XCodeにはOCUnitユニットのテストフレームワークが内蔵されていますが、現在最もよく使われているテストフレームワークはGHUnitであるべきです.GHUnit+OCMockの組み合わせにより、iOSでより強力なユニットテスト機能を行うことができます.ここでは、XCode 4.2でOCUnit、GHUnit、OCMockを使用してユニットテストを行う方法を示します.
OCUnit
XCodeの下にOCUnitProjectプロジェクトを新規作成し、Include Unit Tests選択ボックスを選択します.
iOS单元测试_第1张图片
OCUnitフレームワークでは、Unit Testフレームワークコードが自動的に追加されます.
iOS单元测试_第2张图片
 
XCodeはOCUnitProjectTestsにあります.mではFailのテストを自動的に生成しました.
- (void)testExample
{
STFail(@"Unit tests are not implemented yet in OCUnitProjectTests");
}

 
Testを実行して、効果を見てみましょう.
iOS单元测试_第3张图片
 
図の赤い下線の部分から、テストは合格せず、予想に合致していることがわかります.我々はクラスOCUnitProjectTestsのようにSenTestCaseクラスから継承されたサブクラスを記述し、その中に「-(void)testXXX();のテスト関数も可能ですが、パラメータなしで返されるタイプであり、名前がtestを接頭辞とする関数である必要があります.
OCUnitの少しは公式サポートで、XCodeに統合したほうがいいです.
 
GHUnit
GHUnitはオープンソースのユニットテストフレームワークであり、可視化インタフェースを有し、機能もかなり強い.MarkはOCUnit vs GHUnit の文章を書いていて、興味のある子供靴は見てもいいです.OCMockは、Mulle KybernetikがOS XおよびiOSプラットフォームのために作成したmock objectのコンセプトに従ったユニットテストフレームワークである.
 
GHUnitとOCMockの構成方法について説明します
1まず、GHUnitProjectという単一ビューアプリケーションを作成します.Include Unit Tests選択ボックスを選択しないでください.次に実行すると、白い画面が表示されます.
2、新しいtest targetを追加し、左の工事名を選択し、右側のAdd Targetをクリックし、TestsというEmpty Applicationアプリケーションを追加し、GHUnitProjectに付属させる注意:Include Unit Tests選択ボックスを選択しないでください.
iOS单元测试_第4张图片
iOS单元测试_第5张图片
 
3,TestsエンジニアリングにGHUnitIOS Frameworkを追加する.まずXCodeバージョンに対応するGHUnitIOS Frameworkをダウンロードします.英語の良いのは直接公式iOS版のインストールドキュメントを見ることができます:ここをクリックして表示、この第3節をスキップします;さもないと続けて見てください.
3.1 GHUnitIOSフレームワークをGHUnitProjectの下に解凍し、GHUnitIOS.frameworkはTestsと同じディレクトリの下にあります.
3.2、XCodeに戻り、工事中のFrameworksグループを右クリックし、Add Files to...メニュー、GHUnitIOSを選択framework、targetsはTestsを選択することに注意してください.
iOS单元测试_第6张图片
3.3,Testsの設定Build Settings:Other Linker Flagsに2つのflagを追加する:-ObjCと-all_load.
iOS单元测试_第7张图片
3.4、Tests工事中のUTSAppDelegateを削除する.hとUTSAppDelegate.m 2つのファイル;
3.5、Tests工事中のmainを修正する.mは:
#import <UIKit/UIKit.h>
#import <GHUnitIOS/GHUnitIOSAppDelegate.h>

int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([GHUnitIOSAppDelegate class]));
}
}


 
3.6,コンパイルターゲットTests>iPhone 5.0 Simulatorを選択し,コンパイル運転を行うと,次のような効果が得られるはずである.現在、実際のテストは作成されていないので、リストは空です.
iOS单元测试_第8张图片
 
4,GHUnitテストを作成する.TestsエンジニアリングにGHUnitSampleTestというObjective C classを追加します.その内容は以下の通りである:GHUnitSampleTest.h
#import <GHUnitIOS/GHUnit.h> 

@interface GHUnitSampleTest: GHTestCase
{
}

@end


GHUnitSampleTest.m
#import "GHUnitSampleTest.h"

@implementation GHUnitSampleTest

- (void)testStrings
{
NSString *string1 = @"a string";
GHTestLog(@"I can log to the GHUnit test console: %@", string1);

// Assert string1 is not NULL, with no custom error description
GHAssertNotNULL(string1, nil);

// Assert equal objects, add custom error description
NSString *string2 = @"a string";
GHAssertEqualObjects(string1, string2, @"A custom error message. string1 should be equal to: %@.", string2);
}

@end


 
次にコンパイルして実行し、Runをクリックすると、次のような効果が得られます.
iOS单元测试_第9张图片
 
図中のすべての欄には従ってのテストが表示され、Failed欄には合格しなかったテストが表示されます.強いでしょう、GHUnit.GHUnitSampleTestに新しいテストを追加できます.たとえば、次のようにします.
- (void)testSimpleFail
{
GHAssertTrue(NO, nil);
}

 
Testsには、GHTestCaseから継承され、そのテストメソッドがパラメータなしで戻り値がなく、メソッド名がtestを接頭辞とする限り、より多くのテストクラスを追加できます.
OCMock
OCMockを追加します.
1,OCMockを静的ライブラリで追加するしかありません.GHUnitTestディレクトリの下にLibrariesディレクトリを新規作成します.このディレクトリはTestsディレクトリと平レベルです.静的ライブラリファイルをダウンロードし、ヘッダファイルをディレクトリの下に解凍します.ファイルダウンロード:ヘッダファイルlibOCMock.a、frameworkファイル:OCMock framework、ダウンロードしたocmock-1.77.dmgを開き、その中の「Release/Library/Headers/OCMock」ディレクトリをLibrariesの下にコピーします.最終ディレクトリ構造は次のとおりです.
 
iOS单元测试_第10张图片
2,GHUnitTestプロジェクトでLibrariesというグループを新規作成しlibOCMockを導入する.aとディレクトリOCMock、targetはTestsであることに注意してください.
 
iOS单元测试_第11张图片
3,TestsのBuild Settingsを設定します.Libray Search Pathsに$(SRCROOT)/Librariesを含める:
iOS单元测试_第12张图片
 
Header Search Pathsに$(SRCROOT)/Librariesを追加し、Recursive選択ボックスを選択します.
iOS单元测试_第13张图片
 
4,OCMockテストを作成します.TestsエンジニアリングにOCMockSampleTestというObjective C classを追加します.その内容は以下の通りである:OCMockSampleTest.h
#import <GHUnitIOS/GHUnit.h>

@interface OCMockSampleTest : GHTestCase

@end

OCMockSampleTest.m
#import "OCMockSampleTest.h"
#import <OCMock/OCMock.h>

@implementation OCMockSampleTest

// simple test to ensure building, linking,
// and running test case works in the project
- (void)testOCMockPass
{
id mock = [OCMockObject mockForClass:NSString.class];
[[[mock stub] andReturn:@"mocktest"] lowercaseString];

NSString *returnValue = [mock lowercaseString];
GHAssertEqualObjects(@"mocktest", returnValue,
@"Should have returned the expected string.");
}

- (void)testOCMockFail
{
id mock = [OCMockObject mockForClass:NSString.class];
[[[mock stub] andReturn:@"mocktest"] lowercaseString];

NSString *returnValue = [mock lowercaseString];
GHAssertEqualObjects(@"thisIsTheWrongValueToCheck",
returnValue, @"Should have returned the expected string.");
}

@end


 
コンパイル運転、Runをクリックして、効果は下図のようです.
iOS单元测试_第14张图片
 
これでiOSでのOCUnit,GHUnit,OCMockユニットのテスト紹介はこれで終わります.もちろん、googleが出品したGTMなどのテストフレームワークもあります.
 
参考資料:OCMock:http://ocmock.org/ Unit Testing in Xcode 4- use OCUnit and SenTest instead of GHUnit GHUnit Reference:http://gabriel.github.com/gh-unit/