2010-10-07 9 views
3

J'utilise MSTest et je veux écrire une entrée de journal avant que le test s'exécute et après qu'il se termine. Évidemment, je ne veux pas ajouter du code d'enregistrement personnalisé au début et à la fin de chaque test - il ne serait que le test illisible et semblait comme beaucoup d'efforts (j'ai> 500 tests)Comment enregistrer l'entrée de test d'unité et laisser dans MSTest

Utilisation TestInitialize et TestCleanup semblait être la solution, mais je ne peux pas obtenir le nom du test.

Est-ce que quelqu'un sait comment faire cela?

+0

et pourquoi avez-vous besoin de la nom du test ? Si vous pouvez nous dire ce que vous essayez d'atteindre en utilisant la journalisation, peut-être que je pourrais donner une meilleure réponse. – Gishu

+0

@Gishu - J'ai un long fichier journal de tous les tests et je veux voir dans ce journal à quel test appartient l'entrée actuelle.En ajoutant la journalisation avant et après chaque test je peux "délimiter" l'information du test –

Répondre

3

En MSTest, le nom du cas de test est disponible dans le test context property. Donc, pour y accéder à l'initialisation de test (ainsi que le nettoyage de test) de méthode, vous pouvez utiliser quelque chose comme ceci: -

[TestInitialize()] 
    public void MyTestInitialize() 
    { 
     if (string.Equals(**TestContext.TestName**, "TestMethod1", StringComparison.OrdinalIgnoreCase)) 
     { 
     } 
    } 

Cordialement Aseem Bansal

0

Mise à jour: Ok maintenant, je vois ce que vous obtenez. Les mauvaises nouvelles sont que je ne l'utilise MSTest ou un appareil MSTest pour savoir ..

En NUnit, vous pourriez

>"nunit-console.exe" API_Tests.dll /out:My.log /labels 

envoie le fichier THis journal suivant

***** Test.Gumba.API_Tests.Tests.ArithmeticProgression.DummyTest2 
Woohoo! made it till test2 
***** Test.Gumba.API_Tests.Tests.ArithmeticProgression.GeneratesTheRightProgressionAsSpecifiedByTheUser 
Try#0 failed. due to 0. Retrying NUnit.Framework.AssertionException: Expected is <System.Int32[10]>, actual is <System.Int32[0]> 
<snipped>... 

J'étais looking at the command line switches pour MSTest et l'aspect suivant semble intéressant

mstest /testcontainer:Some.dll /detail:testname 

--------------- réponse précédente suit -----
Pour répondre à votre question au point, les méthodes 'Execute around' peuvent être faites en utilisant une méthode qui prend un délégué. Cependant, si vous pouviez expliquer pourquoi vous en avez besoin, il existe peut-être une meilleure solution pour atteindre ce que vous voulez:

par exemple.

private void LogAround(Action action) 
{ 
    // log entry with calling method name using StackTrace class 
    action(); 
    // log exit 
} 

et les appels seraient

Do(delegate { 
    // test code 
}); 
+0

malheureusement cela signifie que j'aurais besoin d'ajouter ce code à tous les tests actuels et futurs qui pourraient nuire à leur lisibilité. Je voudrais aussi m'assurer que tous les devs de l'équipe l'utilisent dans tous leurs tests ... Je veux une solution qui ajoute "aromatiquement" la journalisation à tous mes tests –

+0

@Dror - Mise à jour de la réponse .. Vous en avez besoin le soutien de MSTest. Espérons qu'il existe ... – Gishu

1

Nous utilisons nLog pour l'exploitation forestière et une classe de base pour test initialise et nettoie le test qui se connecte si un test a réussi ou non.

C'est la classe de base:

using Microsoft.VisualStudio.TestTools.UnitTesting; 
using NLog; 

namespace Tests 
{ 
    public class TestBase 
    { 
     private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); 

     public TestContext TestContext { get; set; } 

     [TestCleanup] 
     public void TestCleanup() 
     { 
      string testName = string.Format("{0}.{1}", TestContext.FullyQualifiedTestClassName, TestContext.TestName); 
      UnitTestOutcome currentTestOutcome = TestContext.CurrentTestOutcome; 
      string message = string.Format("Test '{0}' {1}", testName, currentTestOutcome.ToString().ToUpperInvariant()); 
      if (currentTestOutcome != UnitTestOutcome.Passed) 
      { 
       Logger.Error(message); 
      } 
      else 
      { 
       Logger.Info(message); 
      } 
     } 

     [TestInitialize] 
     public void TestInitialize() 
     { 
      string testName = string.Format("{0}.{1}", TestContext.FullyQualifiedTestClassName, TestContext.TestName); 
      Logger.Info("Started with test '{0}'", testName); 
     } 
    } 
} 

Et ici est l'utilisation de celui-ci

using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace Tests 
{ 
    [TestClass] 
    public class JustTest : TestBase 
    { 
     [TestMethod] 
     public void Fail() 
     { 
      Assert.IsTrue(false); 
     } 

     [TestMethod] 
     public void Pass() 
     { 
      Assert.IsTrue(true); 
     } 
    } 
} 

ici est la partie du fichier journal

Started with test 'Tests.JustTest.Fail' 
Test 'Tests.JustTest.Fail' FAILED 

Started with test 'Tests.JustTest.Pass' 
Test 'Tests.JustTest.Pass' PASSED 
+1

Votre réponse pourrait être grandement améliorée en ajoutant quelques explications sur ce que fait votre code. – Henrik