У меня есть среда автоматизации тестирования, основанная на 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>
Вы упомянули, что включили параллелизм поставщиков данных. Можете ли вы также показать нам, как выглядит ваш файл пакета? Пожалуйста, отредактируйте свой вопрос и добавьте содержимое файла пакета вместе с версией TestNG, которую вы используете. Основная причина в основном в том, что вы включили параллелизм поставщика данных с большим размером пула потоков и соединили его с параллелизмом, включенным на уровне метода.
Допустим, у вас количество потоков равно 20, а количество потоков вашего поставщика данных — 10 и параллельны в качестве методов, тогда вы буквально говорите TestNG создавать 20 * 19 потоков (я предполагаю, что все ваши тесты являются тестами, управляемыми данными) . Это всего лишь предположение.
привет @KrishnanMahadevan, да, все мои тесты — это тесты поставщиков данных. Каждый мой TC будет запускать 20 строк, полученных из Excel (так что да, 20 потоков должны выполняться параллельно для каждого TC). Я нигде не указал число потоков и никаких изменений в testng.xml. Ранее я пробовал это в своем файле testNg — <suite name = "Manage" data-provider-thread-count = "3" >




Основная причина OutOfMemoryError, скорее всего, связана с тем, что ваши тесты создают много потоков.
TestNG имеет в своем распоряжении 2 пула потоков.
thread-count — Показывает, сколько обычных методов тестирования (которые НЕ управляются поставщиком данных) могут выполняться параллельно. Он имеет значение по умолчанию 5.data-provider-thread-count — Показывает, сколько тестов, управляемых данными, можно выполнять параллельно в любой момент времени. Также необходимо установить @DataProvider(parallel=true). Он имеет значение по умолчанию 10.Предположим, вы установили parallel=methods на уровне <suite> или на уровне <test>:
@DataProvider(parallel=true), то TestNG по сути будет выполняться 5*10 = 50 threads параллельно.В зависимости от конфигурации вашего компьютера и конфигурации памяти ОС может или не может создавать такое количество потоков.
У вас есть несколько вариантов взять это под свой контроль.
data-provider-thread-count, а также явно укажите значение для thread-count.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. По сути, эта новая версия попытается обнаружить возможные взаимоблокировки и соответствующим образом предупредит вас, остановив выполнение.
Можете ли вы предоставить более подробную информацию, какую версию Maven, версию JDK и версии плагинов вы используете? Как выглядит полная конфигурация и т. д.