J'essaye de tester unitaire un moteur de gestion d'hôte WCF que j'ai écrit. Le moteur crée essentiellement des instances ServiceHost à la volée en fonction de la configuration. Cela nous permet de reconfigurer dynamiquement les services disponibles sans avoir à tous les arrêter et à les redémarrer chaque fois qu'un nouveau service est ajouté ou un ancien est supprimé.
Cependant, j'ai rencontré une difficulté lors des tests unitaires de ce moteur de gestion d'hôte en raison du fonctionnement de ServiceHost. Si un ServiceHost a déjà été créé, ouvert et pas encore fermé pour un point de terminaison particulier, un autre ServiceHost pour le même point de terminaison ne peut pas être créé, ce qui entraîne une exception. En raison du fait que les plates-formes de test unitaire modernes parallélisent leur exécution de test, je n'ai aucun moyen efficace de tester unité ce morceau de code.
J'ai utilisé xUnit.NET, en espérant qu'en raison de son extensibilité, je pourrais trouver un moyen de le forcer à exécuter les tests en série. Cependant, je n'ai pas eu de chance. J'espère que quelqu'un ici sur SO a rencontré un problème similaire et sait comment faire exécuter des tests unitaires en série.
REMARQUE: ServiceHost est une classe WCF, écrite par Microsoft. Je n'ai pas la capacité de changer son comportement. Héberger chaque point de terminaison de service une seule fois est également le bon comportement ... cependant, ce n'est pas particulièrement propice aux tests unitaires.
la source
TestServer
dans docker. J'ai donc dû sérialiser les tests d'intégration.Réponses:
Chaque classe de test est une collection de tests unique et les tests sous-jacents seront exécutés en séquence, donc si vous placez tous vos tests dans la même collection, elle s'exécutera séquentiellement.
Dans xUnit, vous pouvez apporter les modifications suivantes pour y parvenir:
Ce qui suit fonctionnera en parallèle:
Pour le rendre séquentiel, il vous suffit de placer les deux classes de test sous la même collection:
Pour plus d'informations, vous pouvez vous référer à ce lien
la source
Comme indiqué ci-dessus, tous les bons tests unitaires doivent être isolés à 100%. L'utilisation de l'état partagé (par exemple en fonction d'une
static
propriété modifiée par chaque test) est considérée comme une mauvaise pratique.Cela dit, votre question sur l'exécution des tests xUnit en séquence a une réponse! J'ai rencontré exactement le même problème car mon système utilise un localisateur de service statique (ce qui est loin d'être idéal).
Par défaut, xUnit 2.x exécute tous les tests en parallèle. Cela peut être modifié par assemblage en définissant le
CollectionBehavior
dans votre AssemblyInfo.cs dans votre projet de test.Pour la séparation par assemblage, utilisez:
ou pour aucune parallélisation, utilisez:
Ce dernier est probablement celui que vous souhaitez. Vous trouverez plus d'informations sur la parallélisation et la configuration dans la documentation de xUnit .
la source
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerClass, DisableTestParallelization = true)]
. Grâce à vous, @Squiggle, je peux faire tous mes tests et aller prendre un café! :)Pour les projets .NET Core, créez
xunit.runner.json
avec:En outre, votre
csproj
devrait contenirPour les anciens projets .Net Core, votre
project.json
devrait contenirla source
<ItemGroup><None Include="xunit.runner.json" CopyToOutputDirectory="Always" /></ItemGroup>
ou similaire?<ItemGroup> <None Update="xunit.runner.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
dotnet test --no-build -c Release -- xunit.parallelizeTestCollections=false
mais ça n'a pas fonctionné pour moi.Pour les projets .NET Core, vous pouvez configurer xUnit avec un
xunit.runner.json
fichier, comme indiqué sur https://xunit.github.io/docs/configuring-with-json.html .Le paramètre que vous devez modifier pour arrêter l'exécution des tests parallèles est
parallelizeTestCollections
, par défauttrue
:Donc, un minimum
xunit.runner.json
à cet effet ressemble àComme indiqué dans la documentation, n'oubliez pas d'inclure ce fichier dans votre build, soit en:
Ajouter
à votre
.csproj
dossier, ouAjouter
à votre
project.json
dossieren fonction de votre type de projet.
Enfin, en plus de ce qui précède, si vous utilisez Visual Studio, assurez-vous que vous n'avez pas accidentellement cliqué sur le bouton Exécuter les tests en parallèle , ce qui entraînera l'exécution des tests en parallèle même si vous avez désactivé la parallélisation dans
xunit.runner.json
. Les concepteurs d'interface utilisateur de Microsoft ont astucieusement rendu ce bouton sans étiquette, difficile à remarquer et à environ un centimètre du bouton "Tout exécuter" dans l'Explorateur de tests, juste pour maximiser les chances que vous le frappiez par erreur et que vous ne sachiez pas pourquoi vos tests échouent soudainement:la source
xunit.runner.json
fichier? Et qu'est-ce que la spécification d'unxunit.runner.json
a à voir avec l'exécution des tests en série?C'est une vieille question mais je voulais écrire une solution aux personnes qui recherchent nouvellement comme moi :)
Remarque: j'utilise cette méthode dans les tests d'intégration Dot Net Core WebUI avec xunit version 2.4.1.
Créez une classe vide nommée NonParallelCollectionDefinitionClass, puis attribuez l'attribut CollectionDefinition à cette classe comme ci-dessous. (La partie importante est DisableParallelization = true setting.)
Ensuite, ajoutez l'attribut Collection à la classe que vous ne voulez pas qu'il exécute en parallèle comme ci-dessous. (La partie importante est le nom de la collection. Il doit être identique au nom utilisé dans CollectionDefinition)
Lorsque nous faisons cela, tout d'abord d'autres tests parallèles sont exécutés. Après cela, les autres tests qui ont l'attribut Collection ("Non-Parallel Collection") s'exécutent.
la source
vous pouvez utiliser la liste de lecture
clic droit sur la méthode de test -> Ajouter à la playlist -> Nouvelle playlist
alors vous pouvez spécifier l'ordre d'exécution, la valeur par défaut est, lorsque vous les ajoutez à la liste de lecture, mais vous pouvez changer le fichier de liste de lecture comme vous le souhaitez
la source
Je ne connais pas les détails, mais il semble que vous essayez de faire des tests d'intégration plutôt que des tests unitaires . Si vous pouviez isoler la dépendance sur
ServiceHost
, cela rendrait probablement vos tests plus faciles (et plus rapides). Ainsi (par exemple) vous pouvez tester les éléments suivants indépendamment:IServiceHostFactory
et unIConfiguration
Des outils qui aideraient à inclure des frameworks d'isolation (mocking) et (éventuellement) des frameworks de conteneurs IoC. Voir:
la source
Vous pouvez peut-être utiliser Advanced Unit Testing . Il vous permet de définir la séquence dans laquelle vous exécutez le test . Vous devrez peut-être créer un nouveau fichier cs pour héberger ces tests.
Voici comment plier les méthodes de test pour qu'elles fonctionnent dans l'ordre souhaité.
Faites-moi savoir si cela fonctionne.
la source
Pour moi, dans l'application .Net Core Console, lorsque je voulais exécuter des méthodes de test (pas des classes) de manière synchrone, la seule solution qui fonctionnait était celle décrite dans ce blog: xUnit: contrôler l'ordre d'exécution des tests
la source
J'ai ajouté l'attribut [Collection ("Sequential")] dans une classe de base:
la source
Aucune des réponses suggérées jusqu'à présent n'a fonctionné pour moi. J'ai une application de base dotnet avec XUnit 2.4.1. J'ai obtenu le comportement souhaité avec une solution de contournement en plaçant un verrou dans chaque test unitaire à la place. Dans mon cas, je ne me souciais pas de l'ordre de marche, juste que les tests étaient séquentiels.
la source