/ / Theorie: Start der Pex-Exploration und Anzahl der erzeugten PUTs - Leistung, pex

Theorie: Start Pex Exploration und Anzahl der PUT generiert - Leistung, Pex

Ich habe viele Artikel über pex gelesen, ich konzentriere mich auf die Erkundungsstrategien. Ich verstehe, dass die Fitnex-Strategie standardmäßig verwendet wird, aber ich verstehe nicht, wie Pex den ersten parametrisierten Unit-Test erstellt.

Wo finde ich diese Informationen?

Bei besonderen Tests denke ich: - Wenn der Parameter "int" ist, beginnen Sie mit 0 - Wenn der Parameter "bool" ist, beginnen Sie mit false - Wenn Parameter ein Objekt ist, mit Null beginnen

Ist es richtig ?

Nun zu Fitnex-Strategie und Solver-Einschränkungen Z3 Ich denke, dass es in der Lage ist, nur eine Einschränkung durch Iteration zu lösen, tut mir leid für mein kleines Englisch, jetzt mache ich ein Beispiel:

Angenommen, Sie haben die folgende Methode:

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");
}
}

Zahlen sind Linien, Pex generieren 3 Tests:

--- 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;

Der effizienteste Satz parametrisierter Tests ist jedoch:

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

Nach Test 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

Idealer Test 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;

Ist das richtig?

Danke und beste Grüße.

Antworten:

2 für die Antwort № 1

Pex beginnt immer mit Standardwerten, genau wiedu hast beschrieben. Das ist der erste Testfall. Dann untersucht Pex alle möglichen Kombinationen von Ausführungspfaden. (Die Fitnex-Strategie ist ein Leitfaden für Pex, aber das ist für Ihre Frage nicht wichtig.) Wenn Pex einen neuen Testfall entdeckt, der die Zweigabdeckung erhöht, wird standardmäßig ein weiterer Testfall ausgegeben Es ist nicht garantiert, dass die Suite minimal ist, wie Sie herausgefunden haben. Normalerweise ist sie jedoch ziemlich nahe (intern betrachtet Pex auch das (true, true) am Ende, erstellt jedoch keinen weiteren Testfall, wie er es nicht hätte erhöhte Filialabdeckung.)