Jak mogę przeprowadzać testy NUnit równolegle?

Mam duży test akceptacyjny (~10 sekund na test) zestaw testów napisany przy użyciu NUnit. Chciałbym wykorzystać fakt, że moje maszyny są wieloma rdzeniami. Najlepiej byłoby, gdybym mógł przeprowadzić jeden test na rdzeń, niezależnie od innych testów.

Jest PNUnit, ale jest przeznaczony do testowania problemów z synchronizacją wątków i tym podobnych rzeczy, i nie widziałem oczywistego sposobu, aby to osiągnąć.

Czy istnieje przełącznik / narzędzie / opcja, której mogę użyć do uruchomienia testy równolegle?

 73
Author: Billy ONeal, 2010-07-23

12 answers

Standardowy biegacz nunit nie obsługuje równoległych testów. Możesz utworzyć własny biegacz testowy, aby uruchamiać testy równolegle (używając obecnych testów nunit). Nie jestem pewien, dlaczego drużyna nunit jeszcze tego nie zrobiła.

Alternatywnie, MBUnit ma możliwość tworzenia równoległych testów, a ponieważ mbunit ma prawie taką samą składnię jak NUnit, może nie wymagać aż tyle wysiłku, aby dokonać przełącznika.

EDIT: Jak zaznaczono w komentarzach, chociaż ta odpowiedź była poprawna w momencie pisania, jeśli chcesz teraz uruchamiać równolegle testy NUnit, istnieją co najmniej 2 opcje:

    NCrunch oferuje go po wyjęciu z pudełka (nie zmieniając niczego, ale jest produktem komercyjnym)]}
  • NUnit 3 oferuje atrybut równoległy, który może być użyty do określenia, które testy mogą być uruchamiane równolegle
 47
Author: David_001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 08:44:27

NUnit w wersji 3 będzie obsługiwał równolegle Uruchamianie testów:

Dodanie atrybutu do klasy: [Parallelizable(ParallelScope.Self)] spowoduje równoległe uruchomienie testów.

• ParallelScope.Brak wskazuje, że badanie nie może być prowadzone równolegle z innymi testami.

• ParallelScope.Self wskazuje, że test sam może być uruchamiany równolegle z innymi testami.

• ParallelScope.Dzieci wskazuje, że potomkowie testu mogą być prowadzone równolegle w odniesieniu do siebie nawzajem.

• ParallelScope.Urządzenia wskazują, że urządzenia mogą być uruchamiane równolegle ze sobą.

NUnit Framework-Parallel-Test-Execution

 27
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 02:40:13

Jeśli twój projekt zawiera wiele testowych bibliotek DLL, możesz uruchomić je równolegle za pomocą tego skryptu MSBuild. Oczywiście musisz dostosować ścieżki do układu projektu.

Aby uruchomić z 8 rdzeniami Uruchom z: c:\proj> msbuild /m:8 RunTests.xml

Runtesty.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>

Update Gdybym teraz odpowiadał na to pytanie, zdecydowanie poleciłbym NCrunch i jego narzędzie do testowania wiersza poleceń dla maksymalnej wydajności testów. Nie ma to jak to i zrewolucjonizuje twój cykl debugowania code-test-debug w tym samym czasie.

 10
Author: chillitom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 12:03:32

W w tym artykule wspomniano, że w celu przyspieszenia testów poster uruchamia wiele instancji NUnit z parametrami poleceń określającymi, które testy powinny zostać uruchomione.

FTA:

Napotkałem dziwny problem.

Używamy nunit-console do uruchomienia testu na nasz serwer ciągłej integracji. Ostatnio przeprowadzaliśmy się z Nunit 2.4.8 do 2.5.5 i od. Net 3.5 do 4.0. Aby przyspieszyć wykonanie testu uruchamiamy wiele instancji Nunit w równolegle z inną linią poleceń argumenty

  • mamy dwie kopie naszych zestawów testowych i binariów nunit w folder A i B.
  • w folderze A wykonujemy

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

  • w folderze B wykonujemy

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

Jeśli wykonamy polecenia w kolejności oba biegną pomyślnie. Ale jeśli wykonaj je równolegle tylko jeden / align = "left" / Z tego co wiem to ten, który pierwszy ładuje test Osprzęt. Drugi zawodzi z komunikat "nie można zlokalizować urządzenia".

Czy ten problem jest już znany? Mógłbym nie znaleziono nic związanego z błędem lista na launchpad. BTW nasz serwer działa Windows Server 2008 64-bit. Mógłbym również rozmnażać problem z Windows 7 64-bitowych.

Zakładając, że ten błąd został naprawiony lub nie używasz nowszych wersji wspomnianego oprogramowania, powinieneś być w stanie odtworzyć ich technikę.

Update

TeamCity wygląda jak narzędzie, którego możesz użyć do automatycznego uruchamiania testów NUnit. Mają program uruchamiający NUnit omawiany tutaj, który może być użyty do uruchomienia wielu instancji NUnit. tutaj jest wpis na blogu omawiający mergind z wiele wyników NUnit XML w jednym pliku wynikowym.

Teoretycznie więc TeamCity może automatycznie uruchamiać wiele testów NUnit w zależności od tego, jak chcesz podzielić obciążenie, a następnie scalić wyniki w jeden plik do przetworzenia po teście.

Czy to wystarczająco zautomatyzowane dla Twoich potrzeb?

 4
Author: kniemczak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 20:03:37

Tylko dlatego, że PNUnit może synchronizować w kodzie testowym, nie oznacza, że musisz użyć tego aspektu. Z tego, co widzę, nic nie stoi na przeszkodzie, żebyś po prostu spłodził zestaw i ignorował resztę, dopóki go nie potrzebujesz.

BTW nie mam czasu na przeczytanie wszystkich ich źródeł, ale byłem ciekawy sprawdzić klasę barierek i jest to bardzo prosty licznik zamków. Po prostu czeka, aż N wątków wejść, a następnie wysyła impuls dla wszystkich z nich, aby kontynuować pracę w tym samym czas. To wszystko - jeśli go nie dotkniesz, nie ugryzie cię.

Może być trochę intuicyjny dla normalnego rozwoju wątku (blokady są zwykle używane do serializacji dostępu-1 na 1), ale jest to dość porywająca dywersja: -)

 3
Author: ZXX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-30 05:01:30

Możesz teraz użyć NCrunch do równoległego zestawiania testów jednostkowych i możesz nawet skonfigurować, ile rdzeni ma być używanych przez NCrunch, a ile przez Visual Studio.

Plus masz ciągłe testy jako bonus:)

 3
Author: Rickard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-20 20:46:27

To byłby niezły hack, ale można podzielić testy jednostkowe na kilka kategorii . Następnie uruchom nową instancję NUnit dla każdej kategorii.

Edit: wygląda na to, że dodali opcję / proces do aplikacji konsoli. Pomoc wiersza poleceń stwierdza, że jest to "model procesu dla testów: pojedynczy, oddzielny, wielokrotny". Wydaje się, że biegacz testowy również ma tę funkcję.

Edit 2: Niestety, chociaż tworzy osobne procesy dla każdego złożenia, opcja izolacji procesu (/proces z linii poleceń) uruchamia agentów pojedynczo.

 2
Author: Pedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-27 21:51:28

Ponieważ projekt nie został tutaj wymieniony, chciałbym poruszyć NUnit.Multicore . Sam nie próbowałem tego projektu, ale wydaje się, że ma ciekawe podejście do równoległego problemu testowego z NUnit.

 2
Author: tronda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-10 11:37:36

Możesz wypróbować moje małe narzędzie TBox lub konsolę parallel Runner lub nawet wtyczkę do wykonywania rozproszonych kalulacji, która również może uruchamiać testy jednostkowe na zestawie komputerów SkyNet

TBox jest stworzony, aby uprościć pracę z dużymi rozwiązaniami, które zawierają wiele projektów. Obsługuje wiele wtyczek, a jedna z nich zapewnia możliwość równoległego uruchamiania testów NUnit. Ta wtyczka nie wymaga żadnych zmian w istniejących testach.

Również to wsparcie:

  • Klonowanie folderu z testem jednostkowym (jeśli testy zmieniają dane lokalne),

  • Synchronizacji testów (np. jeśli twoje testy na testfixtureteardown zabija wszystkie serwery dev lub chromerunner dla qunit)

  • Tryb X86 i uprawnienia administratora do uruchamiania testów

  • Batch run - możesz uruchamiać testy dla wielu zestawów równolegle

  • Nawet w przypadku pojedynczego wątku działa szybciej niż standardowy NUnit runner, jeśli masz dużo małych testów.

Również to narzędzie obsługuje runner tests wiersza poleceń (dla równoległego uruchamiania) i można go używać z ciągłą integracją.

 2
Author: Alex H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-21 19:11:00
 1
Author: Sjoerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:29

Z powodzeniem używałem NUnit 3.0.0 beta-4 do uruchamiania testów równolegle

  • działa na build server
  • przeprowadza testy selenu
  • posiada obsługę Visual Studio
  • no ReSharper support yet

Thanks for peers answer .

Gotchas:

  • atrybut równoległy nie jest dziedziczony, więc musi być określony na klasie testowej.
 1
Author: Alvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:29

Możesz użyć następującego polecenia PowerShell (dla NUnit3, dla NUnit2 Zmień nazwę biegacza):

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

Przedstawione polecenie uruchamia wszystkie zespoły testowe w jednej instancji nunit, co pozwala wykorzystać silnikwbudowany równoległy test run .

Uwagi

  1. Pamiętaj, aby dostosować wzór wyszukiwania katalogów. Podany przykład uruchamia tylko zespoły zakończone .Tests.dll i wewnątrz katalogów \bin\Debug.

  2. Pamiętaj o filtrowaniu Unique - możesz nie chcę go mieć.

 0
Author: one_mile_run,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-03 14:25:05