Dataprovider+TestNG — исключение в потоке «surefire-forkedjvm-command-thread» java.lang.OutOfMemoryError: пространство кучи Java

У меня есть среда автоматизации тестирования, основанная на testng и dataprovider. Я запускаю свой код на сервере с помощью задания Дженкинса. Это задание выполняет тестовые случаи с использованием командной строки maven. Выполнение этого задания занимало более 3 часов, поэтому я хотел запустить тестовые примеры параллельно/одновременно, для чего я добавил Parallel=true в свой метод поставщика данных.

@DataProvider(name = "data-provider",**parallel = true**)
    protected Object[][] Credentials { return objArray[][];}

Но когда это задание Дженкинса выполняется в Azure, я получаю исключение ниже.

Исключение в потоке «surefire-forkedjvm-command-thread» java.lang.OutOfMemoryError: пространство кучи Java в java.util.concurrent.ConcurrentLinkedQueue.iterator(ConcurrentLinkedQueue.java:669) в org.apache.maven.surefire.booter.CommandReader$CommandRunnable.insertToListeners(CommandReader.java:469) в org.apache.maven.surefire.booter.CommandReader$CommandRunnable.run(CommandReader.java:424) в java.lang.Thread.run(Thread.java:750)

Пожалуйста, дайте мне знать, какие у меня есть варианты, поскольку, похоже, мой размер кучи исчерпан. Я также пытался указать ниже в своем pom.xml, но не получилось.

<artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Xms1024m -Xmx2048m</argLine>

Нет количества потоков или параллельных данных, указанных в TestNG.xml, а также в методе поставщика данных. Только что использовал этот @DataProvider(name = "data-provider",parallel = true)

Однако ранее я пробовал использовать ниже в testng.xml. Но, возможно, я не смог правильно настроить потоки, потому что при запуске пакета он зависал.

<suite name = "API AMS regression suite" verbose = "10"  data-provider-thread-count = "20" >
  
    <test name = "POS Testcases">
        <classes>
            <class name = "com.qa.apis.tests.Pos"/>
        </classes>
    </test>
</suites>

Можете ли вы предоставить более подробную информацию, какую версию Maven, версию JDK и версии плагинов вы используете? Как выглядит полная конфигурация и т. д.

khmarbaise 07.05.2024 12:16

Вы упомянули, что включили параллелизм поставщиков данных. Можете ли вы также показать нам, как выглядит ваш файл пакета? Пожалуйста, отредактируйте свой вопрос и добавьте содержимое файла пакета вместе с версией TestNG, которую вы используете. Основная причина в основном в том, что вы включили параллелизм поставщика данных с большим размером пула потоков и соединили его с параллелизмом, включенным на уровне метода.

Krishnan Mahadevan 07.05.2024 14:59

Допустим, у вас количество потоков равно 20, а количество потоков вашего поставщика данных — 10 и параллельны в качестве методов, тогда вы буквально говорите TestNG создавать 20 * 19 потоков (я предполагаю, что все ваши тесты являются тестами, управляемыми данными) . Это всего лишь предположение.

Krishnan Mahadevan 07.05.2024 15:00

привет @KrishnanMahadevan, да, все мои тесты — это тесты поставщиков данных. Каждый мой TC будет запускать 20 строк, полученных из Excel (так что да, 20 потоков должны выполняться параллельно для каждого TC). Я нигде не указал число потоков и никаких изменений в testng.xml. Ранее я пробовал это в своем файле testNg — <suite name = "Manage" data-provider-thread-count = "3" >

Mandy 07.05.2024 15:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная причина OutOfMemoryError, скорее всего, связана с тем, что ваши тесты создают много потоков.

TestNG имеет в своем распоряжении 2 пула потоков.

  • thread-count — Показывает, сколько обычных методов тестирования (которые НЕ управляются поставщиком данных) могут выполняться параллельно. Он имеет значение по умолчанию 5.
  • data-provider-thread-count — Показывает, сколько тестов, управляемых данными, можно выполнять параллельно в любой момент времени. Также необходимо установить @DataProvider(parallel=true). Он имеет значение по умолчанию 10.

Предположим, вы установили parallel=methods на уровне <suite> или на уровне <test>:

  • Допустим, в вашем проекте есть 5 методов тестирования, тогда TestNG запустит все 5 методов параллельно.
  • Теперь, если все ваши 5 методов тестирования на самом деле являются методами, основанными на поставщике данных и настроены для параллельной работы через @DataProvider(parallel=true), то TestNG по сути будет выполняться 5*10 = 50 threads параллельно.

В зависимости от конфигурации вашего компьютера и конфигурации памяти ОС может или не может создавать такое количество потоков.

У вас есть несколько вариантов взять это под свой контроль.

  • Уменьшите количество потоков для data-provider-thread-count, а также явно укажите значение для thread-count.
  • Перейдите к использованию TestNG 7.10.2, который теперь содержит пару новых функций, которые помогут вам справиться с этим, позволяя использовать общий пул потоков.

Для полноты картины я цитирую соответствующие разделы из документации.

пул потоков для поставщиков данных — если для этого атрибута установлено значение true на уровне пакета, TestNG начнет использовать общий пул потоков для всех тестов, управляемых данными, в данном файле . Размер пул потоков определяется с помощью атрибута количество потоков-поставщика данных. Этот атрибут имеет значение по умолчанию ЛОЖЬ.

use-global-thread-pool — если для этого атрибута установлено значение true в уровне пакета, TestNG начнет использовать общий пул потоков для запуска как ваши обычные методы тестирования, так и методы тестирования, основанные на данных. Размер пула потоков определяется с помощью атрибута thread-count. Этот атрибут имеет значение по умолчанию false.

Подробное объяснение см. https://testng.org/#_controlling_threadpool_usage

PS: Когда вы используете use-global-thread-pool и у вас есть тесты, управляемые данными, есть вероятность, что вы наткнетесь на эту ошибку https://github.com/testng-team/testng/issues/3028 Пожалуйста, просмотрите этот дефект, чтобы понять, что вызывает эту проблему.

Эта проблема исправлена ​​в последней версии TestNG и должна быть доступна для использования с 7.11.0. По сути, эта новая версия попытается обнаружить возможные взаимоблокировки и соответствующим образом предупредит вас, остановив выполнение.

Другие вопросы по теме