Параллельное выполнение TestNG с помощью DataProvider

У меня есть один тест, который получает данные от поставщика данных. Я хотел бы, чтобы этот тест выполнялся параллельно с разными значениями от поставщика данных.

Я попробовал такой подход, как:

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 }

  };
}

}

Полученный вывод i:

HELLO: 10

HELLO: 12

ПРИВЕТ: 17

ПРИВЕТ: 11

HELLO: 16

ПРИВЕТ: 14

ПРИВЕТ: 13

HELLO: 15

Созданы 10 потоков, в то время как я указал 5 в размере пула потоков. Не могли бы вы рассказать, что должно быть добавлено к приведенному выше фрагменту, чтобы управлять размером пула данных поставщика данных.

Ответ 1

Вам нужно использовать dataproviderthreadcount. Значения threadpoolsize и invocationcount не требуются. Подробности здесь.

Ответ 2

В testng.xml вы можете установить количество потоков для dataprovider через 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>

Ответ 3

Попробуйте установить пул потоков следующим образом:

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

Ответ 4

Вы можете достичь этого, добавив дополнительную конфигурацию 'parallel = true' вместе с именем DataProvider в своем определении. Пример таков:

@DataProvider(name="InvalidLoginDataProvider", parallel = true)
public Object[][] myDataProviderMethod(){
...
...
}

Согласно документации TestNG, пул потоков @Test (созданный с использованием параметров invocationCount и threadPoolSize в @Test) и пул потоков поставщиков данных различаются и управляются по-разному.
Таким образом, чтобы указать, сколько потоков в пуле потоков провайдера данных, необходимо добавить следующую конфигурацию в файл testng.xml.

<suite name="Suite1" data-provider-thread-count="20" >
...
...
</suite> 

НТН!

Ответ 5

Я думаю, что есть способ установить его на уровне аннотации, его следует добавить на DataProvider:

@DataProvider(name="quick-screen-list", parallel = true)
        public Object[][] quickScreenDataProvider() {
           .....

Ответ 6

В настоящее время используется только один поток, поскольку вы определяете invocationCount как 1, если вы измените его на 3, то будут использоваться три рабочих потока.

invocationCount: - количество раз, когда этот метод должен быть вызван.

threadPoolSize: - Размер пула потоков для этого метода. Метод будет вызван из нескольких потоков, как указано invocationCount. Примечание: этот атрибут игнорируется, если invocationCount не указан.

Кроме того,

Вы также можете указать, что метод @Test должен быть вызван из разных потоков. Вы можете использовать атрибут threadPoolSize для достижения этого результата:

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

В этом примере функция testServer будет вызываться десять раз из трех разных потоков. Кроме того, тайм-аут из десяти секунд гарантирует, что ни один из потоков не будет блокировать этот поток навсегда.

Более подробную информацию можно найти здесь