Связь между провайдером данных в параллельном режиме и настройкой параллельных потоков - PullRequest
1 голос
/ 12 марта 2019

Существует два класса тестов, каждый из которых имеет один метод тестирования с использованием поставщика данных в параллельном режиме.

public class FirstNg {

    @Test(dataProvider = "dp11", description="f one")
    public void f11(Integer n, String s) throws InterruptedException {
        System.out.println("DP FIR ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
        Thread.sleep(4000);
    }

    @DataProvider(parallel = true)
    public Object[][] dp11() {
        return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
                new Object[] { 4, "d" }};
    }

}

public class SecondNg {

    @Test(dataProvider = "dp22", description="f two")
    public void f22(Integer n, String s) throws InterruptedException {
        System.out.println("DP SEC ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
        Thread.sleep(4000);
    }

    @DataProvider(parallel = true)
    public Object[][] dp22() {
        return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
                new Object[] { 4, "d" }};
    }       
}

Продолжительность тестового прогона рассчитывается с временами, определенными в BeforeSuite и AterSuite.

Случай 1 - Запуск без параллельной настройки потока.

<suite name="suite" data-provider-thread-count="2"> 
  <test name="test"> 
    <classes> 
      <class name="FirstNg"/> 
      <class name="SecondNg"/> 
    </classes> 
  </test>
</suite>

Это дает следующий результат.

DP FIR ----12----1552410839748
DP FIR ----11----1552410839752
DP FIR ----12----1552410843753
DP FIR ----11----1552410843756
DP SEC ----13----1552410847763
DP SEC ----14----1552410847764
DP SEC ----13----1552410851767
DP SEC ----14----1552410851768
DURATION - 16.936 secs

Первые две строки начинают принадлежать поставщику данных класса FirstNg. Это повторяется парами по два (равно значению data-provider-thread-count), затем используется поставщик данных класса SecondNg.

Случай 2 - Запуск с параллельной настройкой потоков для методов.

<suite name="Surefire suite" data-provider-thread-count="2" parallel="methods"> 
  <test name="Surefire test"> 
    <classes> 
      <class name="testngparallel.FirstNg"/> 
      <class name="testngparallel.SecondNg"/> 
    </classes> 
  </test>
</suite>

Это дает следующий результат.

DP SEC ----14----1552412828961
DP FIR ----13----1552412828962
DP FIR ----16----1552412828964
DP SEC ----15----1552412828966
DP FIR ----13----1552412832972
DP FIR ----16----1552412832977
DP SEC ----15----1552412832979
DP SEC ----14----1552412832980
DURATION - 8.161 secs

Первые четыре строки начинаются вместе. Два ряда принадлежат поставщику данных FirstNg, а два других - SecondNg. Это повторяется до тех пор, пока все строки всех поставщиков данных не будут исчерпаны.

Из этого обсуждения, похоже, есть 2 пула, один для провайдера данных и один для других тестов - https://groups.google.com/forum/#!topic/testng-users/BKfSgHoAChU

Добавление параллельного = «методов» настройки, сокращает время выполнения теста. Также изменена последовательность тестов, перепутаны тесты от обоих поставщиков данных. Какая связь между двумя настройками?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Добавление параллельного = "методов", сокращает время теста выполнение. Также изменяется последовательность тестов, тесты от обоих Поставщики данных перепутаны. Какая связь между двумя настройки?

В основном две настройки управляют различными аспектами исполнения. Все методы испытаний можно объединить в две категории.

  • Обычные методы испытаний
  • Методы испытаний, поддерживаемые поставщиком данных.

TestNG имеет две специальные настройки для удовлетворения потребностей вышеупомянутых двух категорий через

  • thread-count - который контролирует в любой момент времени, сколько обычных тестовых методов может работать одновременно.
  • data-provider-thread-count - который контролирует в любой заданной точке, сколько методов тестирования, управляемых данными, могут выполняться одновременно.

Когда вы включаете обе эти настройки (и когда у вас есть сочетание обычных и управляемых данными методов тестирования), происходит следующее: TestNG запускает все методы тестирования одновременно и среди них, если существуют методы тестирования, которые управляются данными по своей природе. эти итерации, управляемые данными, также выполняются параллельно.

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

Этот параметр дает вам максимальную пропускную способность с точки зрения скорости выполнения, но если у вас есть большее значение (полученное путем добавления значения обоих этих параметров), вы можете повлиять на общую производительность, потому что теперь JVM начнет выполнять больше переключения контекста вместо планирования потоков и выполнения работы.

Эмпирическое правило для числа потоков в упрощенном виде принимается за 2N-1 (где N представляет количество ядер в вашем процессоре. Поэтому, если у вас четырехъядерный процессор, максимальное число потоков должно быть 7 ). Это слишком упрощенный способ подсчета количества потоков, но знание этого помогло мне.

1 голос
/ 13 марта 2019

Короче говоря, parallel = true для аннотации поставщика данных позволяет использовать отдельный пул потоков для каждой итерации метода с тестовыми данными независимо от параллельного метода / класса / tests / none.

Когда вы добавляете parallel = true к аннотации поставщика данных, он будет рассматривать отдельный пул с размером, указанным с помощью data-provider-thread-count (по умолчанию 10). Поэтому, когда есть очередь теста с поставщиком данных, он будет выполняться параллельно с использованием отдельного пула потоков, даже если вы установили parallel=none в конфигурации пакета.

Дело parallel=none и поставщик данных parallel = false или не задано: Каждый метод, включая итерации поставщика данных, будет выполняться в одном потоке.

DP FIR ----1----1552433313814
DP FIR ----1----1552433317824
DP FIR ----1----1552433321834
DP FIR ----1----1552433325839
Normal FIR2 ----1----1552433329848
DP SEC ----1----1552433333855
DP SEC ----1----1552433337859
DP SEC ----1----1552433341865
DP SEC ----1----1552433345871
Normal SEC2 ----1----1552433349876

Корпус parallel=none и поставщик данных parallel = true:

Все методы должны выполняться последовательно в одном и том же потоке, чтобы принимать методы, управляемые данными. Если метод управляется данными, когда приходит очередь, текущий поток будет использовать отдельный пул для параллельного запуска каждой итерации в случае data-provider parallel = true. В приведенном ниже исполнении один поставщик данных установлен на parallel = true, а другой нет. Таким образом, вы можете видеть, что текущий поток выполняет итерацию в отдельном пуле для «DP FIR» и выполняет все итерации в текущем потоке для «DP SEC». (data-provider-thread-count не предоставлен, следовательно, по умолчанию 10)

DP FIR ----10----1552433554893
DP FIR ----12----1552433554893
DP FIR ----11----1552433554893
DP FIR ----13----1552433554894
Normal FIR2 ----1----1552433558907
DP SEC ----1----1552433562916
DP SEC ----1----1552433566923
DP SEC ----1----1552433570928
DP SEC ----1----1552433574933
Normal SEC2 ----1----1552433578938
<suite name="suite" >
    <test name="test">
        <classes>
            <class name="FirstNg" />
            <class name="SecondNg" />
        </classes>
    </test>
</suite>
public class FirstNg {


    @Test(dataProvider = "dp11", description = "f one")
    public void f11(Integer n, String s) throws InterruptedException {
        System.out.println("DP FIR ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
        Thread.sleep(4000);
    }

    @Test
    public void f12() throws InterruptedException {
        System.out.println("Normal FIR2 ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
        Thread.sleep(4000);
    }

    @DataProvider(parallel = true)
    //@DataProvider
    public Object[][] dp11() {
        return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
                new Object[] { 4, "d" } };
    }

}

public class SecondNg {

    @Test(dataProvider = "dp22", description="f two")
    public void f22(Integer n, String s) throws InterruptedException {
        System.out.println("DP SEC ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
        Thread.sleep(4000);
    }

    @Test
    public void f222() throws InterruptedException {
        System.out.println("Normal SEC2 ----" + Thread.currentThread().getId() + "----" + System.currentTimeMillis());
        Thread.sleep(4000);
    }

    //@DataProvider(parallel = true)
    @DataProvider
    public Object[][] dp22() {
        return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, new Object[] { 3, "c" },
                new Object[] { 4, "d" }};
    }       
}

Дело parallel=methods or classes:

С parallel=methods Он начнет выполняться параллельно, в зависимости от пула размера, предоставленного thread-count в конфигурации xml. Опять же, если метод управляется данными, когда наступит очередь, выделенный поток будет выполнять каждую итерацию в параллельном отдельном пуле. В противном случае выделенный поток запускает каждую итерацию последовательно.

Вы видите, что поток, назначенный для "DP FIR", выполняет итерацию в отдельном пуле для "DP FIR", но выполняет все итерации в назначенном потоке для "DP SEC".

DP FIR ----14----1552433989613
Normal FIR2 ----11----1552433989614
DP FIR ----17----1552433989613
DP SEC ----12----1552433989613
DP FIR ----16----1552433989613
DP FIR ----15----1552433989616
Normal SEC2 ----13----1552433989617
DP SEC ----12----1552433993625
DP SEC ----12----1552433997632
DP SEC ----12----1552434001640

Кейс parallel=methods or classes и поставщик данных parallel = false или не установлены:

когда наступит очередь метода, управляемого данными, каждая итерация будет выполняться последовательно в выделенном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...