2015-09-12 12 views
5

Podczas migracji niektórych testów z JUnit do TestNG napotykam na problem z powodu różnicy w sposobie traktowania przez te struktury testowe ich instancji klasy testowej.Inicjowanie i czyszczenie danych testowych dla testów równoległych w TestNG

JUnit tworzy nową instancję klasy Test dla każdej metody testu. Tak więc widzę wspólny wzorzec:

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

W przeciwieństwie do tego, TestNG używa pojedynczej instancji klasy Test dla wszystkich metod testowych. Tak więc powyższy wzór nie działa! Ponieważ dane są przechowywane w polach instancji, wartości nie są już izolowane. Może to spowodować, że nadpisane dane zostaną wykonane w połowie testu, jeśli włączone jest wykonywanie równoległe.

Jak to zrobić z TestNG? Czy istnieje sposób przechowywania danych, które są izolowane dla każdej krotki?

Mogę wykonać wszystkie 3 kroki wewnątrz samej @Test, ale wymagałoby to dodania niezręcznych bloków try...finally do każdego testu. Próbowałem również używać ITestContext, ale wydaje się również, że jest on udostępniany dla całego przebiegu testowego.

+1

'@ BeforeMethod' i' @AfterMethod 'wywołaj wszystkie wywołania' @ Test'; więc to powinno działać dokładnie tak, jak opisałeś. Jedyna różnica polega na tym, że za każdym razem zastępujesz stan klasy, zamiast tworzyć nową instancję. Czy zauważyłeś jakieś nieoczekiwane zachowanie w tym podejściu? Czy też próbujesz równolegle uruchomić wszystkie testy w klasie (obawiam się, że to niemożliwe)? –

+0

@CostiCiudatu Głównie podczas wykonywania równoległego - wartości czasami zostają nadpisane w połowie testu. – metacubed

+0

Jeśli chcesz uruchomić metody testowe w klasie równolegle (''), nie ma sposobu, aby bronić się przed warunkami wyścigu, ponieważ zmieniasz stan zmienności. –

Odpowiedz

1

Tak, z TestNG sposób masz większą moc nad tymi lokalnymi zmiennymi, która trwała z JUnit ORAZ DataProvider Uchwyty swój gwint, za test-klasowej przykład:

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; 
} 
} 
Powiązane problemy