Как я могу запустить тесты NUnit параллельно?
У меня есть большой приемочный тест (~10 секунд на тест) тестовый набор, написанный с использованием NUnit. Я хотел бы использовать тот факт, что все мои машины-это несколько основных ящиков. В идеале, я мог бы иметь один тест, работающий на ядро, независимо от других тестов.
есть PNUnit, но он предназначен для тестирования проблем синхронизации потоков и тому подобных вещей, и я не видел очевидного способа добиться этого.
есть ли переключатель / инструмент / опция, которую я могу использовать для параллельного выполнения тестов?
12 ответов:
стандартный бегун nunit не поддерживает выполнение тестов параллельно. Ты can создайте свой собственный тестовый бегун для параллельного выполнения тестов (используя текущие тесты nunit). Я не уверен, почему команда nunit еще не сделала этого.
кроме того, MBUnit имеет возможность создавать распараллеливаемые тесты, и поскольку MBUnit имеет почти тот же синтаксис, что и NUnit, для этого может потребоваться не так много усилий.
EDIT: Как отмечено в комментариях, хотя этот ответ был правильным на момент написания, если вы хотите запустить тесты NUnit параллельно сейчас, есть по крайней мере 2 варианта:
- NCrunch предлагает его из коробки (ничего не меняя, но является коммерческим продуктом)
- NUnit 3 предлагает распараллеливаемый атрибут, который может использоваться для обозначения того, какие тесты могут выполняться параллельно
NUnit версии 3 будет поддерживать выполнение тестов параллельно:
добавление атрибута в класс:
[Parallelizable(ParallelScope.Self)]будет запускать тесты параллельно.• ParallelScope.Нет указывает, что тест не может выполняться параллельно с другими тестами.
• ParallelScope.Самостоятельно указывает на то, что тест может работать параллельно с другими тестами.
• ParallelScope.Дети указывает, что потомки теста могут быть работать параллельно по отношению друг к другу.
• ParallelScope.Fixtures указывает, что светильники могут работать параллельно друг с другом.
Если ваш проект содержит несколько тестовых библиотек DLL, вы можете запускать их параллельно с помощью этого сценария MSBuild. Очевидно, вам нужно будет настроить пути в соответствии с вашим макетом проекта.
для запуска с 8 ядрами запустите с:
c:\proj> msbuild /m:8 RunTests.xmlRunTests.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:
Я столкнулся со странной проблемой.
мы используем NUnit-консоль для запуска теста наш сервер непрерывной интеграции. Недавно мы переехали из Нанит 2.4.8-2.5.5 и от .Net 3.5 до 4.0. Чтобы ускорить выполнение теста, мы запускаем несколько экземпляров Nunit in параллельно с другой командной строкой аргументы
- у нас есть две копии наших тестовых сборок и двоичных файлов nunit папка A и B.
- в папке A мы выполняем
nunit-консоль-x86.модель ехе.файл DLL Тест.dll / exclude:MyCategory /xml=TestResults.XML /framework=net-4.0 / noshadow
- в папке B мы выполняем
nunit-консоль-x86.исполняемый Модель.файл DLL Тест.dll / include:MyCategory /xml=TestResults.XML /framework=net-4.0 / noshadow
Если мы выполняем команды последовательно оба работают успешно. Но если мы выполнять их параллельно, только один преуспевает. Насколько я могу судить, это тот, который сначала загружает тест арматура. Другой терпит неудачу с помощью сообщение "не удается найти прибор".
эта проблема уже известна? Я мог бы не найти ничего связанного в баге список стартовая площадка. Кстати наш сервер работает Для Windows Server 2008 64-разрядная. Я мог бы также воспроизвести проблему на Windows 7 64-бит.
предполагая, что эта ошибка исправлена или вы не используете более новую версию(ы) упомянутого программного обеспечения, вы должны иметь возможность реплицировать свою технику.
обновление
TeamCity похоже на инструмент, который можно использовать для автоматического запуска тестов NUnit. У них есть пусковая установка NUnit обсуждали здесь это может быть использовано для запуска нескольких экземпляров NUnit. здесь это сообщение в блоге, в котором обсуждается слияние нескольких результатов NUnit XML в один файл результатов.
таким образом, теоретически вы можете иметь TeamCity автоматически запускать несколько тестов NUnit на основе однако вы хотите разделить рабочую нагрузку, а затем объединить результаты в один файл для обработки после тестирования.
Это достаточно автоматизировано для ваших нужд?
только потому, что PNUnit может выполнять синхронизацию внутри тестового кода, не означает, что вам действительно нужно использовать этот аспект. Насколько я вижу, ничто не мешает вам просто порождать набор и игнорировать остальное, пока вам это не понадобится.
кстати у меня нет времени, чтобы прочитать все их источник, но было любопытно проверить класс барьера, и это очень простой счетчик блокировки. Он просто ждет, пока N потоков не войдут, а затем отправляет импульс для всех из них, чтобы продолжить работу в то же время. Вот и все - если вы не прикоснетесь к нему, он не укусит вас.
может быть немного интуитивным для нормального развития резьбы (замки обычно используются для сериализации доступа-1 на 1), но это довольно энергичная диверсия : -)
теперь вы можете использовать NCrunch чтобы распараллелить модульные тесты, и вы даже можете настроить, сколько ядер должно использоваться NCrunch и сколько должно использоваться Visual Studio.
плюс вы получаете непрерывное тестирование в качестве бонуса:)
Это было бы немного взломать, но вы могли бы разделить модульные тесты на ряд категории. Затем запустите новый экземпляр NUnit для каждой категории.
Edit: похоже, они добавили параметр /process в консольное приложение. В справке командной строки указано, что это"модель процесса для тестов: один, отдельный, несколько". У тестового бегуна также есть эта функция.
Edit 2: К сожалению, хотя он создает отдельные процессы для каждой сборки параметр изоляции процесса (/process из командной строки) запускает агенты по одному за раз.
Так как проект не был упомянут здесь, я хотел бы поднять Нанит.Многоядерный. Я сам не пробовал проект, но, похоже, у него есть интересный подход к параллельной тестовой проблеме с NUnit.
вы можете попробовать мой небольшой инструмент TBox или консоли параллельно Бегун или даже плагин для выполнения распределенных вычислений, который также может запускать модульные тесты на множестве ПК Скайнет
TBox создан для упрощения работы с большими решениями, которые содержат много проектов. Он поддерживает множество плагинов, и один из них обеспечивает возможность параллельного запуска тестов NUnit. Этот плагин не требует никаких изменений в существующих тестов.
также поддержка:
клонирование папки с модульным тестом (если ваши тесты изменяют локальные данные),
синхронизация тестов (например, если ваши тесты на testfixtureteardown убивает все серверы dev или chromerunner для qunit)
режим x86 и права администратора для запуска тестов
пакетный запуск-вы можете запускать тесты для многих сборок параллельно
даже для однопоточный запуск, работает быстрее, чем стандартный NUnit runner, если у вас есть много небольших тестов.
также этот инструмент поддерживает запуск тестов командной строки (для параллельного запуска), и вы можете использовать его с непрерывной интеграцией.
Я успешно использовал NUnit 3.0.0 beta-4 для параллельного выполнения тестов
- работает на сервере сборки
- проходит тесты Selenium
- имеет поддержку Visual Studio
- пока нет поддержки Resharper
спасибо сверстников ответа.
Gotchas:
- атрибут Распараллеливаемых не передается по наследству, поэтому он должен быть указан на тестовом классе.
вы можете использовать следующую команду PowerShell (для NUnit3, для NUnit2 изменить имя бегуна):
PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)представленная команда запускает все тестовые сборки в одном экземпляре nunit, что позволяет использовать engine встроенный параллельный тест.
Примечания
не забудьте настроить шаблон поиска в каталоге. Данный пример запускает только сборки, заканчивающиеся на
.Tests.dllи внутри\bin\Debugсправочники.курсе
Uniqueфильтрация-вы не можете иметь его.
Comments