Ich habe eine große Testsuite (~ 10 Sekunden pro Test), die mit NUnit geschrieben wurde. Ich möchte die Tatsache nutzen, dass meine Maschinen alle mehrere Kernboxen sind. Im Idealfall kann ein Test unabhängig von anderen Tests pro Kern ausgeführt werden.
Es gibt PNUnit, aber es wurde zum Testen auf Threading-Synchronisationsprobleme und ähnliches entwickelt, und ich habe keinen offensichtlichen Weg gesehen, dies zu erreichen.
Gibt es einen Schalter / ein Tool / eine Option, mit der ich die Tests parallel ausführen kann?
Antworten:
Wenn Sie NUnit-Tests parallel ausführen möchten, gibt es mindestens zwei Optionen:
quelle
NUnit Version 3 unterstützt das parallele Ausführen von Tests:
Durch Hinzufügen des Attributs zu einer Klasse:
[Parallelizable(ParallelScope.Self)]
werden Ihre Tests parallel ausgeführt.NUnit Framework-Parallel-Test-Ausführung
quelle
Wenn Ihr Projekt mehrere Test-DLLs enthält, können Sie diese mit diesem MSBuild-Skript parallel ausführen. Natürlich müssen Sie die Pfade an Ihr Projektlayout anpassen.
Um mit 8 Kernen zu laufen, laufen Sie mit:
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>
Update Wenn ich diese Frage jetzt beantworten würde, würde ich NCrunch und sein Befehlszeilentestlauf-Tool für maximale Testlaufleistung wärmstens empfehlen . Es gibt nichts Vergleichbares und es wird gleichzeitig Ihren Code-Test-Debug-Zyklus revolutionieren.
quelle
In diesem Artikel wird erwähnt, dass das Poster zur Beschleunigung von Tests mehrere Instanzen von NUnit mit Befehlsparametern ausführt, die angeben, welche Tests jede Instanz ausführen soll.
Freihandelsabkommen:
Angenommen, dieser Fehler ist behoben oder Sie führen nicht die neueren Versionen der genannten Software aus, sollten Sie in der Lage sein, deren Technik zu replizieren.
Aktualisieren
TeamCity sieht aus wie ein Tool, mit dem Sie NUnit-Tests automatisch ausführen können. Sie haben einen hier diskutierten NUnit-Launcher, mit dem mehrere NUnit-Instanzen gestartet werden können. In diesem Blogbeitrag wird die Zusammenführung mehrerer NUnit-XML-Ergebnisse zu einer einzigen Ergebnisdatei erläutert.
Theoretisch könnte TeamCity also automatisch mehrere NUnit-Tests starten, je nachdem, wie Sie die Arbeitslast aufteilen und die Ergebnisse dann für die Verarbeitung nach dem Test in einer einzigen Datei zusammenführen möchten.
Ist das automatisiert genug für Ihre Bedürfnisse?
quelle
Nur weil PNUnit die Synchronisation innerhalb des Testcodes durchführen kann, bedeutet dies nicht, dass Sie diesen Aspekt tatsächlich verwenden müssen. Soweit ich sehen kann, hindert Sie nichts daran, nur ein Set zu spawnen und den Rest zu ignorieren, bis Sie es brauchen.
Übrigens habe ich nicht die Zeit, alle Quellen zu lesen, war aber neugierig, die Barrier-Klasse zu überprüfen, und es ist ein sehr einfacher Sperrzähler. Es wartet nur, bis N Threads eintreten, und sendet dann den Impuls, damit alle gleichzeitig weiterlaufen. Das ist alles, was es zu tun gibt - wenn Sie es nicht berühren, wird es Sie nicht beißen.
Könnte für eine normale Thread-Entwicklung etwas kontraintuitiv sein (Sperren werden normalerweise verwendet, um den Zugriff zu serialisieren - 1 zu 1), aber es ist eine ziemlich temperamentvolle Ablenkung :-)
quelle
Sie können jetzt NCrunch verwenden, um Ihre Komponententests zu parallelisieren, und Sie können sogar konfigurieren, wie viele Kerne von NCrunch und wie viele von Visual Studio verwendet werden sollen.
Außerdem bekommst du als Bonus kontinuierliche Tests :)
quelle
Alternativ zum Hinzufügen des Attributs Parallelizable zu jeder Testklasse:
Fügen Sie dies der AssemblyInfo.cs-Klasse des Testprojekts für nunit3 oder höher hinzu:
quelle
Es wäre ein bisschen hacken, aber Sie könnten die Unit-Tests in eine Reihe von Kategorien aufteilen . Starten Sie dann für jede Kategorie eine neue Instanz von NUnit.
Bearbeiten: Es sieht so aus, als hätten sie der Konsolen-App eine / process-Option hinzugefügt. In der Befehlszeilenhilfe wird angegeben, dass dies das "Prozessmodell für Tests: Einzel, Separat, Mehrfach" ist. Der Testläufer scheint diese Funktion ebenfalls zu haben.
Bearbeiten 2: Leider werden die Agenten nacheinander ausgeführt, obwohl für jede Assembly separate Prozesse erstellt werden. Die Option zur Prozessisolierung (/ process über die Befehlszeile) führt die Agenten nacheinander aus.
quelle
Da das Projekt hier nicht erwähnt wurde, möchte ich NUnit.Multicore ansprechen . Ich habe das Projekt nicht selbst ausprobiert, aber es scheint einen interessanten Ansatz für das parallele Testproblem mit NUnit zu haben.
quelle
Sie können mein kleines Tool TBox oder Console Parallel Runner oder sogar ein Plugin ausprobieren, um verteilte Berechnungen durchzuführen, mit denen auch Unit-Tests auf dem SkyNet- PC- Set ausgeführt werden können
TBox wurde entwickelt, um die Arbeit mit großen Lösungen zu vereinfachen, die viele Projekte enthalten. Es unterstützt viele Plugins und eines davon bietet die Möglichkeit, NUnit-Tests parallel auszuführen. Dieses Plugin erfordert keine Änderungen an Ihren vorhandenen Tests.
Auch unterstützt es:
Klonen des Ordners mit Unit Test (wenn Ihre Tests lokale Daten ändern),
Synchronisierungen der Tests (zum Beispiel, wenn Ihre Tests auf testfixtureteardown alle Entwicklungsserver oder Chromerunner für qunit beenden)
x86-Modus und Administratorrechte zum Ausführen von Tests
Stapellauf - Sie können Tests für viele Baugruppen parallel ausführen
Selbst für Single-Thread-Runs funktioniert es schneller als Standard-Nunit-Runner, wenn Sie viele kleine Tests haben.
Dieses Tool unterstützt auch den Befehlszeilentest-Runner (für den parallelen Lauf) und kann mit kontinuierlicher Integration verwendet werden.
quelle
quelle
Ich habe NUnit 3.0.0 Beta-4 erfolgreich verwendet, um Tests parallel auszuführen
Vielen Dank für die Antwort von Kollegen .
Fallstricke:
quelle
Sie können den folgenden PowerShell-Befehl verwenden (für NUnit3, für NUnit2 den Namen des Läufers ändern):
Der vorgestellte Befehl führt alle Testbaugruppen in einer einzigen Nunit-Instanz aus, wodurch der in die Engine integrierte parallele Testlauf genutzt werden kann .
Bemerkungen
Denken Sie daran, das Verzeichnissuchmuster zu optimieren. In diesem Beispiel werden nur Assemblys ausgeführt, die mit
.Tests.dll
und in\bin\Debug
Verzeichnissen enden .Achten Sie auf das
Unique
Filtern - möglicherweise möchten Sie es nicht haben.quelle