/ Teste / método paralelo TestNG usando dataprovoder - java, selenium, selenium-webdriver, testng

Teste / método paralelo TestNG usando dataprovoder - java, selenium, selenium-webdriver, testng

Eu tenho um método testNG assim:

@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){

System.out.println(param1 + " " + param2);

}

Meu dataprovider retorna 10 elementos. Meu método será executado 10 vezes em um thread. Como é possível paralelizar isso? Por exemplo

  • Eu quero ter 5 métodos em paralelo. O webdriver deve abrir 5 navegadores ao mesmo tempo. Após estes 5 testes em paralelo, os outros 5 testes devem ser executados

ou

  • o webdriver deve abrir 10 navegadores e fazer todos os 10 elementos paralelos

Alguém tem uma ideia?

Respostas:

1 para resposta № 1

Você pode definir o paralelismo através de um arquivo suite no TestNG. Exemplo a seguir executa métodos em paralelo com 10 threads:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="MySuiteNameHere" parallel="methods" thread-count="10">

<test name="Selenium Tests">
<classes>
<class name="foo.bar.FooTest"/>
</classes>
</test>
</suite>

Você também precisa observar que o seu provedor de dados pode ser thread-safe para permitir que ele não force o método a ser executado sequencialmente.

// data providers force single threaded by default
@DataProvider(name = "takeMyProvider", parallel = true)

Tenha cuidado, no entanto. TestNG não cria novas instâncias do objeto de classe ao executar com métodos paralelos. Isso significa que, se você salvar valores no objeto de classe de teste, poderá executar problemas de encadeamento.

Observe também que, se você definir a contagem de threads como 5, ele não espera que os primeiros 5 sejam concluídos e, em seguida, inicie os próximos 5. Ele basicamente coloca todos os métodos de teste em uma fila e, em seguida, inicia x tópicos. Cada thread, em seguida, simplesmente pesquisa o próximo elemento da fila quando estiver disponível.


0 para resposta № 2

TestNG "s @Test anotação já tem o que você quer ... Até certo ponto:

// Execute 10 times with a pool of 5 threads
@Test(invocationCount = 10, threadPoolSize = 5)

O que isso não fará é ajustar seu primeiro cenário exatamente, ou seja, executar os primeiros 5, esperar que eles terminem, executar os outros 5.


0 para resposta № 3

muitos thx para o seu feedback e dicas úteis. Meus testes foram executados - talvez - de qualquer forma paralela, mas apenas em uma instância do navegador.

Vamos pular em detalhes:

Meu dataprovider retorna um objeto [] []

@Dataprovider(name = "takeMyProvider", parallel = true)
public object[][] myProvider(){
return new object[][]{{"1", "name1"}, {"2", "name2"} {"3", "name3"}}
}

Este método de teste é executado três vezes

@Test(dataProvider="takeMyProvider")
public void myTest(String param1, String param2){

System.out.println(param1 + " " + param2);

}

mas apenas em uma instância do navegador. Isso não é o que eu quero.

Eu quero que o testNG inicie 3 instâncias do chrome e faça os 3 testes em paralelo.

Btw eu estou executando os testes em uma grade de selênio. Talvez com 100 nós. Seria perfeito quando 100 nós fazendo este teste em paralelo. Ou até 1.000, depende do provedor de dados.

Alguém tem uma ideia?

Cumprimentos