2009-09-11 11 views
35

Nous utilisons TeamCity comme notre serveur CI, et je viens juste de commencer voir "TestFixtureSetUp Failed" dans la fenêtre d'échec du test.Comment diagnostiquer « TestFixtureSetUp Failed »

Une idée de comment je vais sur le débogage de ce problème? Les tests fonctionnent bien sur mon poste de travail (testeur R # dans VS2008).

+0

Droit! Pourquoi NUnit ne montre-t-il pas les détails d'exception et stacktrace de TestFixtureSetUp, comme c'est le cas quand un test échoue? –

+0

Nous devrions signaler ce bug à NUnit –

+0

S'il vous plaît voter pour le rapport de bogue à https://github.com/nunit/nunit-vs-adapter/issues/99 –

Répondre

22

Il est un peu d'une faille dans la mise en œuvre de TestFixtureSetUp (et TestFixtureTearDown) que toute exception ne sont pas bien signalées. J'ai écrit la première implémentation d'entre eux et je n'ai jamais réussi à la faire comme elle était supposée le faire. À l'époque, les concepts du code NUnit étaient étroitement liés à l'idée que les actions étaient directement liées à un seul test. Ainsi, le rapport de tout était lié à un résultat de test. Il n'y avait pas vraiment d'espace pour rapporter quelque chose qui s'est passé au niveau de la suite sans une énorme réécriture (ce n'est pas un refactoring quand on change un mouton en escalator).

En raison de ce peu d'histoire, il est difficile de savoir ce qui est arrivé dans un TestFixtureSetUp. Il n'y a pas de bon endroit pour joindre l'erreur. L'appel TestFixtureSetUp est un effet secondaire de l'exécution d'un test au lieu d'être directement lié à celui-ci.

@TrueWill a la bonne idée. Vérifiez les journaux, puis modifiez le test pour ajouter plus de journalisation si nécessaire. Vous voudrez peut-être mettre try/catch à l'intérieur de TestFixtureSetup et vous connecter beaucoup dans le bloc catch. Je pensais juste pouvoir ajouter un peu de contexte (en d'autres termes, c'est en quelque sorte ma faute).

+3

@Mike - merci! BTW, j'ai peu de plaintes à propos de NUnit - je l'utilise heureusement depuis aussi longtemps que je travaille dans .NET. – TrueWill

+0

Nunit lui-même rapporte l'information ces jours-ci. Donc, il pourrait simplement exécuter le test sous NUnit-Console pour voir ce qui cause l'erreur. Le vrai problème est que l'EDI de fenêtre de test VS ne fournit aucun endroit pour signaler les erreurs qui ne sont pas directement associées à un test spécifique - ce qui rappelle les premiers jours de NUnit lui-même, en fait. – Charlie

+1

rep boost pour "ce n'est pas un refactoring lorsque vous modifiez un mouton dans un escalator" –

11

Je vérifie d'abord le journal de construction.

Si ce n'est pas évident de cela, vous pouvez essayer, y compris dans les tests Console.WriteLines - Je ne suis pas positif, mais je pense que ceux-ci sont écrites dans le journal de construction. Alternativement, vous pouvez vous connecter à un fichier (même en utilisant log4net si vous voulez avoir envie).

Si Visual Studio est installé sur le serveur CI, vous pouvez essayer d'exécuter le build/tests à partir de là. Si c'est un problème de connectivité, cela pourrait le résoudre.

J'ai vu des problèmes de chemin, cependant, où les chemins relatifs aux fichiers ne sont plus chemins corrects ou absolus ont été utilisés. Ceux-ci sont plus difficiles à déboguer et peuvent nécessiter de consigner les chemins, puis de vérifier s'ils existent sur le serveur de construction.

0

J'ai eu ce problème et il a été causé par l'ajout d'un readonly privé Dictionary dans la classe, un peu de la même manière que vous ajoutez un private const string.

J'ai essayé de faire le Dictionary une constante, mais vous ne pouvez pas le faire au moment de la compilation. J'ai résolu ceci en mettant mon Dictionary dans une méthode qui le renvoie.

+0

fyi vous pouvez utiliser un [ReadOnlyDictionary] (https://msdn.microsoft.com/fr-fr/library/gg712875%28v= vs.110% 29.aspx) – RJFalconer

1

Je recevais la même erreur lors de l'exécution de tout test avec SpecFlow en utilisant Visual NUnit. Quand j'ai essayé de faire la même chose avec l'Unit Test Explorer (fourni par Resharper), cela a donné un message un peu plus utile: Les méthodes de liaison avec plus de 10 paramètres ne sont pas supportées. J'ai réalisé que je ne peux pas avoir une méthode SpecFlow avec plus de 10 paramètres, a dû supprimer le test.

1

J'ai pu constater que je ne créais pas correctement ma base de données de test en passant rapidement à VS Unit Testing. Dans mon cas, il était capable de retourner une meilleure réponse à la raison pour laquelle il a échoué. J'utilise habituellement NUnit. "Impossible de créer l'instance de la classe X. Erreur: System.Data.SqlClient.SqlException: Une erreur d'activation de fichier s'est produite.Le nom de fichier physique '\ DbTest.mdf' est peut-être incorrect Diagnostiquer et corriger des erreurs supplémentaires et réessayer l'opération CREATE DATABASE a échoué Certains noms de fichiers n'ont pas pu être créés. "

0

J'ai eu ce symptôme causé par une erreur lors de l'initialisation du champ. Si votre initialize vos champs dans la méthode [SetUp], vous devriez voir un message d'erreur plus.

[TestFixture] 
internal class CommandParserTest 
{ 
    // obscure error message 
    private CommandParser parser = new CommandParser(...); 
    ... 
} 

[TestFixture] 
internal class CommandParserTest 
{ 
    private CommandParser parser; 

    [SetUp] 
    public void BeforeTest() 
    { 
     // better error message 
     parser = new CommandParser(...); 
    } 
    ... 
} 
0

Je fus troublé par aujourd'hui. (1) Ecrivez un autre test dans un appareil distinct qui initialise une instance de l'appareil de test troublant, appelle explicitement des méthodes d'installation telles que TestFixtureSetUp et SetUp le cas échéant, puis exécute le méthode de test cible

(2) Ajouter le code de gestion des exceptions pour le nouveau code ci-dessus, et consigner/sortir l'exception réelle quelque part.

6

Je l'ai rencontré aujourd'hui lors de la création de tests d'intégration qui ont une configuration longue durée que je ne veux pas dupliquer. J'ai fini par emballer toute la logique d'installation de test dans un essai/catch. J'ajoute ensuite une méthode SetUp dont le seul but est de voir si une erreur s'est produite lors de la configuration du projecteur et de fournir une meilleure journalisation.

Exception testFixtureSetupException = null; 

[TestFixtureSetUp] 
public void FixtureSetup() 
{ 
    try 
    { 
     // DoTestFixtureSetup 
    } 
    catch (Exception ex) 
    { 
     testFixtureSetupException = ex; 
    } 
} 

[SetUp] 
// NUnit doesn't support very useful logging of failures from a TestFixtureSetUp method. We'll do the logging here. 
public void CheckForTestFixturefailure() 
{   
    if (testFixtureSetupException != null) 
    { 
     string msg = string.Format("There was a failure during test fixture setup, resulting in a {1} exception. You should check the state of the storage accounts in Azure before re-running the RenewStorageAccountE2ETests. {0}Exception Message: {3}{0}Stack Trace:{4}", 
      Environment.NewLine, testFixtureSetupException.GetType(), accountNamePrefix, testFixtureSetupException.Message, testFixtureSetupException.StackTrace); 
     Assert.Fail(msg); 
    } 
} 
1

Exécutez le test unitaire dans mode de débogage. Vous pouvez trouver une erreur d'exécution dans la configuration.

0

Dans le cas où il peut aider quelqu'un: Vous pouvez attraper l'exception et l'écrire dans la console sur le TearDown

Quelque chose comme:

[SetUpFixture] 
public class BaseTest 
{ 
    private Exception caughtException = null; 

    [SetUp] 
    public void RunBeforeAnyTests() 
    { 
     try 
     { 
      throw new Exception("On purpose"); 
     } 
     catch (Exception ex) 
     { 
      caughtException = ex;    
     } 
    } 

    [TearDown] 
    public void RunAfterAnyTests() 
    { 
     if (caughtException != null) 
     { 
      Console.WriteLine(string.Format("TestFixtureSetUp failed in {0} - {1}", this.GetType(), caughtException.Message)); 
     }   
    } 

} 

Et le résultat sera:

TestFixtureSetUp a échoué dans IntegratedTests.Services.BaseTest - à dessein

1

Si vous utilisez SpecFlow et C# dans Visual Studio, regardez au fichier <whatever>.feature.cs généré automatiquement après l'échec du test. Sur la ligne public partial class <whatever>Feature, vous devriez voir un symbole qui, lorsque survolé, indiquera la raison de l'échec de la configuration du dispositif NUnit. Dans mon cas, c'était que certaines de mes méthodes BeforeFeature dans ma classe TestHooks n'étaient pas statiques. Toutes les méthodes BeforeTestRun, AfterTestRun, BeforeFeature et AfterFeature doivent être statiques.