2

数百のフィールドを持つMyClassがあるとします。

MyClassのオブジェクトを入力パラメーターとして使用すると、Pexは、考えられるすべての組み合わせを生成しようとすると、単純に窒息します(単純なテストでも、数千のパスに遭遇します)。

[PexMethod] void MytestMethod(MyClass param){...}

Pexに、スマートにしてテストするすべての可能な組み合わせを生成するのではなく、MyClassの事前定義されたオブジェクトのセットのみを使用するように指示するにはどうすればよいですか?

言い換えると、上記のコードでparamの可能な状態のリストを手動で指定し、それを使用するようにPexに指示したいと思います。

乾杯

4

2 に答える 2

2

Pexが大量の無関係、冗長、またはその他の役に立たない入力を生成していることがわかった場合は、を使用してパラメーター化された単体テストの入力に対して生成する値を形成できます。PexAssumeこれにより、生成されたすべての入力が一連の基準を満たすことが保証されます。提供。

たとえば、引数が事前定義された値のコレクションからのものであることを確認したい場合は、次のようにすることができます。

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

PexAssumeIsNotNull、など、より一般的な入力プルーニングのための他のヘルパーメソッドもあります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 に答える