2016-07-12 10 views
0

Ich möchte die Junit-Tests parallel ausführen. Ich stoße auf das folgende ProblemKonsolenausgabe beim Ausführen von Junit-Tests mit ParallelComputer

Diese Tests werden von anderen Teams entwickelt und es gibt etwa 2500 Test-Suiten. Die Tests und das Test-Framework haben überall statische Variablen. Sie wurden so geschrieben, dass sie gut funktionieren, wenn sie eine Suite nach der anderen laufen. Sie laufen nicht einmal ab, wenn ich eine Suite dieser Testsuiten konstruiere und sie ausführe.

Um dieses Problem zu umgehen, habe ich meinen eigenen Test-Runner, der die Testsuite von einem anderen Klassenlader lädt (eine Gruppe von Tests gleichzeitig). Ich mache das in mehreren Threads und rufe die run-Methode von JunitCore aus jedem dieser Threads auf. Das funktioniert gut. Das Problem bei diesem Ansatz besteht darin, dass die Konsolenausgabe gemischt ist.

Ich suche nach einer Lösung für dieses Problem, damit ich die Konsolenausgabe für die Testsuite trennen und sie in eine Datei umleiten kann.

Hier ist eine mögliche Lösung, die ich in Betracht ziehe. Ich könnte die Klassen mit verschiedenen Klassenladeprogrammen laden und das Array der "Klassen" -Objekte dieser Klassen in JunitCore runClasses mit einer Instanz ParallelComputer übergeben.

Hat jemand versucht, Testsuiten mit ParallelComputer auszuführen? Wie wird die Konsolenausgabe gehandhabt?

+0

Haben Sie es versucht zu sehen? Können Sie jedem Testthread eine andere Ausgabedatei bereitstellen? Was bedeutet es, die Tests parallel auszuführen, aber die Ausgabe auf eine einzelne Konsole zu serialisieren/trennen? Es ist nicht klar, was Sie fragen, und Sie haben nicht genug Kontext oder Beweise für die Forschung bereitgestellt. –

+0

Ich habe es noch nicht versucht. Die Tests und die Framework-Ausgabe werden nach stdout ausgegeben (sie können direkt System.out.println oder eine Art Logger verwenden). Unabhängig davon, wie das gemacht wird, sehe ich viele Informationen auf der Konsole, wenn der Test ausgeführt wird. Als ich versuchte, die Tests in Threads auszuführen, wurde die gesamte Ausgabe gemischt. Ich möchte die Konsolenausgabe pro Thread trennen. ParallelComputer soll die Tests parallel ausführen. Aber ich weiß nicht, wie die Konsolenausgabe gehandhabt wird. Meine Frage war, ob jemand das versucht hat und wenn ja, wie wird die Ausgabe von System.out.println gehandhabt. Hoffe das klärt auf. – user3274614

Antwort

0

Ich sehe, dass, wenn Sie versuchen, die JUnit-Tests mit ParallelComputer ausführen, die Standardausgabe ist durcheinander. Ich habe das erwartet, aber ich habe es mit einem kleinen Programm versucht.

Mein Programm ist unter

import org.junit.runner.*; 
import org.junit.*; 
import org.junit.experimental.*; 

public class ParallelComputerTest { 

public static void main(String[] args) {  
Class[] cls={ParallelTest1.class,ParallelTest2.class }; 

//Parallel among classes 
JUnitCore.runClasses(ParallelComputer.classes(), cls);  
} 

public static class ParallelTest1{ 
@Test public void a1(){ 
    int count = 0; 
    while(count < 5) { 
    System.out.println("a1"); 
    count++; 
    try { 
     Thread.sleep(2000); 
    } catch(Exception e) { 
    } 
    } 

} 
@Test public void b1(){ 
    int count = 0; 
    while(count < 5) { 
    System.out.println("b1"); 
    count++; 
    try { 
     Thread.sleep(2000); 
    } catch(Exception e) { 
    } 
    } 
} 
} 
public static class ParallelTest2{ 
@Test public void a(){ 
    int count = 0; 
    while(count < 5) { 
    System.out.println("a2"); 
    count++; 
    try { 
     Thread.sleep(2000); 
    } catch(Exception e) { 
    } 
    } 
} 
@Test public void b(){ 
    int count = 0; 
    while(count < 5) { 
    System.out.println("b2"); 
    count++; 
    try { 
     Thread.sleep(2000); 
    } catch(Exception e) { 
    } 
    } 
} 
} 
} 

Der Ausgang wie dieses ist

a2 
a1 
a2 
a1 
a2 
a1 
a1 
a2 
a1 
a2 
b1 
b2 
b1 
b2 
b1 
b2 
b1 
b2 
b1 
b2 

ich nach einem Weg suchen, die stdout demultiplexen.

Verwandte Themen