Як можна паралельно запускати тести NUnit?


83

У мене великий тест на прийняття (~ 10 секунд на тест), написаний за допомогою NUnit. Я хотів би скористатися тим фактом, що всі мої машини - це багато ядер. В ідеалі, я міг би мати одне тестування на одне ядро, незалежно від інших тестів.

Існує PNUnit, але він призначений для тестування на проблеми з синхронізацією потоків та подібні речі, і я не бачив очевидного способу досягнення цього.

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


Навіть я хотів би дізнатися більше про це. @Billy ONeal, будь ласка, опублікуйте відповідь, якщо знайдете.
ПК

Ви говорите десять секунд на тест і в ідеалі один тест, що працює на ядро. Чи інтенсивні тести процесора? В іншому випадку має бути можливо, щоб набагато більше працювало одночасно.
Маттіас Нільссон,

@Mattias: Так, тести вимагають значного процесора.
Billy ONeal

Відповіді:


52

Якщо ви хочете запускати тести NUnit паралельно, існує принаймні 2 варіанти:

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

Ця відповідь здається помилковою з огляду на запитання, скоріше гарною пропозицією, ніж правдивою відповіддю. На мою думку, NCrunch потребує ваших голосів "за" і повинен бути найкращою відповіддю, оскільки він може запускати (NUnit) тести одночасно в рамках одного і того ж або декількох процесів і на одній або багатьох машинах, і робитиме це з VS або з сервера збірки.
chillitom

2
@chillitom NCrunch був випущений після відповіді на це запитання, і є хорошим вибором (оскільки це просто має працювати нестандартно, хоча для деяких це занадто дорого). Інші варіанти в майбутньому можуть включати NUnit 3, який може пропонувати паралельний запуск тестів (згідно github.com/nunit/dev/wiki/Roadmap ).
David_001

3
Хоча це головна відповідь, вона вже не така правильна, як колись. Nunit 3.0 був випущений наприкінці 2015 року, який тепер має атрибут Parallelizable. Посилання: github.com/nunit/nunit/wiki/Parallelizable-Attribute
pb.

36

Версія NUnit 3 підтримуватиме паралельні запуски тестів:

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

• ParallelScope.None вказує на те, що тест не може виконуватися паралельно з іншими тестами.

• ParallelScope.Self вказує на те, що сам тест може виконуватися паралельно з іншими тестами.

• ParallelScope.Children вказує на те, що нащадки тесту можуть виконуватися паралельно по відношенню один до одного.

• ParallelScope.Fixtures вказує на те, що світильники можуть працювати паралельно один одному.

NUnit Framework-Parallel-Test-Execution


10

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


1
Це допомогло мені зменшити час виконання модульних тестів з 3 хв до 2 хв. Я тестував на 2-ядерному процесорі.
Дмитро Лобанов

4

У цій статті згадується, що для прискорення тестів плакат запускає декілька екземплярів NUnit із параметрами команд, що вказують, які тести повинен запускати кожен екземпляр.

ЗВТ:

Я зіткнувся з дивною проблемою.

Ми використовуємо nunit-console для запуску тесту на нашому сервері безперервної інтеграції. Нещодавно ми переходили з Nunit 2.4.8 на 2.5.5 і з .Net 3.5 на 4.0. Для прискорення виконання тесту ми запускаємо кілька екземплярів Nunit паралельно з різними аргументами командного рядка

  • У нас є дві копії наших тестових збірок і бінарних файлів нунітів у папках A і B.
  • У папці А ми виконуємо

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 / включає: MyCategory /xml=TestResults.xml /framework=net-4.0 / noshadow

Якщо ми виконуємо команди послідовно, обидва успішно запускаються. Але якщо ми виконуємо їх паралельно, це вдається лише одному. Наскільки я можу зрозуміти, це те, що першим завантажує тестові прилади. Інший не працює із повідомленням "Не вдається знайти пристрій".

Ця проблема вже відома? Я не зміг знайти нічого пов'язаного зі списком помилок на панелі запуску. До речі, наш сервер працює під керуванням Windows Server 2008 64-розрядної версії. Я також міг відтворити проблему в Windows 7 64-bit.

Якщо припустити, що ця помилка виправлена ​​або ви не використовуєте новішу версію (-и) згаданого програмного забезпечення, ви повинні мати змогу відтворити її техніку.

Оновлення

TeamCity виглядає як інструмент, за допомогою якого можна автоматично запускати тести NUnit. У них є обговорена тут програма запуску NUnit, яка може бути використана для запуску декількох екземплярів NUnit. Ось допис у блозі, в якому обговорюється злиття декількох результатів NUnit XML в один файл результатів.

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

Це достатньо автоматизовано для ваших потреб?


Це та сама ідея, яка вже розміщена щодо категорій ... Я не хочу, щоб тут підтримували достатньо рівний час роботи між екземплярами. Я вважаю за краще написати свій власний бігун NUnit, перш ніж робити це.
Billy ONeal

Наскільки я знаю, NUnit не підтримує це без обхідного рішення, такого як запуск декількох екземплярів. Якщо ви хочете, я думаю, ви можете створити інструмент, який розбиває тести на N наборів і автоматично запускає N екземплярів NUnit, де N - кількість процесорів / ядер, які у вас є. Це був би єдиний спосіб мати якесь автоматизоване паралельне тестування, яке я можу придумати за допомогою NUnit.
kniemczak

Я додав оновлення, яке обговорює інструмент постійної інтеграції TeamCity, і включив кілька публікацій про те, як використовувати цей інструмент для вирішення ваших потреб у автоматизації.
kniemczak

3

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

До речі, я не маю часу прочитати всі їх джерела, але мені було цікаво перевірити клас Barrier, і це дуже простий лічильник блокування. Він просто чекає, поки входять N потоків, а потім посилає імпульс, щоб усі вони продовжували працювати одночасно. Це все, що до цього потрібно - якщо ви не торкнетесь, воно вас не вкусить.

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


3

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

плюс ви отримуєте постійне тестування як бонус :)


3
NCrunch чудово підходить, коли ви використовуєте його в Visual Studio, але це не допомагає, коли ви намагаєтеся розпаралелювати свої тести на своєму сервері збірки.
Paccc

3
NCrunch тепер має інструмент командного рядка, який дуже добре працює на серверах збірки.
chillitom

3

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

Додайте це до тестового проекту AssemblyInfo.cs класу для nunit3 або вище:

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

2

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

Редагувати: Схоже, вони додали параметр / process до консольного додатка. У довідці з командного рядка зазначено, що це "Модель процесу для тестів: одиничний, окремий, багаторазовий". Здається, у тест-бігуна також є ця функція.

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



2

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

TBox створений для спрощення роботи з великими рішеннями, що містить безліч проектів. Він підтримує безліч плагінів, і один з них забезпечує можливість паралельного запуску тестів NUnit. Цей плагін не вимагає змін у існуючих тестах.

Також він підтримує:

  • Клонування папки з модульним тестом (якщо ваші тести змінюють локальні дані),

  • Синхронізація тестів (наприклад, якщо ваші тести на testfixtureteardown вбивають усі сервери розробників або chromerunner для qunit)

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

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

  • Навіть для одного потоку, працює швидше, ніж стандартний nunit runner, якщо у вас є набагато невеликі тести.

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


Якщо ви пов’язані з цим продуктом, розкрийте це. Ви опублікували кілька речей, що вказують на це.
Бред Ларсон

Звичайно, TBox - це мій власний інструмент. Я написав це у вільний час один. Якщо це погана практика говорити про безкоштовні інструменти, я видалю цю відповідь, це не проблема :)
Alex H

Ми просто хочемо, щоб люди чітко розуміли продукти, з якими вони займаються. Якщо ви повністю розкриваєте, що це ваша, чому було б доцільно вирішити проблему, поставлену запитанням, і не рекламуйте її занадто агресивно, ваші відповіді мають бути прийнятними тут.
Бред Ларсон

@brad Це відкритий код у Codeplex, не впевнений, чому тут проблема.
dvallejo

@DanVallejo - Присутність проекту з відкритим кодом є причиною того, що це не було видалено спільнотою при публікації. Ми маємо трохи більше вільного простору, але все одно просимо вас розкрити свою приналежність до проекту, щоб люди могли зрозуміти контекст вашої рекомендації. Алекс зробив це тут, тому його відповідь цілком відповідна, як і зараз.
Бред Ларсон


1

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

  • Працює на сервері збірки
  • Запускає тести на селен
  • Має підтримку Visual Studio
  • поки немає підтримки Resharper

Дякую за відповіді однолітків .

Поняття:

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

1
Зараз вийшов NUnit 3.0
Ralph Willgoss

0

Ви можете використовувати наступну команду PowerShell (для NUnit3, для NUnit2 змініть ім'я бігуна):

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

Представлена ​​команда запускає всі тестові збірки в одному екземплярі nunit, що дозволяє використовувати механізм, вбудований у паралельний тестовий запуск .

Зауваження

  1. Не забудьте налаштувати шаблон пошуку в каталозі. Наведений приклад запускає лише збірки, що закінчуються .Tests.dllі всередині \bin\Debugкаталогів.

  2. Будьте в курсі Uniqueфільтрації - можливо, ви не хочете мати її.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.