【问题标题】:How to define a set of input parameters in Pex?如何在 Pex 中定义一组输入参数?
【发布时间】:2012-01-11 16:45:09
【问题描述】:

假设我的 MyClass 有 100 个字段。

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

[Pex 方法] void MytestMethod(MyClass param){...}

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

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

干杯

【问题讨论】:

    标签: pex


    【解决方案1】:

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

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

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

    PexAssume 也有其他辅助方法用于更一般的输入修剪,例如IsNotNullAreNotEqual 等。那里的少量文档表明还有一些特定于集合的功能,尽管如果有这些方法,我不熟悉。

    查看the Pex manual 了解更多信息。

    【讨论】:

    • 谢谢你,克里斯。我没想过使用 PexAssume。 Shap00 不幸的是,我的工厂和 PexArguments 都无法解决我的问题。
    【解决方案2】:

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

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

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

    您可以提供 Pex 工厂类。例如,请参阅 this blog postthis 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 文档中搜索“种子值”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2017-01-09
      • 1970-01-01
      • 2020-09-17
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多