如何在Pex中定义一组输入参数?

如何在Pex中定义一组输入参数?,pex,Pex,假设我的类有100个字段 如果我使用MyClass的一个对象作为输入参数,Pex将无法生成所有可能的组合(即使在一个简单的测试中,我的也会运行到1000条路径) [PexMethod] void MytestMethod(MyClass参数){…} 我怎样才能告诉Pex只使用MyClass的一组预定义对象,而不是让它变得聪明并生成所有可能的组合进行测试 换句话说,我想在上面的代码中手动指定param的可能状态列表,并告诉Pex使用它 干杯Pex不会试图产生所有可能的价值组合。相反,它分析您的代码

假设我的类有100个字段

如果我使用MyClass的一个对象作为输入参数,Pex将无法生成所有可能的组合(即使在一个简单的测试中,我的也会运行到1000条路径)

[PexMethod] void MytestMethod(MyClass参数){…}

我怎样才能告诉Pex只使用MyClass的一组预定义对象,而不是让它变得聪明并生成所有可能的组合进行测试

换句话说,我想在上面的代码中手动指定param的可能状态列表,并告诉Pex使用它


干杯

Pex不会试图产生所有可能的价值组合。相反,它分析您的代码并尝试覆盖每个分支。所以如果你有

if (MyObject.Property1 == "something")
{
    ...
}
然后它将尝试创建一个具有
属性1==“something”
的对象。因此,将测试限制在一些预定义的对象上是与“Pex哲学”背道而驰的。也就是说,您可能会发现以下信息很有趣

您可以提供Pex工厂类。例如,见或

}

然后,Pex将使用从探索代码中发现的适当值调用此工厂类(而不是默认工厂)。factory方法允许您限制可能的参数和值

您还可以使用
PexArguments
属性来建议值,但这不会阻止Pex尝试生成其他值以覆盖代码中的任何分支。它只是尝试你首先提供的

[PexArguments(1, "foo")] // try this first
void MyTest(int i, string s) 
{
    ...
}

有关
PexArguments
的更多信息,请参阅,并在上的PDF文档中搜索“种子值”。

如果您发现Pex正在生成大量不相关、冗余或其他无帮助的输入,您可以使用
PexAssume
为参数化单元测试的输入生成值,这将确保所有生成的输入满足您提供的一组标准

例如,如果希望确保参数来自预定义的值集合,可以执行以下操作:

public void TestSomething(Object a) {
    PexAssume.IsTrue(someCollection.Contains(a));
}
PexAssume
还有其他辅助方法用于更一般的输入修剪,例如
IsNotNull
arnotequal
,等等。很少有文档表明也有一些特定于集合的功能,尽管如果这些方法存在,我对它们并不熟悉


查看更多信息。

谢谢你,克里斯。我没有想到要用PexAssume。不幸的是,无论是工厂还是工厂都不能解决我的问题。
public void TestSomething(Object a) {
    PexAssume.IsTrue(someCollection.Contains(a));
}