2016-04-24 26 views
0

Ich verwende JUnit 4 mit Eclipse JDT, um automatisierte Mutant-Tests zu erstellen.Warum gibt JUnitCore nur die ersten Ergebnisse zurück?

ist die allgemeine Übersicht über meine Code-Struktur:

//Basic for loop 
for(int i = 0; i < 10; i++) { 

    //Read in source code from a Java file 
    ...(works) 

    //Change a line using JDT and save code to a new Java file 
    ...(works) 

    //Compile new Java file (this also works) 
    try {  
     Process compile = Runtime.getRuntime().exec("javac -cp \"src/*\" " + path + "*.java"); 
     compile.waitFor(); 
    } catch(IOException ex) { /*...*/ } 
     catch(InterruptedException ex) { /*...*/ } 

    //Run JUnit Tests (this works the first time it is called) 
    JUnitCore core = new JUnitCore(); 
    Result result = core.run(JUnitTest.class); //This class contains my JUnit Tests 
} 

Mein Code oben arbeitet für den ersten Test, aber jeder Test nach, dass immer wieder die gleichen Ergebnisse. Warum werden neue Ergebnisse nicht generiert, obwohl verschiedene Mutationen gemacht werden?

Dinge, die ich habe versucht:

  1. Testing, dass verschiedene Mutationen an jeder Schleifeniterationslatenzzeit vorgenommen werden.

  2. Testen, dass der neue Code kompiliert wird, bevor der Test ausgeführt wird.

  3. Wenn Sie die Interna der for-Schleife als Thread ausführen, warten Sie, bis der Thread beendet ist, und führen Sie dann den nächsten Test aus.

  4. Verwendung JUnitCore.runClasses (JUnitTest.class) anstelle von einer Instanz von Kern Erstellung und Aufruf core.run (JUnitTest.class):

    JUnitCore core = new JUnitCore(); 
    Result result = core.run(JUnitTest.class); 
    
  5. Substituieren JUnitCore (org. junit) Code für Testrunner (junit.textui), die mir das gleiche Problem haben:

    TestSuite suite= new TestSuite(); 
    suite.addTestSuite(JUnitTest.class); 
    TestResult result = TestRunner.run(suite); 
    

Antwort

2

Sie müssen die Mutante in die JVM einfügen - obwohl Sie die modifizierte Datei kompilieren, wird die JVM nur die erste geladene Version sehen.

Es gibt verschiedene Möglichkeiten, dies zu tun, vom Start einer neuen JVM für jede Mutante bis zur Verwendung der Instrumentierungs-API.

+0

Brilliant. Ich habe darüber nachgedacht, eine neue JVM für jede Mutante zu starten, aber ich würde gerne wissen, wie man mit Instrumention Klassen in der JVM ersetzt. Hast du Links wo du anfangen sollst? –

+0

@ZacharyTerlizzese Beginnen Sie mit der offiziellen Dokumentation https://docs.oracle.com/javase/Instrumentation.html und schauen Sie sich an, wie pitest es tut https: // github. com/hcoles/pitest – henry

+0

Vielen Dank für Ihre Hilfe Henry. Ich habe auch diese Lösung gefunden, die in der Lage sein kann, eine Klasse für eine andere unter Verwendung von SomeJavaClass.class.getClassLoader() zu trennen: http://Stackoverflow.com/a/14317506/1008395 –

0

Warum sind Sie mit der Schleife von i = 0-i = 10, und wenn mit dieser Schleife als wo i Sie den Wert Verwendung innerhalb des Codes. Ich denke, dass dies nicht den Wert i verwendet, so dass Sie jedes Mal das gleiche Ergebnis erhalten.

+0

Die Schleife ist eine Zusammenfassung von fortgeschritteneren Code. In Wirklichkeit suche ich den Code für jeden Infix-Ausdruck und mutiere ihn. Die Anzahl der Loops kann variieren, so dass ich die Frage einfach als 10 Mal angekündigt habe (obwohl sogar zweimal nicht funktioniert). –