2015-09-12 5 views
5

Bei der Migration einiger Tests von JUnit zu TestNG sehe ich mich mit einem Problem konfrontiert, da diese Test-Frameworks ihre Testklasseninstanzen unterschiedlich behandeln.Initialisieren und Bereinigen von Testdaten für parallele Tests in TestNG

JUnit erstellt für jede Testmethode eine neue Instanz der Test-Klasse. So ein gemeinsames Muster, das ich sehe, ist:

public class MyTest { 

    private Stream inputData; 

    @Before 
    public void setUp() { 
     // Set up some data in (non-static) instance fields 
     // This data is isolated per test 
     inputData = createInputDataStream(); 
    } 

    @Test 
    public void testStuff() { 
     // Use the data from the instance fields 
     doStuff(inputData); 
    } 

    @After 
    public void tearDown() { 
     // Clean up the data from the instance fields 
     closeInputDataStream(inputData); 
    } 
} 

Im Gegensatz dazu verwendet TestNG eine einzelne Instanz der Klasse Test für alle Prüfverfahren. Also das obige Muster funktioniert nicht! Da Daten in Instanzfeldern gespeichert werden, sind die Werte nicht mehr isoliert. Dies kann zu überschriebenen Daten während der Testphase führen, wenn die parallele Ausführung aktiviert ist.

Also wie würde ich das mit TestNG machen? Gibt es eine Möglichkeit, Daten zu speichern, die jeweils isoliert sind? @BeforeMethod - @Test - @AfterMethod Tupel?

Ich kann alle 3 Schritte innerhalb der selbst tun, aber das würde erfordert hinzufügen plumpen try...finally Blöcke zu jedem Test. Ich habe auch versucht, ITestContext, aber es scheint auch für den gesamten Testlauf freigegeben werden.

+1

'@ BeforeMethod' und' @AfterMethod 'wird um jeden '@ Test'-Aufruf herum aufgerufen; also soll das genau so funktionieren, wie du es beschrieben hast. Der einzige Unterschied besteht darin, dass Sie den Klassenstatus jedes Mal überschreiben müssen, anstatt eine neue Instanz zu erstellen. Haben Sie bei diesem Ansatz unerwartetes Verhalten bemerkt? Oder versuchen Sie, alle Tests in der Klasse parallel auszuführen (ich fürchte, das ist nicht möglich)? –

+0

@CostiCiudatu Hauptsächlich während der parallelen Ausführung - die Werte werden manchmal mitten im Test überschrieben. – metacubed

+0

Wenn Sie die Testmethoden innerhalb der Klasse parallel ausführen wollen (''), gibt es keine Möglichkeit, sich gegen die Rennbedingungen zu verteidigen, da Sie den veränderbaren Zustand ändern. –

Antwort

1

Ja, mit TestNG Sie viel mehr Macht über diese lokalen Variablen haben, die Sie mit JUnit tat und die DataProvider- behandelt Ihre Threading pro Test-Klasse-Instanz:

public class MyTest { 

private Stream inputData; 

@BeforeMethod 
public void setUp(Object[] args) { 
    inputData = (Data)args[0]; 
    inputData = normalizeDataBeforeTest(inputData); 
} 

@Test(dataProvider="testArgs") 
public void testStuff(Data inputDatax, Object a, Object b) { 
    doSomethingWith(a); 
    doSomethingWith(b); 
    doStuff(this.inputData); 
} 

@AfterMethod 
public void tearDown() { 
    // Clean up the data from the instance fields 
    closeInputDataStream(inputData); 
} 

.... 
@DataProvider 
public static Object[][] testArgs() { 
    // generate data here, 1 row per test thread 
    Object[][] testData; 
    for loop { 
     // add row of data to testData 
     // {{dataItem, obja, objb}, {dataItem, obja, objb}} etc. 
    } 
    return testData; 
} 
}