我读了许多关于pex的论文,我专注于探索策略。我知道Fitnex策略是默认使用的,但我不明白Pex如何创建第一个参数化单元测试。
我可以在哪里找到这些信息?
通过特殊测试,我认为: - 如果参数为“int”,则以0开头 - 如果参数为“bool”,则以false开头 - 如果参数是以Null开头的对象
这是对的吗?
现在关于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;
我认为这是对的吗?
非常感谢。
答案 0 :(得分:2)
Pex始终以默认值开头,就像您描述的那样。这是第一个测试用例。然后Pex探索了所有可能的执行路径组合。 (Fitnex策略指导Pex,但这对您的问题并不重要。)默认情况下,每当Pex发现一个增加分支覆盖率的新测试用例时,它就会发出另一个测试用例。正如您所发现的那样,Pex渴望以这种方式,并且不会保证最终的测试套件是最小的。但通常它非常接近。 (在内部,Pex最后也考虑了(真实的,真实的),但没有创建另一个测试用例,因为它不会增加分支覆盖率。)