Est-il possible d'exécuter du code une fois avant l'exécution de tous les tests?


112

Fondamentalement, je voudrais dire à MSTest d'exécuter un peu de code avant de se lancer dans une série de tests, ce que je voudrais faire est essentiellement la même chose que de coller du code Main().

La raison pour laquelle je voudrais faire cela est que je voudrais faire un peu de journalisation avec log4net pendant mes tests d'intégration. Je ne peux pas simplement utiliser l' log4net.Config.XmlConfiguratorattribut assembly car au moment où il le lit dans mon assembly de test, il a déjà appelé LoggerManager. La documentation recommande de configurer log4net explicitement au point d'entrée du code - mais où est-ce dans mes tests?

Je dois pouvoir exécuter mes tests dans TestDriven.NET et MSTest runner.

Réponses:


153

FWIW, vous pouvez utiliser l' attribut AssemblyInitialize pour exécuter du code avant que tous les tests unitaires d'un assembly s'exécutent:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Si vous avez plus d'un assemblage de test unitaire, je ne suis pas au courant de quoi que ce soit qui englobe plus d'un assemblage.

Autant que je sache, c'est aussi proche que possible d'un équivalent principal.

Notez que la AssemblyInitializeméthode -decorated doit être dans une TestClassclasse -decorated qui contient au moins une TestMethodméthode -decorated, sinon elle ne sera pas exécutée!


1
J'ai eu un problème similaire (uniquement pour MSTest) et j'ai bien fonctionné. Merci :)
Oscar Foley

1
Pour toute autre personne ayant des problèmes pour faire fonctionner cela à partir de MsTest et TestDriven.NET, vous pouvez utiliser un indicateur statique pour déterminer s'il faut exécuter le code dans ClassInitialize (cela ne fonctionne pas dans MsTest).
Carl

7
Remarque: Le moteur de test exécute une méthode marquée avec l'attribut AssemblyInitialize uniquement si cette méthode est membre d'une classe marquée avec l'attribut TestClass.
Jowen

5
@Jowen: Le moteur de test exécute une méthode marquée avec l'attribut AssemblyInitialize uniquement si cette méthode est membre d'une classe marquée avec l'attribut TestClass and contains methods that are marked with the TestMethod attribute.
1er

3
La méthode marquée avec AssemblyInitialize s'exécutera dans Visual Studio 2015 Ultimate sans autres méthodes marquées avec les attributs TestMethod.
Chris

63

Pour terminer, voici les options «exécuter le code avant» pour MSTest:

  • Utilisez [AssemblyInitialize]pour exécuter le code une fois par assembly, avant l'exécution de tout test de cet assembly.
  • Utilisez [ClassInitialize]pour exécuter le code une fois par classe, avant tout test dans la classe où la méthode est définie.
  • Utilisez [TestInitialize]pour exécuter du code avant chaque test dans la classe où la méthode est définie.

12
La contrepartie de nettoyage de ces attributs est le suffixe Cleanup (par exemple, ClassCleanup) pour les opérations de démontage
Yair Nevet

13

Je vois cela dans l'en-tête MS Test.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Cela s'exécuterait avant les tests dans une classe.

On dirait que vous voulez exécuter quelque chose avant tous les tests.

Il existe également l'option de script d'installation dans la configuration de test.


Sauf si je manque quelque chose, les scripts de configuration n'aident pas à exécuter le code dans le test AppDomain.
George Mauer

2
C'est probablement moi. Je ne suis pas sûr de vous suivre lorsque vous dites «exécuter du code dans le test AppDomain». J'ai lu votre question comme voulant exécuter du code avant une série de tests, s'il s'agissait d'autre chose de différent. «Les scripts de configuration et les scripts de nettoyage s'exécutent avant et après les exécutions de test, quels que soient les types de tests contenus dans ces exécutions de test.» msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.