NCrunch tout passe de test Première exécution, mais échoue après le changement de code et lorsque vous exécutez que tout bouton est enfoncé.

StackOverflow https://stackoverflow.com//questions/12685690

  •  12-12-2019
  •  | 
  •  

Question

Je suis en cours d'exécution NCrunch, dans une nouvelle solution MVC 4 en VS2012 à l'aide de Nunit et Ninject.

Lorsque je ouvre d'abord la solution à 50 ou plus de test et passez avec succès.

Après avoir effectué un changement de code (même un espace vide ajouté) NCrunch rapporte que la majeure partie de mon test d'unité échoue. La même chose se produit si j'appuie sur la fenêtre "Exécuter tous les tests" dans la fenêtre NCrunch.

Mais si vous frappez le bouton "Exécuter tous les tests visibles ici", tous les 50 test de test à nouveau et ncrunch rapporte que tout va bien.

Aussi lorsque vous exécutez chaque test individuellement, ils passent à chaque fois.

Quand ils échouent, ils semblent échouer dans mon code de configuration Ninject

Erreur: TestFixTreUture a échoué dans ControllerTestSetUp

public class ControllerTestSetup
{

    [SetUp]
    public void InitIntegrationTest()
    {
        var context = IntegrationTestContext.Instance;
        context.Init();
        context.NinjectKernel.Load<MediGapWebTestModule>();
    }

    [TearDown]
    public void DisposeIntegrationTest()
    {
        IntegrationTestContext.Instance.Dispose();
    }
}

public class IntegrationTestContext : IDisposable
{  

    private static IntegrationTestContext _instance = null;
    private static readonly object _monitor = new object();

    private IntegrationTestContext() { }

    public static IntegrationTestContext Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_monitor)
                {
                    if (_instance == null)
                    {
                        _instance = new IntegrationTestContext();
                    }
                }
            }

            return _instance;
        }
    }
}

Tous les tests fonctionnent également dans le coureur de test Restomer sans problèmes à chaque fois.

Quelqu'un peut-il savoir ce qui pourrait causer cela?

Je suppose que c'est quelque chose à voir avec le code de verrouillage singleton à l'intérieur de la propriété d'instance, mais je ne suis pas sûr.

=============================================================================== Progrès:

J'ai pu suivre cela sur une erreur dans la méthode de la configuration Ninject ci-dessus en l'enveloppant dans une instruction Catch, et écrivez l'erreur dans la fenêtre de sortie.

L'exception a été provoquée par une tentative de chargement d'un module plus d'une fois, même si je ne l'ai certainement pas et je n'utilise aucun type de chargement automatique de module.

Ceci arrive sur les lignes

LocalSessionFactoryModule.SetMappingAssemblies(() => new[] { typeof(ProviderMap).Assembly });

_kernel.Load<LocalSessionFactoryModule>();
_sessionFactory = _kernel.Get<ISessionFactory>();

où LocalSessionFactoryModule est la classe de module Ninject dérivée pour la classe NinjectModule.

Pourquoi cela ne se produit-il qu'avec NCrunch et que puis-je faire pour résoudre ce problème? Existe-t-il un moyen de vérifier si un module a déjà été chargé?

Était-ce utile?

La solution

NCrunch n'exécutera jamais de tests en concurrence dans le même processus, alors que si vous avez un comportement multi-thread à l'intérieur de votre logique de test, il devrait être sûr de dire que ce n'est pas un problème causé par le verrouillage ou le filetage sur le singleton .

Comme vous avez déjà essayé de désactiver l'exécution parallèle et que cela n'a pas fait de différence, je suppose que le problème ne serait pas causé par une utilisation simultanée des ressources en dehors du processus de test de test (c'est-à-dire des fichiers sur disque).

Cela signifie que le problème est presque certainement lié à la séquence dans laquelle les tests sont exécutés. Presque tous les coureurs de test manuel (y compris Resharper) exécuteront des tests dans une séquence définie du début à la fin. C'est bon pour la cohérence, mais il peut masquer les problèmes qui peuvent en surface lorsque les tests sont exécutés dans un ordre incompatible / aléatoire. Ncrunch exécutera des tests par ordre de priorité et peut également réutiliser les processus de test entre les essais, ce qui peut rendre le comportement d'exécution de vos tests différents si elles n'ont pas été conçues dans cet esprit.

Un moyen utile de superficie (et donc de déboguer) Les problèmes liés à la séquence consistent à essayer d'exécuter vos tests dans un ordre défini manuellement en utilisant NCrunch. Si vous cliquez avec le bouton droit de la souris sur un test dans la fenêtre des tests NCrunch, dans le menu «Avancé», vous trouverez une option pour exécuter un test à l'aide d'un processus de course de tâches existant. Essayez cette action contre plusieurs de vos tests pour voir si vous pouvez reproduire la séquence qui surface le problème. Quand cela se produit, vous devriez facilement être capable d'obtenir un débogueur sur le test et de savoir pourquoi il échoue.

Les problèmes liés à la plupart des séquences sont causés par des membres statiques non clairs, assurez-vous donc que chacun de vos tests est écrit dans l'hypothèse que l'état existant peut être laissé de côté par un autre test qui a été exécuté dans le processus. Une autre option consiste à garantir que tout l'État est complètement effacé par des tests sur la déchirure (bien que, à mon avis, il s'agit souvent d'une approche moins pragmatique).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top