195 votes

Exécuter les tests unitaires en série (plutôt qu'en parallèle)

J'essaie de tester à l'unité un moteur de gestion d'hôte WCF que j'ai écrit. Le moteur crée essentiellement des instances ServiceHost à la volée sur la base de la configuration. Cela nous permet de reconfigurer dynamiquement les services disponibles sans avoir à les arrêter et à les redémarrer à chaque fois qu'un nouveau service est ajouté ou qu'un ancien est supprimé.

J'ai rencontré une difficulté dans le test unitaire de ce moteur de gestion d'hôte, cependant, en raison de la façon dont ServiceHost fonctionne. Si un ServiceHost a déjà été créé, ouvert et n'a pas encore été fermé pour un point de terminaison particulier, un autre ServiceHost pour le même point de terminaison ne peut pas être créé, ce qui entraîne une exception. Étant donné que les plateformes modernes de tests unitaires parallélisent l'exécution des tests, je n'ai aucun moyen efficace de tester ce morceau de code.

J'ai utilisé xUnit.NET, en espérant qu'en raison de son extensibilité, je pourrais trouver un moyen de le forcer à exécuter les tests en série. Cependant, je n'ai pas eu de chance. J'espère que quelqu'un ici sur SO a rencontré un problème similaire et sait comment faire pour que les tests unitaires s'exécutent en série.

NOTE : ServiceHost est une classe WCF, écrite par Microsoft. Je n'ai pas la possibilité de modifier son comportement. Héberger chaque point d'extrémité de service une seule fois est également le bon comportement... cependant, ce n'est pas particulièrement propice aux tests unitaires.

6voto

TrueWill Points 14855

Je ne connais pas les détails, mais il semble que vous essayez de faire tests d'intégration plutôt que tests unitaires . Si vous pouviez isoler la dépendance à l'égard de ServiceHost Cela faciliterait probablement vos tests (et les rendrait plus rapides). Ainsi (par exemple), vous pourriez tester les éléments suivants indépendamment les uns des autres :

  • Classe de lecture de configuration
  • Usine ServiceHost (éventuellement en tant que test d'intégration)
  • Classe de moteur qui prend un IServiceHostFactory et un IConfiguration

Parmi les outils utiles, on peut citer les cadres d'isolation (mocking) et (éventuellement) les cadres de conteneurs IoC. Voir aussi

6voto

HB MAAM Points 947

Vous pouvez utiliser Liste de lecture

clic droit sur la méthode de test -> Ajouter à la liste de lecture -> Nouvelle liste de lecture

vous pouvez ensuite spécifier l'ordre d'exécution, par défaut, au fur et à mesure que vous les ajoutez à la liste de lecture, mais vous pouvez modifier le fichier de la liste de lecture comme vous le souhaitez.

enter image description here

5voto

Graviton Points 28358

Vous pouvez peut-être utiliser Tests unitaires avancés . Il vous permet de définir l'ordre dans lequel vous exécutez le test . Il se peut donc que vous deviez créer un nouveau fichier cs pour héberger ces tests.

Voici comment vous pouvez modifier les méthodes de test pour qu'elles fonctionnent dans l'ordre que vous souhaitez.

[Test]
[Sequence(16)]
[Requires("POConstructor")]
[Requires("WorkOrderConstructor")]
public void ClosePO()
{
  po.Close();

  // one charge slip should be added to both work orders

  Assertion.Assert(wo1.ChargeSlipCount==1,
    "First work order: ChargeSlipCount not 1.");
  Assertion.Assert(wo2.ChargeSlipCount==1,
    "Second work order: ChargeSlipCount not 1.");
  ...
}

Faites-moi savoir si cela fonctionne.

3voto

Matt Hayes Points 41

N

public class TestClass
{
    [Fact]
    void Test1()
    {
        lock (this)
        {
            //Test Code
        }
    }

    [Fact]
    void Test2()
    {
        lock (this)
        {
            //Test Code
        }
    }
}

2voto

user3057544 Points 354

F x

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