У меня есть большой приемочный тест (~ 10 секунд на тест), написанный с использованием NUnit. Я хотел бы использовать тот факт, что все мои машины представляют собой несколько стержневых ящиков. В идеале у меня будет возможность запускать один тест на ядро, независимо от других тестов.
Существует PNUnit, но он предназначен для тестирования проблем с синхронизацией потоков и тому подобного, и я не видел очевидного способа сделать это.
Есть ли переключатель / инструмент / параметр, который я могу использовать для параллельного запуска тестов?
Ответы:
Если вы хотите запускать тесты NUnit параллельно, есть как минимум 2 варианта:
источник
NUnit версии 3 будет поддерживать параллельное выполнение тестов:
Добавление атрибута в класс:
[Parallelizable(ParallelScope.Self)]
запустит ваши тесты параллельно.NUnit Framework-Параллельное-Тест-Выполнение
источник
Если ваш проект содержит несколько тестовых DLL, вы можете запускать их параллельно с помощью этого сценария MSBuild. Очевидно, вам нужно настроить пути в соответствии с макетом вашего проекта.
Для работы с 8 ядрами запустите:
c:\proj> msbuild /m:8 RunTests.xml
RunTests.xml
<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="RunTestsInParallel" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> <Nunit Condition=" '$(Nunit)' == '' ">$(MSBuildProjectDirectory)\..\tools\nunit-console-x86.exe</Nunit> </PropertyGroup> <!-- see http://mikefourie.wordpress.com/2010/12/04/running-targets-in-parallel-in-msbuild/ --> <Target Name="RunTestsInParallel"> <ItemGroup> <TestDlls Include="..\bin\Tests\$(Configuration)\*.Tests.dll" /> </ItemGroup> <ItemGroup> <TempProjects Include="$(MSBuildProjectFile)" > <Properties>TestDllFile=%(TestDlls.FullPath)</Properties> </TempProjects> </ItemGroup> <MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="RunOneTestDll" /> </Target> <Target Name="RunOneTestDll"> <Message Text="$(TestDllFile)" /> <Exec Command="$(Nunit) /exclude=Integration $(TestDllFile) /labels /xml:$(TestDllFile).results.xml" WorkingDirectory="$(MSBuildProjectDirectory)\..\bin\Tests\$(Configuration)" /> </Target> </Project>
Обновление Если бы я отвечал на этот вопрос сейчас, я бы настоятельно рекомендовал NCrunch и его инструмент для запуска тестов из командной строки для максимальной производительности тестового запуска. Ничего подобного нет, и в то же время это произведет революцию в цикле тестирования кода и отладки.
источник
В этой статье упоминается, что для ускорения тестов плакат запускает несколько экземпляров NUnit с параметрами команды, определяющими, какие тесты должен запускать каждый экземпляр.
FTA:
Предполагая, что эта ошибка исправлена или вы не используете более новую (ые) версию (ы) упомянутого программного обеспечения, вы сможете воспроизвести их технику.
Обновить
TeamCity выглядит как инструмент, который можно использовать для автоматического запуска тестов NUnit. Здесь обсуждается средство запуска NUnit, которое можно использовать для запуска нескольких экземпляров NUnit. Вот сообщение в блоге, в котором обсуждается объединение нескольких результатов NUnit XML в один файл результатов.
Таким образом, теоретически вы можете заставить TeamCity автоматически запускать несколько тестов NUnit в зависимости от того, хотите ли вы разделить рабочую нагрузку, а затем объединить результаты в один файл для обработки после тестирования.
Достаточно ли это автоматизировано для ваших нужд?
источник
Тот факт, что PNUnit может выполнять синхронизацию внутри тестового кода, не означает, что вам действительно нужно использовать этот аспект. Насколько я понимаю, нет ничего, что могло бы помешать вам просто создать набор и игнорировать все остальное, пока оно вам не понадобится.
Кстати, у меня нет времени читать весь их источник, но мне было любопытно проверить класс Barrier, и это очень простой счетчик блокировок. Он просто ждет, пока войдут N потоков, а затем отправляет импульс, чтобы все они продолжали работать одновременно. Вот и все - если вы не прикоснетесь к нему, он вас не укусит.
Может быть немного противоречиво интуитивно понятно для нормальной многопоточной разработки (блокировки обычно используются для сериализации доступа - 1 на 1), но это довольно энергичное отклонение :-)
источник
Теперь вы можете использовать NCrunch для распараллеливания модульных тестов, и вы даже можете настроить, сколько ядер должно использоваться NCrunch, а сколько должно использоваться Visual Studio.
плюс непрерывное тестирование в качестве бонуса :)
источник
В качестве альтернативы добавлению атрибута Parallelizable в каждый тестовый класс:
Добавьте это в класс AssemblyInfo.cs тестового проекта для nunit3 или выше:
источник
Это было бы немного похоже на взлом, но вы можете разделить модульные тесты на несколько категорий . Затем запустите новый экземпляр NUnit для каждой категории.
Изменить: похоже, что они добавили параметр / process в консольное приложение. В справке командной строки указано, что это «Модель процесса для тестов: одиночный, отдельный, множественный». У тестового раннера также есть эта функция.
Изменить 2: К сожалению, хотя он создает отдельные процессы для каждой сборки, параметр изоляции процесса (/ process из командной строки) запускает агенты по одному.
источник
Поскольку этот проект здесь не упоминался, я хотел бы упомянуть NUnit.Multicore . Сам я не пробовал этот проект, но, похоже, у него интересный подход к проблеме параллельного тестирования с NUnit.
источник
Вы можете попробовать мой небольшой инструмент TBox или консольный параллельный Runner или даже плагин для выполнения распределенных вычислений, который также может запускать модульные тесты на наборе ПК SkyNet.
TBox создан для упрощения работы с большими решениями, в которые входит множество проектов. Он поддерживает множество плагинов, и один из них позволяет запускать тесты NUnit параллельно. Этот плагин не требует никаких изменений в ваших существующих тестах.
Также он поддерживает:
Клонирование папки с модульным тестом (если ваши тесты изменяют локальные данные),
Синхронизация тестов (например, если ваши тесты на testfixtureteardown убивают все серверы разработчиков или chromerunner для qunit)
Режим x86 и права администратора для запуска тестов
Пакетный запуск - вы можете запускать тесты для многих сборок параллельно
Даже для однопоточного запуска работает быстрее, чем стандартный nunit runner, если у вас много небольших тестов.
Также этот инструмент поддерживает запуск тестов командной строки (для параллельного запуска), и вы можете использовать его с непрерывной интеграцией.
источник
Я успешно использовал NUnit 3.0.0 beta-4 для параллельного запуска тестов
Спасибо за ответ коллег .
Попадания:
источник
Вы можете использовать следующую команду PowerShell (для NUnit3, для NUnit2 изменить имя бегуна):
Представленная команда запускает все тестовые сборки в одном экземпляре nunit, что позволяет использовать встроенный в движок параллельный тестовый запуск .
Замечания
Не забудьте настроить шаблон поиска в каталоге. В данном примере выполняются только сборки, заканчивающиеся на каталоги
.Tests.dll
и внутри них\bin\Debug
.Помните о
Unique
фильтрации - вы можете не захотеть ее иметь.источник