2012-03-15 31 views
6

我正在爲iOS創建靜態庫,並試圖爲其單元測試獲取代碼覆蓋率數據。我正在使用CoverStory來可視化生成的代碼覆蓋率文件。測試異常時,XCode上的代碼覆蓋率結果不正確

我得到大多數測試的正確信息。

但是,驗證應拋出異常的任何測試都未被標記爲測試。

例如,該方法

- (void)shouldThrow:(BOOL)throw { 

    if (throw) 
     @throw [NSException exception...]; 

    NSLog(@"not thrown"); 

} 

與測試

- (void)testShouldThrow { 
    STAssertThrows([myObject shouldThrow:YES], @"Should have thrown an exception"); 

    STAssertNoThrow([myObject shouldThrow:NO], @"Should not have thrown an exception"); 
} 

測試通過了所有測試(即,異常被正確投擲)。但是,代碼覆蓋率不顯示100% - 與@throw有關的行未被標記爲測試。

任何想法?

回答

3

帶有@throw的行沒有完成(因爲異常被拋出),所以它沒有被標記爲被覆蓋。你可以提交一個bug,但是這對他們來說可能很難修復。如果它是分支語句中的一行,可能很難判斷它是否已經過測試,但是如果在執行之前有行,那麼您就必須假定它是一樣的。

壞事是你永遠無法達到100%。

+0

這就是我害怕:(:(我已經設置了斷點,所以我知道它正在測試,但它會很高興能夠自動化測試!) – deanWombourne 2012-03-19 17:45:57

0

更糟糕的問題是,似乎在相同條件塊中的@throw之前的行的計數器也不是coveralbe。因此,在@throw之前簡化寫代碼作爲標記不會幫助解決問題。

然而,我發現,條件包括變量( 「如果是(YES)」, 「如果(1 == 1)」 是不是在例)總是千分之二。因此,我們可以做的一件棘手的事情是首先定義一個微不足道的條件變量,然後在@throw之前添加一個包含該變量的條件測試。

static BOOL __trivialYES = YES; //for cover @throw, and never use 'const' 

然後

if(__trivialYES) @throw ...; 

這應該有助於問題,併爲您的方便,你可以定義自己的宏做這些事情。

#define #throw if (__trivialYES) 

,然後throw語句:

#throw ...; 

,這可能使覆蓋測試工作做得更好。

PS:'#throw'只是一個示例宏。它和其他宏一樣。 '#'只是一個有效的字符(對於一些預編譯器),這使得它看起來很特別。

相關問題