Ich versuche, eine von mir geschriebene WCF-Host-Management-Engine zu testen. Die Engine erstellt ServiceHost-Instanzen grundsätzlich im laufenden Betrieb basierend auf der Konfiguration. Auf diese Weise können wir dynamisch neu konfigurieren, welche Dienste verfügbar sind, ohne alle herunterfahren und neu starten zu müssen, wenn ein neuer Dienst hinzugefügt oder ein alter entfernt wird.
Ich habe jedoch aufgrund der Funktionsweise von ServiceHost Schwierigkeiten beim Testen dieser Host-Management-Engine. Wenn für einen bestimmten Endpunkt bereits ein ServiceHost erstellt, geöffnet und noch nicht geschlossen wurde, kann kein anderer ServiceHost für denselben Endpunkt erstellt werden, was zu einer Ausnahme führt. Aufgrund der Tatsache, dass moderne Unit-Test-Plattformen ihre Testausführung parallelisieren, habe ich keine effektive Möglichkeit, diesen Code zu testen.
Ich habe xUnit.NET verwendet, in der Hoffnung, dass ich aufgrund seiner Erweiterbarkeit einen Weg finden könnte, es zu zwingen, die Tests seriell auszuführen. Ich hatte jedoch kein Glück. Ich hoffe, dass jemand hier auf SO auf ein ähnliches Problem gestoßen ist und weiß, wie Unit-Tests seriell ausgeführt werden können.
HINWEIS: ServiceHost ist eine WCF-Klasse, die von Microsoft geschrieben wurde. Ich habe nicht die Fähigkeit, sein Verhalten zu ändern. Das einmalige Hosten jedes Service-Endpunkts ist ebenfalls das richtige Verhalten. Es ist jedoch für Unit-Tests nicht besonders förderlich.
quelle
TestServer
im Docker auszuführen . Also musste ich die Integrationstests serialisieren.Antworten:
Jede Testklasse ist eine eindeutige Testsammlung, und die Tests darunter werden nacheinander ausgeführt. Wenn Sie also alle Ihre Tests in derselben Sammlung ablegen, wird sie nacheinander ausgeführt.
In xUnit können Sie folgende Änderungen vornehmen, um dies zu erreichen:
Folgendes läuft parallel:
Um es sequentiell zu machen, müssen Sie nur beide Testklassen unter dieselbe Sammlung stellen:
Weitere Informationen finden Sie unter diesem Link
quelle
Wie oben angegeben, sollten alle guten Unit-Tests zu 100% isoliert sein. Die Verwendung eines gemeinsam genutzten Status (z. B. abhängig von einer
static
Eigenschaft, die von jedem Test geändert wird) wird als schlechte Praxis angesehen.Allerdings hat Ihre Frage zum Ausführen von xUnit-Tests nacheinander eine Antwort! Ich habe genau das gleiche Problem festgestellt, weil mein System einen statischen Service-Locator verwendet (der nicht ideal ist).
Standardmäßig führt xUnit 2.x alle Tests parallel aus. Dies kann pro Baugruppe geändert werden, indem Sie die
CollectionBehavior
in Ihrer AssemblyInfo.cs in Ihrem Testprojekt definieren.Für die Trennung pro Baugruppe verwenden:
oder für überhaupt keine Parallelisierung verwenden:
Letzteres ist wahrscheinlich das, was Sie wollen. Weitere Informationen zur Parallelisierung und Konfiguration finden Sie in der xUnit-Dokumentation .
quelle
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerClass, DisableTestParallelization = true)]
. Dank dir, @Squiggle, kann ich alle meine Tests durchführen und einen Kaffee trinken gehen! :)Erstellen Sie für .NET Core-Projekte Folgendes
xunit.runner.json
:Auch sollte Ihr
csproj
enthaltenFür alte .Net Core-Projekte sollte Ihr
project.json
enthaltenquelle
<ItemGroup><None Include="xunit.runner.json" CopyToOutputDirectory="Always" /></ItemGroup>
oder ähnlich wäre.<ItemGroup> <None Update="xunit.runner.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
dotnet test --no-build -c Release -- xunit.parallelizeTestCollections=false
aber es hat bei mir nicht funktioniert.Für .NET Core-Projekte können Sie xUnit mit einer
xunit.runner.json
Datei konfigurieren , wie unter https://xunit.github.io/docs/configuring-with-json.html dokumentiert .Die Einstellung, die Sie ändern müssen, um die parallele Testausführung zu stoppen, lautet
parallelizeTestCollections
standardmäßigtrue
:So
xunit.runner.json
sieht ein Minimum für diesen Zweck ausDenken Sie daran, diese Datei, wie in den Dokumenten angegeben, in Ihren Build aufzunehmen, entweder durch:
Hinzufügen
zu Ihrer
.csproj
Datei, oderHinzufügen
zu Ihrer
project.json
Dateiabhängig von Ihrem Projekttyp.
Schließlich zusätzlich zu den oben genannten, wenn Sie Visual Studio dann verwenden stellen Sie sicher , dass Sie nicht versehentlich die geklickt haben , Run Tests Parallel - Taste, die Tests werden dazu führen , parallel laufen zu lassen , auch wenn Sie aus Parallelisierung in aktiviert haben
xunit.runner.json
. Die UI-Designer von Microsoft haben diese Schaltfläche schlau unbeschriftet, schwer zu bemerken und etwa einen Zentimeter von der Schaltfläche "Alle ausführen " im Test-Explorer entfernt, um die Wahrscheinlichkeit zu maximieren, dass Sie sie versehentlich treffen und keine Ahnung haben, warum Ihre Tests durchgeführt wurden scheitern plötzlich:quelle
xunit.runner.json
Datei zu tun ? Und was hat die Angabe vonxunit.runner.json
damit zu tun, dass Tests seriell ausgeführt werden?Dies ist eine alte Frage, aber ich wollte eine Lösung für Leute schreiben, die wie ich neu suchen :)
Hinweis: Ich verwende diese Methode in Dot Net Core WebUI-Integrationstests mit xunit Version 2.4.1.
Erstellen Sie eine leere Klasse mit dem Namen NonParallelCollectionDefinitionClass und geben Sie dieser Klasse das CollectionDefinition-Attribut wie folgt. (Der wichtige Teil ist DisableParallelization = true-Einstellung.)
Fügen Sie anschließend der Klasse das Collection-Attribut hinzu, das nicht wie unten gezeigt parallel ausgeführt werden soll. (Der wichtige Teil ist der Name der Sammlung. Er muss mit dem in CollectionDefinition verwendeten Namen identisch sein.)
Wenn wir dies tun, werden zunächst andere parallele Tests ausgeführt. Danach werden die anderen Tests mit dem Attribut "Sammlung" ("Nicht parallele Sammlung") ausgeführt.
quelle
Sie können die Wiedergabeliste verwenden
Klicken Sie mit der rechten Maustaste auf die Testmethode -> Zur Wiedergabeliste hinzufügen -> Neue Wiedergabeliste
Anschließend können Sie die Ausführungsreihenfolge angeben. Die Standardeinstellung ist, wenn Sie sie zur Wiedergabeliste hinzufügen. Sie können die Wiedergabelistendatei jedoch beliebig ändern
quelle
Ich kenne die Details nicht, aber es scheint, als würden Sie eher versuchen, Integrationstests als Unit-Tests durchzuführen . Wenn Sie die Abhängigkeit von isolieren könnten
ServiceHost
, würde dies Ihre Tests wahrscheinlich einfacher (und schneller) machen. So können Sie (zum Beispiel) Folgendes unabhängig voneinander testen:IServiceHostFactory
und ein nimmtIConfiguration
Zu den Tools, die helfen würden, gehören Isolations- (Verspottungs-) Frameworks und (optional) IoC-Container-Frameworks. Sehen:
quelle
Möglicherweise können Sie Advanced Unit Testing verwenden . Hier können Sie die Reihenfolge definieren, in der Sie den Test ausführen . Daher müssen Sie möglicherweise eine neue CS-Datei erstellen, um diese Tests zu hosten.
Hier erfahren Sie, wie Sie die Testmethoden so biegen können, dass sie in der gewünschten Reihenfolge funktionieren.
Lassen Sie mich wissen, ob es funktioniert.
quelle
Wenn ich in der .Net Core Console-Anwendung Testmethoden (keine Klassen) synchron ausführen wollte, war die einzige Lösung, die funktionierte, die in diesem Blog beschriebene: xUnit: Steuern der Testausführungsreihenfolge
quelle
Ich habe das Attribut [Collection ("Sequential")] in einer Basisklasse hinzugefügt :
quelle
Keine der vorgeschlagenen Antworten hat bisher für mich funktioniert. Ich habe eine Dotnet Core App mit XUnit 2.4.1. Ich habe das gewünschte Verhalten mit einer Problemumgehung erreicht, indem ich stattdessen in jedem Komponententest eine Sperre gesetzt habe. In meinem Fall war mir die laufende Reihenfolge egal, nur dass die Tests sequentiell waren.
quelle