我讀了很多關於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;
是,我認爲正確的嗎?
謝謝最好的問候。