说我有20个字段的MyClass。
如果我使用MyClass的一个对象作为输入参数,Pex会简单地扼杀尝试生成所有可能的组合(即使在简单的测试中我的运行也会进入1000个路径)
[PexMethod] void MytestMethod(MyClass param){...}
我怎样才能告诉Pex只使用MyClass的一组预定义对象,而不是让它变得聪明并生成所有可能的组合进行测试?
换句话说,我想在上面的代码中手动指定param的可能状态列表,并告诉Pex使用它
干杯
答案 0 :(得分:2)
如果您发现Pex正在生成大量不相关,冗余或无用的输入,您可以使用PexAssume
调整为参数化单元测试输入生成的值,这将确保生成的所有内容输入符合您提供的一系列标准。
例如,如果您想确保参数来自预定义的值集合,您可以执行以下操作:
public void TestSomething(Object a) {
PexAssume.IsTrue(someCollection.Contains(a));
}
PexAssume
还有其他辅助方法,以便进行更一般的输入修剪,例如IsNotNull
,AreNotEqual
等。有什么小文档表明有一些特定于集合的虽然这些方法存在,但我并不熟悉它们。
查看the Pex manual了解更多信息。
答案 1 :(得分:0)
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文档中搜索“种子值”。