2

假设我有 100 个字段的 MyClass。

如果我使用 MyClass 的对象作为输入参数,Pex 会简单地阻塞尝试生成所有可能的组合(即使在简单的测试中,我也会遇到 1000 条路径)

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

如何告诉 Pex 只使用一组预定义的 MyClass 对象,而不是让它变得聪明并生成所有可能的组合来测试?

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

干杯

4

2 回答 2

2

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

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

public void TestSomething(Object a) {
    PexAssume.IsTrue(someCollection.Contains(a));
}

PexAssume还有其他辅助方法,用于更通用的输入修剪,例如IsNotNull,AreNotEqual等。那里很少有文档表明还有一些特定于集合的功能,尽管如果这些方法存在,我不熟悉它们。

查看Pex 手册了解更多信息。

于 2012-01-12T17:00:31.423 回答
0

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

if (MyObject.Property1 == "something")
{
    ...
}

然后它将尝试创建一个具有Property1 == "something". 因此,将测试限制在一些预定义的对象上是违反“Pex 哲学”的。也就是说,您可能会发现以下信息很有趣。

您可以提供 Pex 工厂类。例如,请参阅这篇博客文章这篇文章。

[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) 
{
    ...
}

有关参数化测试模式的 PDF 文档中的“种子值”的更多信息,请参见此处PexArguments

于 2012-01-12T16:26:47.820 回答