131 votes

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

En fait, j'aimerais demander à MSTest d'exécuter un peu de code avant de lancer une série de tests, ce que j'aimerais faire est la même chose que de mettre un peu de code dans Main() .

La raison pour laquelle je voudrais faire cela est que je voudrais faire de la journalisation avec log4net pendant mes tests d'intégration. Je ne peux pas simplement utiliser la fonction log4net.Config.XmlConfigurator puisqu'au moment où il le lit dans mon assemblage 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 que cela se trouve dans mes tests ?

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

174voto

Mark Seemann Points 102767

Pour info, vous pouvez utiliser le AssemblyInitialize pour exécuter le code avant l'exécution de tous les tests unitaires dans une assemblée :

[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 quelque chose qui englobe plus d'un assemblage.

Pour autant que je sache, c'est ce qui se rapproche le plus d'un équivalent principal.

Notez que le AssemblyInitialize -Méthode décorée doit être dans un TestClass -classe décorée qui contient au moins une TestMethod -sinon, il s'agira de no être exécuté !

0 votes

Peu importe, cela ne fonctionne pas pour mes besoins. Nos tests doivent être exécutables depuis MSTest et TestDriven.NET et ce dernier ne semble pas supporter AssemblyInitialize.

1 votes

J'ai eu un problème similaire (seulement pour MSTest) et cela a bien fonctionné. Merci :)

1 votes

Pour tous ceux qui rencontrent des problèmes pour faire fonctionner cette méthode à la fois dans MsTest et TestDriven.NET, vous pouvez utiliser un drapeau statique pour déterminer si le code doit être exécuté dans ClassInitialize (cela ne fonctionne pas dans MsTest).

82voto

Konamiman Points 20578

Pour terminer, ce sont les options "exécuter le code avant" pour MSTest :

  • Utilisez [AssemblyInitialize] pour exécuter le code une fois par assemblage, avant l'exécution de tout test dans cet assemblage.
  • 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 le code avant chaque test dans la classe où la méthode est définie.

16voto

Maestro1024 Points 1062

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

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

Cela permettrait d'exécuter avant les tests dans une seule classe.

On dirait que vous voulez lancer quelque chose avant tous les tests.

Il y a aussi l'option setup script dans la configuration de l'exécution du test.

0 votes

A moins que je ne manque quelque chose, les scripts de configuration n'aident pas à exécuter le code dans l'AppDomain de test.

2 votes

C'est probablement moi. Je ne suis pas sûr de vous suivre lorsque vous dites " exécuter du code dans l'AppDomain de test. ". J'ai lu votre question comme voulant exécuter du code avant une série de tests, si c'était autre chose c'est différent. "Les scripts de configuration et les scripts de nettoyage s'exécutent avant et après les séries de tests, indépendamment des types de tests contenus dans ces séries de tests." msdn.microsoft.com/fr/us/library/ms182480%28VS.80%29.aspx

1 votes

Notez que [ClassInitialize] ne peut pas être simplement jeté, et doit être statique et prendre exactement un paramètre de type TestContext ( source ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X