2010年11月3日 星期三

Objecitive-C - Unit Test 設定

這篇文章主要是教導大家
怎麼在開發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,所以要改成
#define USE_APPLICATION_UNIT_TEST 0
我們可以在Build -> Build Result看到都是綠色的了,成功。

做測試呢第一件事就是產生error來看看是不是測試功能有沒有正常
於是我們在NewLogicTests.m檔裡加上
-(void) testFail{
    STFail(@"fail is not bad");
}
會.m長成這樣。
#import "NewLogicTests.h"

@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
 Build Result 就又會看到錯誤了,不過這次是我們自己加的只是測試功能是不是正常。
 然後把 -(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{}給註解掉

沒有留言:

張貼留言