Как я могу подтвердить, сколько тестов выполняется параллельно?

Я запускаю свои модульные тесты на 16-ядерной машине. Я не вижу разницы в прошедшем времени, если не используются параметры распараллеливания, --workers=1 и --workers=32. Я хотел бы подтвердить, что NUnit действительно выполняет ожидаемое количество одновременных тестов, так что я не трачу время на поиск несуществующей проблемы в моем тестовом коде.

У меня [Parallelizable] (область действия по умолчанию, ParallelScope.Self) в общем базовом классе. Он не определен ни в каком другом классе или методе. Я использую nunit3-console как через Jenkins, так и в моей локальной командной строке.

Есть ли способ узнать, что тесты выполняются параллельно? NUnit сообщает правильное количество рабочих потоков, но нет отчета, указывающего (например), сколько тестов было запущено в каждом потоке.

Run Settings
    ProcessModel: Multiple
    RuntimeFramework: net-4.5
    WorkDirectory: C:\Jenkins\workspace\myproject
    NumberOfTestWorkers: 16

Я могу регистрировать время начала и окончания каждого теста, а затем вручную проверять наличие разумного количества перекрытий; есть ли более простой и повторяемый способ получить то, что я хочу?


person Paul Hicks    schedule 02.12.2015    source источник
comment
Какой шаблон используется nunit. Другим вариантом может быть pnunit. Содержит ли список задач строки cmd дочерние процессы nunit?   -  person lloyd    schedule 03.12.2015
comment
Разве nunit3 по сути не nunit2 + pnunit (+ отличный рефакторинг)?   -  person Paul Hicks    schedule 03.12.2015
comment
Тесты полностью независимы (ну, как и веб-запросы). Так что стреляйте и забудьте из списка в том вопросе, на который вы ссылались.   -  person Paul Hicks    schedule 03.12.2015


Ответы (2)


Я включил --trace=Verbose, который производит несколько файлов. InternalTrace.<pid1>.log и InternalTrace.<pid2>.<dll_name>.log вместе содержали подробное описание того, что происходило во время испытаний. Журнал для каждого агента (с именем DLL в имени файла журнала) довольно четко отражал состояние распараллеливания.

16:13:40.701 Debug [10] WorkItemDispatcher: Directly executing test1
16:13:47.506 Debug [10] WorkItemDispatcher: Directly executing test2
16:13:52.847 Debug [10] WorkItemDispatcher: Directly executing test3
16:13:58.922 Debug [10] WorkItemDispatcher: Directly executing test4
16:14:04.492 Debug [10] WorkItemDispatcher: Directly executing test5("param1")
16:14:09.720 Debug [10] WorkItemDispatcher: Directly executing test5("param2")
16:14:14.618 Debug [10] WorkItemDispatcher: Directly executing test5("param3")

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

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

person Paul Hicks    schedule 03.12.2015
comment
Привет, Пол, сейчас ищу аналогичную проблему. Вы когда-нибудь приходили к выводу, что может быть не так? - person Chris; 22.12.2015
comment
да. [Parallelizable] не наследуется: см. комментарий Чарли Пула о NUnit. -Обсудить группу. Я последовал его совету и дал сборке атрибут через AssemblyInfo.cs, а затем аннотировал непараллельные тесты с помощью [Apartment(ApartmentState.STA)]. Я могу найти вопрос (или создать его), чтобы добавить его в качестве ответа, если это будет полезно. - person Paul Hicks; 22.12.2015
comment
Спасибо, Пол - сегодня днем ​​я немного покопался, и я думаю, что у меня была ограниченная память ... после закрытия визуальной студии она начала занимать до 4 ГБ памяти, прежде чем достигла следующего предела, и время выполнения улучшилось. Однако спасибо за подробности отладки выше, которые указали мне в правильном направлении. - person Chris; 22.12.2015

Могу ошибиться, но мне кажется, что установить параметр [Parallelizable] недостаточно, чтобы тесты запускались параллельно. Вам также необходимо создать узлы, которые будут запускать тесты. Поэтому, если вы используете Jenkins, вам нужно создать Jenkins Slaves, и только тогда ваши тесты будут запускаться параллельно.

Итак, я хочу сказать, что, насколько я понимаю, нет возможности запускать тесты параллельно на одном ПК.

Если бы была такая возможность (запускать тесты параллельно на одной машине), это было бы действительно здорово, и я с трудом слышу об этом!

person Denis Koreyba    schedule 03.12.2015
comment
Нет, все будет нормально, если я добавлю атрибут Parallelizable к каждому TestFixture. Если бы мы зашли так далеко, что использовали отдельные задания Jenkins, то распараллеливание в него бы не пошло. Используя эту технику, я мог запускать непараллельные тесты параллельно. - person Paul Hicks; 03.12.2015