2015-07-20 29 views
6

Ho un singolo test che riceve i dati dal fornitore di dati. Vorrei che questo test fosse eseguito in parallelo con valori diversi dal fornitore di dati.TestNG parallelo Esecuzione con DataProvider

ho provato un approccio come:

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 } 

    }; 
} 

}

L'uscita ho ricevuto è:

CIAO: 10

CIAO: 12

CIAO: 17

CIAO: 11

CIAO: 16

CIAO: 14

CIAO: 13

CIAO: 15

generato 10 thread mentre ho specificato 5 delle dimensioni del lotto thread. Potrebbe dirci cosa deve essere aggiunto allo snippet sopra riportato per controllare le dimensioni del pool di thread del fornitore di dati.

+0

Ti consigliamo di eseguire test in parallelo, non il fornitore. Nella tua build configura la modalità parallela a 'methods' e' threadCount' a 5. –

+0

hi Ben, Ho un singolo test che dovrebbe essere eseguito più di 10k volte in base al numero di valori forniti dal fornitore di dati. Vorrei controllare il numero di thread generati quando parallel = true è impostato in dataprovider. Ho trovato questo argomento della riga di comando -dataproviderthreadcount per controllare il conteggio dei thread dataprovider. Tuttavia mi piacerebbe sapere come si potrebbe fare usando le annotazioni – sujith

+0

Nel mio progetto [build] (https://github.com/ben-manes/caffeine/blob/master/caffeine/testing.gradle) configuro i test per eseguire in parallelo e, in totale, eseguire 1,8 M a causa di fornitori di dati su 827 metodi di test. Non penso che tu possa configurare questo dalle annotazioni e invece è una sua configurazione passata nel corridore. –

risposta

6

È necessario utilizzare dataproviderthreadcount. threadpoolsize e invocationcount non sono richiesti.

+0

hi niharika, L'utilizzo di dataproviderthreadcount ha risolto il mio problema. Tuttavia sono in grado di impostare questo solo come argomento di linea cmd. C'è un modo per passare lo stesso a livello di annotazione? – sujith

+1

No. In nessun modo dal livello di annotazione. –

+0

grazie chiarendo che non è possibile fornire questo a livello di annotazione. Ciò significa che tutti i test che utilizzano qualsiasi dataprovider useranno il numero di test specificato usando dataproviderthreadcount? Sarebbe possibile controllare il numero di thread in base al test piuttosto che lasciare che tutti i test utilizzino più thread? – sujith

-1

Attualmente viene utilizzato solo un thread come si definisce invocationCount come 1, se lo si cambia in 3 verrà utilizzato il thread di tre worker.

invocationCount: - Il numero di volte che questo metodo deve essere richiamato.

threadPoolSize: - La dimensione del pool di thread per questo metodo. Il metodo verrà richiamato da più thread come specificato da invocationCount. Nota: questo attributo viene ignorato se invocationCount non è specificato.

Inoltre,

È inoltre possibile specificare che un metodo @Test deve essere richiamato da diversi thread. È possibile utilizzare l'attributo threadPoolSize per ottenere questo risultato:

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

In questo esempio, la funzione TestServer verrà richiamato dieci volte da tre diversi thread. Inoltre, un timeout di dieci secondi garantisce che nessuno dei thread bloccherà per sempre su questo thread.

Maggiori informazioni si possono trovare here

+0

Ciao, Ho provato questo approccio ma la mia domanda riguarda specificamente l'esecuzione parallela con il fornitore di dati. Sto provando a eseguire il test parallelamente usando dataprovider. Se si specifica il conteggio di invocazioni come 3 in questo caso, il metodo verrà invocato 10 volte per ogni input dal fornitore di dati, che conta 8 * 3 = 24 esecuzioni. – sujith

+0

Il fornitore di dati non aiuta a farlo funzionare in parallelo .. è un modo per descrivere il tuo input che chiama il tuo test 1 per 1 usando questi ingressi - IMHO – TheCodingFrog

+0

Ciao, dataproviderthreadcount può essere usato per simulare l'esecuzione parallela del metodo di test singolo con le istanze di dati che provengono da dataprovider. Il pool di thread del provider di dati è diverso dal pool di thread di test in testng. Tuttavia, dataproviderthreadcount viene specificato come argomento della riga cmd. Vorrei sapere se è possibile specificarlo a livello di annotazione. – sujith

1

In testng.xml è possibile impostare il numero di thread per dataprovider via 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

tenta di impostare il pool di thread in modo seguente:

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