0

私は pex に関する多くの論文を読んでおり、探査戦略に焦点を当てています。Fitnex 戦略がデフォルトで使用されることは理解していますが、Pex が最初のパラメーター化された単体テストを作成する方法がわかりません。

この情報はどこで確認できますか?

実験的テストでは、次のように思います:-パラメーターが「int」の場合は0で始まります-パラメーターが「bool」の場合はfalseで始まります-パラメーターがオブジェクトの場合はNullで始まり​​ます

それが正しいか ?

Fitnex の戦略とソルバーの制約 Z3 について、繰り返しによって解決できる制約は 1 つだけだと思います。

次のメソッドがあるとします。

public void branchOverTests(bool a, bool b)
{
1   if (a)
    {
2       Console.WriteLine("B1");
    }
    else
    {
3       Console.WriteLine("B2");
    }
4   if (b)
    {
5       Console.WriteLine("B3");
    }
    else
    {
6       Console.WriteLine("B4");
    }
}

数字は行を識別し、Pex は 3 つのテストを生成します。

--- Test 1
branchOverTests(a=false,b=false)
Path: 1F 3T 4F 6T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && a == false && b == false;

--- Test 2
branchOverTests(a=false,b=true)
Path: 1F 3T 4T 5T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && a == false;
return target != (ClassMethod)null && b != false && a == false;

Note: From Test 1 Flipped last branch: 
return target != (ClassMethod)null && a == false && b == false; 
-> return target != (ClassMethod)null && b != false && a == false; 
=> b = true

--- Test 3
branchOverTests(a=true,b=false)
Path: 1T 2T 4F 6T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false && b == false;

Note: From Test 2 Resolve second condition of last branch:
return return target != (ClassMethod)null && b != false && a == false; 
-> return target != (ClassMethod)null && a != false && b == false; 
=> a = true
=> return target != (ClassMethod)null && a != false;
=> return target != (ClassMethod)null && a != false;

しかし、パラメータ化されたテストの最も効率的なセットは次のとおりです。

branchOverTests(a=false,b=false)
branchOverTests(a=true,b=true)

テスト 1 の後:

return target != (ClassMethod)null && a == false;
-> return target != (ClassMethod)null && a != false;
=> a = true
=> return target != (ClassMethod)null && a != false && b != false;
=> b = true

理想的なテスト 2 :

branchOverTests(a=true,b=true)
Path: 1T 2T 4T 5T
return target != (ClassMethod)null;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false;
return target != (ClassMethod)null && a != false && b != false;

それは私が正しいと思いますか?

感謝をこめて。

4

1 に答える 1

2

説明したように、Pexは常にデフォルト値で始まります。これが最初のテストケースです。次に、Pexは実行パスのすべての可能な組み合わせを調査します。(Fitnex戦略はPexをガイドしますが、それはあなたの質問にとって重要ではありません。)デフォルトでは、Pexがブランチカバレッジを増やす新しいテストケースを発見するたびに、別のテストケースを発行します。Pexはこのように熱心であり、あなたが発見したように、結果として得られるテストスイートは最小限であることが保証されていません。しかし、通常はかなり近いです。(内部的には、Pexは最後に(true、true)も考慮しましたが、ブランチカバレッジが増加しなかったため、さらに別のテストケースを作成しませんでした。)

于 2012-11-05T07:36:34.693 に答える