怎麼在開發iOS 程的專案裡使用Unit Test。
主要的參考來源還是來自Apple的官方文件
http://goo.gl/tDsLh
筆者自己實地演練一下來和大家分享一些心得
首先要和大家說Test有兩種
Logic Test
Application Test
這兩種都會和大家介紹
Logic Test主要就是在測試自己寫的Object有沒有logic上的問題在simulator上就可以測試
Application Test就是在測試整個iOS程式有沒有和我們想像的不一樣?文件上是寫要在Device上跑
Logic Test
首先我們來看看Logic Test的起手式也就是日文的手順
第一步就是打開我們的Project
如果沒有就新產生一個Project 叫NewApp好了 (本文是以iPhone SDK 4.1為測試環境)
接下來要開啟一個新的Target叫LogicTests。從Target按下右鍵->Add...-> New Target
請選擇Unit Test Bundle
接著命名為 NewLogicTests
按下Finish之後呢會看到新增的Target
接下來我們要新增測試的Class,有個專名詞叫Test Case
首先在Groups & Files 先產生一個Group專門用來放測試用的Class,叫Tests
接著在Tests裡新增一個Test Case叫NewLogicTests.m,先New File然後選iOS 裡的 Cocoa Touch Class , Objective-C test case class
記得要打勾.h也要產生,還有Target只能有NewLogicTests如圖
完成後可以在Tests這個Group看到NewLogicTests.h和NewLogicTest.m這兩個檔案
如果這個時候,我們選擇Target是NewLogicTests的時,就直接Build & Run
我們會看到3個error產生(如果是4.2就不會產生3個)
前兩個error是因為4.1版本的問題,需要採用 https://gist.github.com/586296 網友所提供的方法
就是把上面連結的檔案拉到Project裡就可以看到修正後的模樣(4.2無需做此動作)這個error要怎麼去掉呢?注意看一下NewLogicTests.h裡最上方有一行
#define USE_APPLICATION_UNIT_TEST 1
預設是做application test,但是我們要的是logic test,所以要改成
我們可以在Build -> Build Result看到都是綠色的了,成功。#define USE_APPLICATION_UNIT_TEST 0
做測試呢第一件事就是產生error來看看是不是測試功能有沒有正常
於是我們在NewLogicTests.m檔裡加上
會.m長成這樣。-(void) testFail{STFail(@"fail is not bad");
}
#import "NewLogicTests.h"Build Result 就又會看到錯誤了,不過這次是我們自己加的只是測試功能是不是正常。
@implementation NewLogicTests
#if USE_APPLICATION_UNIT_TEST // all code under test is in the iPhone Application
- (void) testAppDelegate {
id yourApplicationDelegate = [[UIApplication sharedApplication] delegate];
STAssertNotNil(yourApplicationDelegate, @"UIApplication failed to find the AppDelegate");
}
#else // all code under test must be linked into the Unit Test bundle
- (void) testMath {
STAssertTrue((1+1)==2, @"Compiler isn't feeling well today :-(" );
}
-(void) testFail{
STFail(@"fail is not bad");
}
#endif
@end
然後把 -(void) testFail{} 註解掉,就可以開始正常寫test case 了。
Application Test
接下來就是教大家設定Application Test因為這個Test要用到UIApplication所以官方文件上是教大家在Device上面做測試
為了乾淨起見,再開另一個新的Project也叫NewApp但放在不同的資料夾
接著復製原有的Target NewApp只要在其上按右鍵 Duplicate
接著把新的Target命名為NewAppTesting
再新增一個Unit Test Bundle 的Target,在"Target"上按右鍵Add -> New Target
選擇Unit Test Bundle
取命為AppTests
之後會在Group & Files 看到新的Unit Test Bundle Target
然後我們新增Unit Test 的Test Case在Classes Group下Add -> New File 選Objective-C test case class 取名為AppTests把Target AppTests打勾
會看到.h, .m在Groups & Files
因為在用Application Test的時候需要有一個UIApplication在執行,所以我們要把NewAppTesting和AppTests這兩個Target關連起來,方法就是把AppTests拉到NewAppTesting底下
接下來把Products Group打開會看到一個叫AppTests.octest的紅紅的檔案
接下來把這個檔案拉到剛剛的NewAppTesting這個Target 底下的Copy Bundle Resources
接下來就是在左上方把Target 選為NewAppTesting, 要用Device來跑
提醒大家一下,每個Target都有自己的plist哦,所以剛剛NewAppTesting的plist應該是在Resource下叫NewApp-Info copy.plist
在Console 會看到這樣的結果
列給大家看
Test Suite '/var/mobile/Applications/xxxxxxxxxxxxxxxxxxxxxxxx/NewApp.app/AppTests.octest(Tests)' started at 2010-11-04 03:23:23 GMT
Test Suite 'AppTests' started at 2010-11-04 03:23:23 GMT
Test Case '-[AppTests testAppDelegate]' started.
Test Case '-[AppTests testAppDelegate]' passed (0.000 seconds).
Test Suite 'AppTests' finished at 2010-11-04 03:23:23 GMT.
Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.004) seconds
Test Suite '/var/mobile/Applications/xxxxxxxxxxxxxxxxxx/NewApp.app/AppTests.octest(Tests)' finished at 2010-11-04 03:23:23 GMT.
Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.009) seconds
Test Suite 'All tests' finished at 2010-11-04 03:23:23 GMT.
Executed 1 test, with 0 failures (0 unexpected) in 0.000 (0.034) seconds
就是都通過測式了,接著就是要給一個自己的錯誤
在AppTest.m裡打上
位置要放對-(void) testFail {
STFail(@"Fault is not always bad.");
}
然後執行就會在Console看到
出現錯誤了,耶??
那接下來就可以開始測試,記得把-(void) testFail{}給註解掉
沒有留言:
張貼留言