2009-06-18 65 views
1

我在我的計算機上安裝了C++作爲Visual Studio 2005插件(cpptest_7.2.11.35_win32_vs2005_plugin.exe),僅使用UnitTest許可證(僅單元測試許可證)進行測試。代碼覆蓋百分比不好

我有類似的樣本如下:

[LC=100 BC=100 PC=75 DC=100 SCC=100 MCDC=50 (%)] 

bool MyFunction(... parameters...) 
{ 
    bool bRet = true; 

     // do something 
    if(some_condition) 
    { 
     // do something 
     bRet = CallToAFunctionThatCanReturnBothTrueAndFalse.... 
    } 
    else 
    { 
     bRet = false; 
     // do something 
    } 

    if(bRet == false) 
    { 
     // do something 
    } 

    return bRet; 
} 

在我的情況下運行覆蓋工具我有以下結果(功能類似於前面提到的)之後

我真的不明白,爲什麼我沒有百分之百覆蓋PathCoverage(PC)。 另外,如果有人使用C++ Test Parasoft的經驗可以解釋低MCDC覆蓋率對我來說會很好。

我該怎麼做才能提高覆蓋率?因爲我在這種情況下沒有想法。 歡迎使用文件(的某些部分)。

謝謝

尤利安

+0

我在代碼中看到4條路徑。但是有一條路是不可能的(我相信測試工具看不到)。你測試了多少? – 2009-06-18 16:03:03

回答

2

這是關於各種代碼覆蓋範圍的很好的參考:http://www.bullseye.com/coverage.html

MCDC:要提高MCDC覆蓋率,您需要查看some_condition。假設它是一個複雜的布爾表達式,你需要看看你是否正在行使必要的值組合。具體而言,每個布爾子表達式都需要執行true和false。

路徑:在上面的鏈接中提到的作爲路徑覆蓋的缺點之一是很多路徑不可行使。你的例子可能就是這種情況。

+1

我認爲這個http://www.bullseye.com/coverage.html#basic_path是PathCoverage(PC)意義的一個很好的例子。這意味着C++測試並沒有消除「不可能」的情況。 – INS 2009-06-18 14:22:54

3

我不能和你正在使用的專用工具的幫助,但路徑覆蓋的總體思路是,通過代碼每一個可能的路徑應該被執行。

如果您通過程序繪製流程圖,在每個if/break/continue等處分支,您應該看到您的測試正在通過該程序執行的路徑。要獲得100%(這不是完全必要的,也不能保證一個完美的測試),你的測試將不得不停止每個代碼分支,執行每一行。

希望有所幫助。

+1

我知道你在說什麼,但我的猜測是C++ Test不會消除一些不可能的情況。例如,如果不執行最後一個「if」,則不能執行「else」部分。可能這種情況不會被C++ Test從可能性列表中刪除。 – INS 2009-06-18 14:05:19

+0

@Iulian:我想你在回答你自己的問題。 – 2009-06-18 14:09:22

1

您至少需要兩個測試用例才能獲得100%的覆蓋率。其中some_condition爲真,其中一個不是。如果你有,你應該得到100%的覆蓋率。

雖然你應該看到100%的覆蓋率是完美的。在這種情況下,您需要3次測試,以便測試所有組合。查看圈複雜性以瞭解更多信息。

+0

我做了所有可能的測試用例。您可以看到,線路覆蓋率(LC)和區塊覆蓋率(BC),決策覆蓋率(DC)簡單條件均衡值(SCC)爲100%。 唯一的問題是路徑覆蓋(PC)和MCDC(修改的條件,決策覆蓋率)不是100%,儘管我測試了所有的情況。這就是爲什麼我認爲這是某種C++ Test的錯誤。 – INS 2009-06-18 14:10:16

+1

@Iulian:不,我認爲這是你在其他評論中所說的。 – 2009-06-18 14:12:54

1

通過該函數有四條假想路徑。每個if-子句將路徑的數量加倍。每個if語句都是一個分支,您可以使用兩種不同的方式。所以,只要你的工具遇到「if」,它就會假定代碼可以採用「true」分支或「false」分支。但是,這並非總是可行的。考慮:

bool x = true; 
if (x) { 
    do_something(); 
} 

if語句的「false」分支無法訪問。這是一個明顯的例子,但是當你考慮幾個if語句時,就很難看出一條路徑是否可行。

代碼中只有三種可能的路徑。第一個if語句中的「false」分支和第二個中的「true」分支的路徑無法訪問。

您的工具不夠智能,無法實現這一點。這就是說,即使該工具是完美的,在實際應用中獲得100%的路徑覆蓋率可能也不太可能。但是,非常低的路徑覆蓋率肯定表明您的方法具有太高的圈複雜度。

0

就個人而言,我認爲這是不好的形式啓動任何函數

布爾RETCODE = TRUE;

你正在做一個明確的假設,它默認會成功,然後在某些條件下失敗。

程序員來之後,你不會做出這個相同的假設。

失敗快,失敗提前。如其他人所說,如果你想測試失敗案例,你必須編寫失敗的測試代碼。