2013-02-21 24 views
0

的例子我正在研究這些之間的差異,並不能理解差異。這對我來說似乎是一樣的。 Arent他們一樣嗎?風險來自短路,不是嗎?問題與決策和聲明覆蓋率的缺點

語句覆蓋不要求測試邏輯運算符。在C++ 和C中,這些運算符是& &,||和?:。聲明範圍不能由 區分由邏輯運算符分開的代碼與 聲明的其餘部分。在語句中執行代碼的任何部分會導致語句覆蓋率聲明完全覆蓋整個語句。當邏輯運算符避免不必要的評估(通過短路)時, 語句覆蓋給出了誇大的覆蓋率測量。

void function(const char* string1, const char* string2 = NULL); 
... 
void function(const char* string1, const char* string2) 
{ 
    if (condition || strcmp(string1, string2) == 0) // Oops, possible null pointer passed to strcmp 
    ... 
} 

判定覆蓋 - 的缺點是,此度量忽略由於短路 運營商發生布爾表達式內 分支。例如,請考慮下面的C/C++/Java代碼片斷 :

if (condition1 && (condition2 || function1())) 
    statement1; 
else 
    statement2; 

回答

1

他們是略有不同,但都需要短路操作來演示該問題爲你正確地推測。

問題的語句覆蓋

if (complex-condition-evaluation-with-short-circuits) 
    doAction(); 

語句覆蓋可以記錄您訪問了上述各行的,但你可能永遠不會知道,如果你執行的只有複雜條件下的部分進行評估的情況。

即你的例子中是否曾經執行過strcmp(...)?與分支覆蓋

if (complex-condition-evaluation-with-short-circuits) 
    doAction(); 
else 
    doOtherAction(); 

分支覆蓋

問題可以記錄你穿過的(源)代碼的所有路徑,但會忽略那些複雜的狀況評估的一部分分支(如說明) 。

即在您的示例分支覆蓋不考慮||作爲備用分支,並認爲它只有兩個通過代碼的路徑,實際上它是四個。

path1 (calls doAction) => condition1 == true, condition2 == true, function1() == ? 
path2 (calls doAction) => condition1 == true, condition2 == false, function1() == true 
path3 (calls doOtherAction) => condition1 == true, condition2 == false, function1() == false 
path4 (calls doOtherAction) => condition1 == false, condition2 == ?, function1() == ? 

我希望這有助於

+0

謝謝。只是爲了分支機構的報道,我不明白四個分支是什麼意思 - 我認爲它總是是真的還是假的。 – user970696 2013-02-21 09:25:16

+0

'if(...)'將評估爲true/false,但有4種情況需要測試,以便完全測試代碼中的所有分支/路徑。即在測試中,我可以執行路徑,使得我訪問了statement1和statement2而不執行function1() - 這是不好的,因爲function1可能有問題,我們不想在生產中找到它。 – 2013-02-21 09:48:58

0

據我看到的,在這些例子的風險從短路來了,他們是那種相當於確實如此。在其他一些情況下,可能會有所不同。例如,考慮以下情況:

if (a>5) 
    b = 6 
if (a<20) 
    c = 4 + b 

對於語句覆蓋就足夠用a=10測試(所有行會得到執行)和測試也就過去了。

對於決策覆蓋率,有必要評估所有if語句是否爲true和false。例如,使用兩個測試a=30a=0可以實現100%的決策覆蓋率。後者將失敗,因爲在這種情況下變量b尚未設置。

因此,決策覆蓋更強大;實際上100%的決策覆蓋率保證了100%的聲明覆蓋率,但反之亦然。但是,如果決策覆蓋不足以揭示錯誤,無論語言是否存在短路,構建示例仍然是可行的。

讓我們考慮的情況下就不會有短路

if (a>0 || b>0) 
    c = 5/b 

讓我們來測試這個與輸入數據= 0; B = 1; a = 0,b = 0。第一個足以提供聲明範圍。兩者一起提供決策覆蓋。但是,如果不在內部暴露零分。