Как я могу запускать тесты NUnit параллельно?

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

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

Есть ли параметр switch/tool/, который я могу использовать для параллельного запуска тестов?

Ответ 1

Если вы хотите запустить тесты NUnit параллельно, есть как минимум 2 варианта:

  • NCrunch предлагает его из коробки (ничего не меняя, но это коммерческий продукт)
  • NUnit 3 предлагает распараллеливаемый атрибут, который может использоваться, чтобы указать, какие тесты могут выполняться параллельно

Ответ 2

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

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

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

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

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

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

NUnit Framework-Parallel-Test-Execution

Ответ 3

Если ваш проект содержит несколько тестовых DLL, вы можете запускать их параллельно, используя этот MSBuild script. Очевидно, вам нужно будет настроить пути в соответствии с вашими проектами.

Для запуска с 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

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

FTA:

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

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

  • У нас есть две копии наших тестовых сборок и двоичные файлы 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

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

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

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

Обновление

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

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

Насколько это автоматизировано для ваших нужд?

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

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

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

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

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

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

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

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

Ответ 11

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

  • Выполняется на сервере сборки
  • Выполняет тесты Selenium
  • Поддержка Visual Studio
  • нет поддержки Resharper

Спасибо за ответ коллег.

Gotchas:

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

Ответ 12

Вы можете использовать следующую команду PowerShell (для NUnit3, для имени изменения имени NUnit2):

PS> nunit3-console (ls -r *\bin\Debug\*.Tests.dll | % FullName | sort-object -Unique)

Представленная команда запускает все тестовые сборки в одном экземпляре nunit, что позволяет использовать механизм встроенный параллельный тестовый запуск.

Примечания

  • Не забудьте настроить шаблон поиска каталогов. В данном примере выполняются только сборки, заканчивающиеся на .Tests.dll и внутри \bin\Debug.

  • Помните о фильтрации Unique - вы можете не захотеть ее иметь.

Ответ 13

В качестве альтернативы добавлению атрибута Parallelizable для каждого тестового класса:

Добавьте это в тестовый проект AssemblyInfo.cs класс для nunit3 или выше:

// Make all tests in the test assembly run in parallel
[assembly: Parallelizable(ParallelScope.Fixtures)]