Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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


Ответы:


1

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

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

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

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

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

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

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

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

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

13.03.2019
  • Отличная информация. Спасибо. Получил 2 похожих запроса. Имеет ли parallel параметр для обычного тестирования приоритет над parallel для параметра поставщика данных, когда используются оба параметра? Если параллельно работает более одного провайдера данных, то у каждого из них есть отдельный пул потоков? 14.03.2019
  • Нет. С этими двумя атрибутами не связано никакого приоритета или иерархии. И ко второму вопросу. Все обычные методы используют один и тот же пул потоков, а все методы поставщиков данных используют один и тот же пул потоков. Таким образом, у testng всего два пула потоков. 15.03.2019

  • 2

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

    Когда вы добавляете 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:

    Все методы должны выполняться последовательно в одном потоке, принимающем методы, управляемые данными. Если метод управляется данными, когда наступит его очередь, текущий поток будет использовать отдельный пул для параллельного запуска каждой итерации в случае поставщика данных parallel = true. В приведенном ниже исполнении для одного поставщика данных установлено значение parallel = true, а для другого - нет. Таким образом, вы можете видеть, что текущий поток выполняет итерацию в отдельном пуле для «DP FIR» и выполняет все итерации в текущем потоке для «DP SEC». (количество потоков поставщика данных не предоставляется, поэтому по умолчанию 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 или не заданы:

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

    12.03.2019
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..