Cette question concerne le framework de test unitaire xUnit.net .
J'ai besoin d'exécuter du code avant l'exécution de tout test, ainsi que du code une fois tous les tests terminés. Je pensais qu'il devrait y avoir une sorte d'attribut ou d'interface de marqueur pour indiquer le code global d'initialisation et de terminaison, mais je n'ai pas pu les trouver.
Sinon, si j'appelle xUnit par programme, je peux également obtenir ce que je veux avec le code suivant:
static void Main()
{
try
{
MyGlobalSetup();
RunAllTests(); // What goes into this method?
}
finally
{
MyGlobalTeardown();
}
}
Quelqu'un peut-il me donner un indice sur la façon d'exécuter de manière déclarative ou par programme un code de configuration / démontage global?
Réponses:
Autant que je sache, xUnit n'a pas de point d'extension global d'initialisation / démontage. Cependant, il est facile d'en créer un. Créez simplement une classe de test de base qui implémente
IDisposable
et effectuez votre initialisation dans le constructeur et votre démontage dans laIDisposable.Dispose
méthode. Cela ressemblerait à ceci:Cependant, la configuration de la classe de base et le code de suppression seront exécutés pour chaque appel. Ce n'est peut-être pas ce que vous voulez, car ce n'est pas très efficace. Une version plus optimisée utiliserait l'
IClassFixture<T>
interface pour garantir que la fonctionnalité d'initialisation / de suppression globale n'est appelée qu'une seule fois. Pour cette version, vous n'étendez pas une classe de base à partir de votre classe de test mais implémentez l'IClassFixture<T>
interface oùT
fait référence à votre classe de fixture:Cela se traduira par le constructeur de
TestsFixture
ne être exécuté qu'une seule fois pour toutes les classes sous test. Cela dépend donc de ce que vous voulez exactement choisir entre les deux méthodes.la source
[Collection("<name>")]
attributJe cherchais la même réponse, et pour le moment, la documentation xUnit est très utile en ce qui concerne la façon d'implémenter les appareils de classe et les appareils de collection qui donnent aux développeurs un large éventail de fonctionnalités de configuration / démontage au niveau de la classe ou du groupe de classes. Ceci est conforme à la réponse de Geir Sagberg, et donne une bonne implémentation squelette pour illustrer à quoi cela devrait ressembler.
https://xunit.github.io/docs/shared-context.html
la source
Collection
attribut pour que la configuration "globale" se produise. Cela signifie que si vous avez quelque chose que vous voulez configurer avant que -any- test ne soit exécuté, vous devez décorer les classes -all- test avec cet attribut. C'est trop fragile à mon avis, car oublier de décorer une seule classe de test peut entraîner des erreurs difficiles à repérer. Ce serait bien si xUnit créait un moyen de configuration et de démontage vraiment globaux.Il existe une solution simple et simple. Utilisez le plugin Fody.ModuleInit
https://github.com/Fody/ModuleInit
C'est un package nuget et lorsque vous l'installez, il ajoute un nouveau fichier appelé
ModuleInitializer.cs
au projet. Il existe une méthode statique ici qui est intégrée à l'assemblage après la génération et qui est exécutée dès que l'assemblage est chargé et avant que quoi que ce soit ne soit exécuté.Je l'utilise pour déverrouiller la licence logicielle d'une bibliothèque que j'ai achetée. J'oubliais toujours de déverrouiller la licence à chaque test et même de dériver le test d'une classe de base qui la déverrouillerait. Les étincelles brillantes qui ont écrit cette bibliothèque, au lieu de vous dire qu'elle était verrouillée sous licence, ont introduit de subtiles erreurs numériques qui font échouer ou réussir les tests alors qu'ils ne le devraient pas. Vous ne saurez jamais si vous avez correctement déverrouillé la bibliothèque ou non. Alors maintenant, mon module init ressemble à
et tous les tests placés dans cet assemblage verront la licence déverrouillée correctement pour eux.
la source
Pour partager le code SetUp / TearDown entre plusieurs classes, vous pouvez utiliser CollectionFixture de xUnit .
Citation:
la source