Как я могу запустить тесты NUnit параллельно? - PullRequest
74 голосов
/ 23 июля 2010

У меня есть большой приемочный тест (~ 10 секунд на тест), написанный с использованием NUnit. Я хотел бы использовать тот факт, что все мои машины являются многоядерными. В идеале я бы мог иметь один тест на ядро ​​независимо от других тестов.

Существует PNUnit, но он предназначен для тестирования потоков с проблемами синхронизации и тому подобного, и я не видел очевидного способа сделать это.

Есть ли переключатель / инструмент / опция, которую я могу использовать для параллельного запуска тестов?

Ответы [ 13 ]

46 голосов
/ 02 августа 2010

Стандартный nunit runner не поддерживает параллельное выполнение тестов.Вы можете создать свой собственный тестовый прогон для параллельного запуска тестов (используя ваши текущие тесты nunit).Я не уверен, почему бригада не сделала этого уже.

В качестве альтернативы, MBUnit имеет возможность создания распараллеливаемых тестов, и поскольку MBUnit имеет почти такой же синтаксис, что и NUnit, для переключения может потребоваться не так много усилий.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, хотя этот ответ был верным на момент написания, если вы хотите запустить тесты NUnit параллельно, есть как минимум 2 варианта:

  • NCrunchпредлагает его «из коробки» (ничего не изменяя, но является коммерческим продуктом)
  • NUnit 3 предлагает атрибут параллелизации, который может использоваться для обозначения того, какие тесты могут выполняться параллельно
32 голосов
/ 27 августа 2015

NUnit версии 3 будет поддерживать параллельное выполнение тестов:

Добавление атрибута в класс: [Parallelizable(ParallelScope.Self)] будет запускать ваши тесты параллельно.

• ParallelScope.None указываетчто тест не может быть запущен параллельно с другими тестами.

• ParallelScope.Self указывает, что сам тест может выполняться параллельно с другими тестами.

• ParallelScope.Children указывает, что потомки теста могут выполняться параллельно относительно одногодругой.

• ParallelScope.Fixtures указывает, что приборы могут работать параллельно друг с другом.

NUnit Framework-Parallel-Test-Execution

10 голосов
/ 21 октября 2011

Если ваш проект содержит несколько тестовых 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 и его инструмент для запуска теста из командной строки для максимальной производительности тестового запуска. Ничего подобного нет, и в то же время он революционизирует ваш цикл тестирования-отладки кода.

4 голосов
/ 28 июля 2010

В этой статье упоминается, что для ускорения тестов постер запускает несколько экземпляров NUnit с параметрами команды, определяющими, какие тесты должен запускать каждый экземпляр.

FTA:

Я столкнулся со странной проблемой.

Мы используем nunit-console для запуска теста на нашем сервере непрерывной интеграции.Недавно мы переходили с Nunit 2.4.8 на 2.5.5 и с .Net 3.5 на 4.0.Чтобы ускорить выполнение теста, мы запускаем несколько экземпляров Nunit параллельно с разными аргументами командной строки

  • У нас есть две копии наших тестовых сборок и двоичных файлов в папках A и B.
  • В папке A мы выполняем

nunit-console-x86.exe Model.dll Test.dll / исключаем: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

  • В папке B мы выполняем

nunit-console-x86.exe Model.dll Test.dll / include: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

Если мы выполняем команды последовательно, обе команды запускаются успешно.Но если мы выполним их параллельно, это удастся только одному.Насколько я могу судить, именно он первым загружает тестовые приборы.Другой сбой с сообщением «Невозможно найти прибор».

Эта проблема уже известна?Я не смог найти ничего связанного в списке ошибок на панели запуска.Кстати, наш сервер работает под управлением Windows Server 2008 64-bit.Я также мог бы воспроизвести проблему в 64-разрядной версии Windows 7.

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

Обновление

TeamCity выглядит как инструмент, который можно использовать для автоматического запуска тестов NUnit.У них есть модуль запуска NUnit , обсуждаемый здесь , который можно использовать для запуска нескольких экземпляров NUnit. Здесь - это запись в блоге, в которой обсуждается объединение нескольких результатов NUnit XML в один файл результатов.

Таким образом, теоретически вы можете заставить TeamCity автоматически запускать несколько тестов NUnit на основе того, что вы хотите разделитьрабочая нагрузка, а затем объединить результаты в один файл для обработки после тестирования.

Достаточно ли это автоматизировано для ваших нужд?

3 голосов
/ 21 сентября 2012

Теперь вы можете использовать NCrunch для распараллеливания ваших модульных тестов, и вы даже можете настроить, сколько ядер должно использоваться NCrunch, а сколько - Visual Studio.

плюс вы получаете непрерывное тестирование в качестве бонуса:)

3 голосов
/ 30 июля 2010

То, что PNUnit может выполнять синхронизацию внутри тестового кода, не означает, что вам действительно нужно использовать этот аспект. Насколько я понимаю, ничто не мешает вам просто порождать сет и игнорировать остальные, пока они вам не понадобятся.

Кстати, у меня нет времени, чтобы прочитать все их источники, но мне было любопытно проверить класс Barrier, и это очень простой счетчик блокировок. Он просто ждет, пока N потоков не войдет, а затем отправит импульс всем им для продолжения работы одновременно. Это все, что нужно сделать - если вы не коснетесь этого, это вас не укусит.

Может показаться немного противоречивым для нормальной многопоточной разработки (блокировки обычно используются для сериализации доступа - 1 на 1), но это довольно энергичное отклонение :-)

2 голосов
/ 06 июля 2013

Вы можете попробовать мой маленький инструмент TBox или консольную параллель Runner или даже плагин для выполнения распределенных вычислений, который также может запускать модульные тесты на множестве компьютеров SkyNet

TBox создан для упрощения работы с большими решениями, которые содержат множество проектов. Он поддерживает множество плагинов, и один из них обеспечивает возможность параллельного запуска тестов NUnit. Этот плагин не требует каких-либо изменений в ваших существующих тестах.

Также поддерживается:

  • Клонирование папки с юнит-тестом (если ваши тесты изменяют локальные данные),

  • Синхронизация тестов (например, если ваши тесты на testfixtureteardown убивает все dev-серверы или chromerunner для qunit)

  • Режим x86 и права администратора для запуска тестов

  • Пакетный запуск - вы можете запускать тесты для многих сборок параллельно

  • Даже при однопоточном запуске работает быстрее, чем стандартный nunit runer, если у вас много маленьких тестов.

Также этот инструмент поддерживает запуск тестов командной строки (для параллельного запуска), и вы можете использовать его с непрерывной интеграцией.

2 голосов
/ 10 августа 2011

Так как проект здесь не упоминался, я хотел бы вызвать NUnit.Multicore .Я сам не пробовал проект, но, похоже, у него интересный подход к проблеме параллельного тестирования с NUnit.

2 голосов
/ 28 июля 2010

Было бы немного взломать, но вы можете разделить юнит-тесты на несколько категорий . Затем запустите новый экземпляр NUnit для каждой категории.

Редактировать: похоже, они добавили параметр / process в консольное приложение. В справке командной строки указано, что это «Модель процесса для тестов: один, отдельный, несколько». Бегущий по тестам также, кажется, имеет эту функцию.

Редактировать 2: К сожалению, хотя он создает отдельные процессы для каждой сборки, опция изоляции процесса (/ process из командной строки) запускает агентов по одному.

1 голос
/ 31 августа 2015

Я успешно использовал бета-4 NUnit 3.0.0 для параллельного запуска тестов

  • Работает на сервере сборки
  • Запускает тесты Selenium
  • Имеет Visual Studioподдержка
  • пока нет поддержки Resharper

Спасибо за Ответ от пира .

Получено:

  • Атрибут распараллеливанияне наследуется, поэтому он должен быть указан в тестовом классе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...