トップ «前の日記(2012-06-04) 最新 次の日記(2012-06-06)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|

2012-06-05 [iOS]単体試験

Xcodeのプロジェクトの雛形には、単体試験が用意されているが、少し疑問もあったので、この機会に試してみた。

単体試験と考えると、クラス単位でインスタンスを生成して、各メソッドの動作を確認して、インスタンスを破棄という流れが思い浮かぶが、iOSアプリケーションの様に、他のクラスとの関係がある場合は、あるクラスを試験する為に、他のクラスを生成してと手順があり、このやり方は現実的でないと考えたのだろうか?単体試験を実行すると、アプリケーションが起動して、その状態で単体試験を行う仕組みになっているようだ。

最初は違和感を持ったが、こちらの方がいいと思い出してきた。

単体試験はプロジェクト生成後に組み込む事は出来るが、新規プロジェクトの作成時に用意するのが楽だ。

新規プロジェクト

サンプルコードでは、以前紹介した事がある、Documentクラスが追加されただけの状態で。

今回は、このDocumentクラスに対する単体試験のクラスDocumentTestsを追加してみた。

試験ケース

その内容だが、アプリケーション自体でDocumentクラスのインスタンスを生成しているので、それを取り出し、各メソッドに対して試験を行う。

#import <SenTestingKit/SenTestingKit.h>
#import "Document.h"
 
@interface DocumentTests : SenTestCase
 
@property (strong, nonatomic) Document  *document;
 
@end
#import "AppDelegate.h"
#import "DocumentTests.h"
 
@implementation DocumentTests
 
@synthesize document = _document;
 
- (void)setUp
{
    DBGMSG(@"%s", __func__);
    [super setUp];
    
    AppDelegate	*appl = nil;
	appl = (AppDelegate *)[[UIApplication sharedApplication] delegate];
	self.document = appl.document;
}
 
- (void)testInit
{
    DBGMSG(@"%s", __func__);
    STAssertNotNil(_document, @"初期化失敗");
    STAssertFalse(self.document.version == nil, @"メンバーversion初期化不正");
    STAssertFalse(self.document.message == nil, @"メンバーmessage初期化不正");
}
 
- (void)tearDown
{
    DBGMSG(@"%s", __func__);
    self.document = nil;
     
    [super tearDown];
}
 
- (void)testClearDefaults
{
    DBGMSG(@"%s", __func__);
    [self.document clearDefaults];
    STAssertNil([[NSUserDefaults standardUserDefaults] objectForKey:@"message"], @"初期化失敗");
}
 
- (void)testUpdateDefaults
{
    DBGMSG(@"%s", __func__);
    NSString    *msg = [[NSDate date] description];
    self.document.message = msg;
    [self.document updateDefaults];
    STAssertNotNil([[NSUserDefaults standardUserDefaults] objectForKey:@"message"], @"初期化失敗");
    STAssertTrue([msg compare:[[NSUserDefaults standardUserDefaults] objectForKey:@"message"]] == NSOrderedSame,
                 @"メンバーmessage保存失敗");
}
 
- (void)testLoadDefaults
{
    DBGMSG(@"%s", __func__);
    [self.document loadDefaults];
    STAssertFalse(self.document.version == nil, @"メンバーversion読み出し不正");
    STAssertFalse(self.document.message == nil, @"メンバーmessage読み出し不正");
}
 
@end

以下は、試験のログだ。

2012-06-06 00:04:57.633 Exam[1795:fb03] -[Document init]
2012-06-06 00:04:57.640 Exam[1795:fb03] -[Document loadDefaults]
2012-06-06 00:04:57.642 Exam[1795:fb03] read message:2012-06-05 15:02:08 +0000
Test Suite 'All tests' started at 2012-06-05 15:04:57 +0000
Test Suite '/Users/ユーザー/Library/Developer/Xcode/DerivedData/Exam-文字列/Build/Products/Debug-iphonesimulator/ExamTests.octest(Tests)' started at 2012-06-05 15:04:57 +0000
Test Suite 'DocumentTests' started at 2012-06-05 15:04:57 +0000
Test Case '-[DocumentTests testClearDefaults]' started.
2012-06-06 00:04:57.770 Exam[1795:fb03] -[DocumentTests setUp]
2012-06-06 00:04:57.771 Exam[1795:fb03] -[DocumentTests testClearDefaults]
2012-06-06 00:04:57.772 Exam[1795:fb03] -[Document clearDefaults]
2012-06-06 00:04:57.773 Exam[1795:fb03] remove message:2012-06-05 15:04:57 +0000
2012-06-06 00:04:57.774 Exam[1795:fb03] -[DocumentTests tearDown]
Test Case '-[DocumentTests testClearDefaults]' passed (0.005 seconds).
Test Case '-[DocumentTests testInit]' started.
2012-06-06 00:04:57.775 Exam[1795:fb03] -[DocumentTests setUp]
2012-06-06 00:04:57.776 Exam[1795:fb03] -[DocumentTests testInit]
2012-06-06 00:04:57.777 Exam[1795:fb03] -[DocumentTests tearDown]
Test Case '-[DocumentTests testInit]' passed (0.003 seconds).
Test Case '-[DocumentTests testLoadDefaults]' started.
2012-06-06 00:04:57.778 Exam[1795:fb03] -[DocumentTests setUp]
2012-06-06 00:04:57.779 Exam[1795:fb03] -[DocumentTests testLoadDefaults]
2012-06-06 00:04:57.780 Exam[1795:fb03] -[Document loadDefaults]
2012-06-06 00:04:57.781 Exam[1795:fb03] -[DocumentTests tearDown]
Test Case '-[DocumentTests testLoadDefaults]' passed (0.004 seconds).
Test Case '-[DocumentTests testUpdateDefaults]' started.
2012-06-06 00:04:57.782 Exam[1795:fb03] -[DocumentTests setUp]
2012-06-06 00:04:57.783 Exam[1795:fb03] -[DocumentTests testUpdateDefaults]
2012-06-06 00:04:57.784 Exam[1795:fb03] -[Document updateDefaults]
2012-06-06 00:04:57.785 Exam[1795:fb03] current aVersion:1.0
2012-06-06 00:04:57.786 Exam[1795:fb03] save message:2012-06-05 15:04:57 +0000
2012-06-06 00:04:57.788 Exam[1795:fb03] -[DocumentTests tearDown]
Test Case '-[DocumentTests testUpdateDefaults]' passed (0.007 seconds).
Test Suite 'DocumentTests' finished at 2012-06-05 15:04:57 +0000.
Executed 4 tests, with 0 failures (0 unexpected) in 0.019 (0.020) seconds
Test Suite 'ExamTests' started at 2012-06-05 15:04:57 +0000
Test Case '-[ExamTests testExample]' started.
2012-06-06 00:04:57.789 Exam[1795:fb03] -[ExamTests setUp]
2012-06-06 00:04:57.790 Exam[1795:fb03] -[ExamTests testExample]
2012-06-06 00:04:57.791 Exam[1795:fb03] -[ExamTests tearDown]
Test Case '-[ExamTests testExample]' passed (0.003 seconds).
Test Suite 'ExamTests' finished at 2012-06-05 15:04:57 +0000.
Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite '/Users/ユーザー/Library/Developer/Xcode/DerivedData/Exam-文字列/Build/Products/Debug-iphonesimulator/ExamTests.octest(Tests)' finished at 2012-06-05 15:04:57 +0000.
Executed 5 tests, with 0 failures (0 unexpected) in 0.022 (0.023) seconds
Test Suite 'All tests' finished at 2012-06-05 15:04:57 +0000.
Executed 5 tests, with 0 failures (0 unexpected) in 0.022 (0.023) seconds

合格のようだ。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/ios/Exam - GitHub

トップ «前の日記(2012-06-04) 最新 次の日記(2012-06-06)» 編集