Pex 不会尝试生成所有可能的值组合。相反,它会分析您的代码并尝试覆盖每个分支。所以如果你有
if (MyObject.Property1 == "something")
{
...
}
然后它将尝试创建一个具有Property1 == "something" 的对象。因此,将测试限制在一些预定义的对象上是违反“Pex 哲学”的。也就是说,您可能会发现以下信息很有趣。
您可以提供 Pex 工厂类。例如,请参阅 this blog post 或 this one。
[PexFactoryClass]
public partial class EmployeeFactory
{
[PexFactoryMethod(typeof(Employee))]
public static Employee Create(
int i0,
string s0,
string s1,
DateTime dt0,
DateTime dt1,
uint ui0,
Contract c0
)
{
Employee e0 = new Employee();
e0.EmployeeID = i0;
e0.FirstName = s0;
e0.LastName = s1;
e0.BirthDate = dt0;
e0.StartDateContract = dt1;
e0.Salary = ui0;
e0.TypeContract = c0;
return e0;
}
}
然后,Pex 将使用它从探索您的代码中发现的适当值调用此工厂类(而不是默认工厂)。工厂方法允许您限制可能的参数和值。
您也可以使用PexArguments 属性来建议值,但这不会阻止 Pex 尝试生成其他值来覆盖代码中的任何分支。它只会尝试您首先提供的那些。
[PexArguments(1, "foo")] // try this first
void MyTest(int i, string s)
{
...
}
有关PexArguments 的更多信息,请参阅here,并在Parameterized Test Patterns 上的PDF 文档中搜索“种子值”。