2012-10-14 23 views
0

我讀了很多關於pex的論文,我關注探索策略。我知道Fitnex策略是默認使用的,但我不明白Pex如何創建第一個參數化單元測試。理論:開始Pex探索和產生PUT的數量

我在哪裏可以找到這些信息?

通過sperimental測試中,我認爲: - 如果參數是「int」從0開始 - 如果參數是「布爾」開始與假 - 如果參數是一個對象,具有空

開始

它是正確的嗎?

現在關於Fitnex戰略和求解約束Z3我認爲它是能夠唯一一家通過迭代約束來解決,對不起,我一點英語,現在我做的一個例子:

假設有下面的方法:

public void branchOverTests(bool a, bool b) 
{ 
1 if (a) 
    { 
2  Console.WriteLine("B1"); 
    } 
    else 
    { 
3  Console.WriteLine("B2"); 
    } 
4 if (b) 
    { 
5  Console.WriteLine("B3"); 
    } 
    else 
    { 
6  Console.WriteLine("B4"); 
    } 
} 

數字是行標識,PEX生成3次測試:

--- Test 1 
branchOverTests(a=false,b=false) 
Path: 1F 3T 4F 6T 
return target != (ClassMethod)null; 
return target != (ClassMethod)null && a == false; 
return target != (ClassMethod)null && a == false; 
return target != (ClassMethod)null && a == false && b == false; 

--- Test 2 
branchOverTests(a=false,b=true) 
Path: 1F 3T 4T 5T 
return target != (ClassMethod)null; 
return target != (ClassMethod)null && a == false; 
return target != (ClassMethod)null && a == false; 
return target != (ClassMethod)null && b != false && a == false; 

Note: From Test 1 Flipped last branch: 
return target != (ClassMethod)null && a == false && b == false; 
-> return target != (ClassMethod)null && b != false && a == false; 
=> b = true 

--- Test 3 
branchOverTests(a=true,b=false) 
Path: 1T 2T 4F 6T 
return target != (ClassMethod)null; 
return target != (ClassMethod)null && a != false; 
return target != (ClassMethod)null && a != false; 
return target != (ClassMethod)null && a != false && b == false; 

Note: From Test 2 Resolve second condition of last branch: 
return return target != (ClassMethod)null && b != false && a == false; 
-> return target != (ClassMethod)null && a != false && b == false; 
=> a = true 
=> return target != (ClassMethod)null && a != false; 
=> return target != (ClassMethod)null && a != false; 

但最有效的一組參數化測試是:

branchOverTests(a=false,b=false) 
branchOverTests(a=true,b=true) 

測試1後:

return target != (ClassMethod)null && a == false; 
-> return target != (ClassMethod)null && a != false; 
=> a = true 
=> return target != (ClassMethod)null && a != false && b != false; 
=> b = true 

理想的測試2:

branchOverTests(a=true,b=true) 
Path: 1T 2T 4T 5T 
return target != (ClassMethod)null; 
return target != (ClassMethod)null && a != false; 
return target != (ClassMethod)null && a != false; 
return target != (ClassMethod)null && a != false && b != false; 

是,我認爲正確的嗎?

謝謝最好的問候。

回答

2

Pex總是以默認值開始,就像您所描述的那樣。這是第一個測試案例。然後Pex探索所有可能的執行路徑組合。 (Fitnex策略指導Pex,但這對您的問題並不重要。)默認情況下,每當Pex發現增加分支覆蓋率的新測試用例時,它就會發出另一個測試用例。正如你發現的那樣,Pex渴望以這種方式進行測試,並且最終的測試套件不能保證最低限度。但通常它非常接近。 (在內部,Pex在最後也認爲(真實,真實),但沒有創建另一個測試用例,因爲它不會增加分支機構的覆蓋範圍。)