2015-07-20 18 views
6

Mam jeden test, który odbiera dane od dostawcy danych. Chciałbym, aby ten test działał równolegle z różnymi wartościami od dostawcy danych.Testowanie równoległe TestNG z DataProvider

że próbował podejścia jak:

public class IndependentTest 
{ 
@Test(dataProvider = "dp1" ,threadPoolSize=3,invocationCount=1) 

public void testMethod(int number) 
{ 
    Long id = Thread.currentThread().getId(); 
    System.out.println("HELLO : " + id); 
} 


@DataProvider(name = "dp1",parallel=true) 
public Object[][] dp1() { 
    return new Object[][] { 
     new Object[] { 1 }, 
     new Object[] { 2 }, 
     new Object[] { 3 }, 
     new Object[] { 4 }, 
     new Object[] { 5 }, 
     new Object[] { 6 }, 
     new Object[] { 7 }, 
     new Object[] { 8 } 

    }; 
} 

}

Wyjście I Odebrano:

CZEŚĆ 10

CZEŚĆ 12

CZEŚĆ: 17

CZEŚĆ 11

CZEŚĆ 16

CZEŚĆ 14

CZEŚĆ 13

CZEŚĆ 15

Spawned 10 nici podczas gdy określona 5 w wielkości puli gwint. Czy możesz powiedzieć, co należy dodać do powyższego fragmentu, aby kontrolować rozmiar puli wątków dostawcy danych.

+0

będziemy chcieli uruchomić testy równolegle, a nie dostawcy. W swojej kompilacji skonfiguruj tryb równoległy do ​​'metod' i' threadCount' na 5. –

+0

hi Ben, Mam jeden test, który powinien działać więcej niż 10k razy w oparciu o liczbę wartości dostarczonych przez dostawcę danych. Chciałbym kontrolować liczbę wątków spawnowanych, gdy parametr parallel = true jest ustawiony w dataprovider. Znalazłem ten argument wiersza polecenia -dataproviderthreadcount, aby kontrolować liczbę wątków pliku danych. Chciałbym jednak wiedzieć, jak można to zrobić za pomocą adnotacji – sujith

+0

W moim projekcie [build] (https://github.com/ben-manes/caffeine/blob/master/caffeine/testing.gradle) konfiguruję testy działają równolegle iw sumie wykonują 1.8M z powodu dostawców danych na 827 metodach testowych. Nie sądzę, żebyś mógł to skonfigurować za pomocą adnotacji, a zamiast tego konfiguracja została przekazana do runnera. –

Odpowiedz

6

Trzeba użyć dataproviderthreadcount. threadpoolsize i invocationcount nie są wymagane.

+0

hi niharika, Użycie dataproviderthreadcount rozwiązało mój problem. Jednak jestem w stanie ustawić to tylko jako argument linii cmd. Czy istnieje sposób na przekazanie tego samego na poziomie adnotacji? – sujith

+1

Nie. Nie ma mowy z poziomu adnotacji. –

+0

dziękuję za wyjaśnienie, że nie można tego zapewnić na poziomie adnotacji. Czy to oznacza, że ​​wszystkie testy korzystające z dowolnego dostawcy danych będą używać liczby testów określonych za pomocą dataproviderthreadcount? Czy można kontrolować liczbę wątków na podstawie testu, zamiast pozwalać, aby wszystkie testy używały wielu wątków? – sujith

-1

Obecnie używa się tylko jednego wątku, ponieważ zdefiniowałeś invocationCount jako 1, jeśli zmienisz go na 3, zostanie użyty wątek trzech pracowników.

invocationCount: - Ile razy ta metoda powinna zostać wywołana.

threadPoolSize: - Wielkość puli wątków dla tej metody. Metoda zostanie wywołana z wielu wątków określonych przez parametr invocationCount. Uwaga: ten atrybut jest ignorowany, jeśli parametr invocationCount nie został określony.

Również

Można również określić, że metoda @Test powinna być wywołana z różnych wątków. Można użyć atrybutu threadPoolSize do osiągnięcia tego celu:

@Test(threadPoolSize = 3, invocationCount = 10, timeOut = 10000) 
public void testServer() { 

W tym przykładzie, funkcja zostanie wywołana testServer dziesięć razy z trzech różnych wątków. Dodatkowo, czas oczekiwania wynoszący dziesięć sekund gwarantuje, że żaden z wątków nie będzie blokował tego wątku na zawsze.

Więcej informacji można znaleźć here

+0

Witam, Próbowałem tego podejścia, ale moje pytanie dotyczy konkretnie wykonania równoległego z dostawcą danych. Próbuję uruchomić test równolegle przy użyciu dataprovider. Określenie licznika inwokacji jako 3 w tym przypadku spowoduje, że metoda będzie wywoływana 10 razy dla każdego wejścia od dostawcy danych, co stanowi 8 * 3 = 24 przebiegi. – sujith

+0

Dostawca danych nie pomoże w równoległym uruchomieniu. Jest to sposób na opisanie danych wejściowych, które nazywają cię testowaniem 1 na 1 przy użyciu tych wejść - IMHO – TheCodingFrog

+0

Cześć, dataproviderthreadcount może być użyty do symulacji równoległego wykonania metody pojedynczego testu z instancje danych pochodzące z dostawcy danych. Pula wątków dostawcy danych różni się od puli wątków testowych w trybie testng. Jednak dataproviderthreadcount jest określony jako argument wiersza polecenia cmd. Chciałbym wiedzieć, czy można to określić na poziomie adnotacji. – sujith

1

Podczas testu.xml można ustawić liczbę wątków dla DataProvider poprzez data-provider-thread-count="3"

<suite name="Manage" data-provider-thread-count="3" > 
    <test name="Manage data tests"> 
     <classes> 
      <class name="uk.example.ExampleTest"></class> 
     </classes> 
    </test> 
</suite> 
0

spróbuj ustawić puli wątków w następujący sposób:

@BeforeClass 
public void setupClassName(ITestContext context) { 
    context.getCurrentXmlTest().getSuite().setDataProviderThreadCount(5); 
    context.getCurrentXmlTest().getSuite().setPreserveOrder(false); 
} 
Powiązane problemy