Question

Cadre .NET :2.0 Langue préférée:C#

Je suis nouveau sur TDD (Test Driven Development).

Tout d’abord, est-il même possible de tester unitairement le service Windows ?

La classe de service Windows est dérivée de ServiceBase, qui possède des méthodes remplaçables,

  1. Au démarrage
  2. À l'arrêt

Comment puis-je déclencher l'appel de ces méthodes comme si le test unitaire était un service réel qui appelle ces méthodes dans le bon ordre ?

À ce stade, est-ce que je fais même un test unitaire ?ou un test d'intégration ?

J'ai regardé la question du service WCF mais cela n'avait aucun sens pour moi puisque je n'ai jamais eu affaire au service WCF.

Était-ce utile?

La solution

Je recommanderais probablement de concevoir votre application de sorte que les remplacements "OnStart" et "OnStop" dans le service Windows appellent simplement des méthodes sur un assembly de bibliothèque de classes.De cette façon, vous pouvez automatiser les tests unitaires par rapport aux méthodes de la bibliothèque de classes, et la conception fait également abstraction de votre logique métier de l'implémentation d'un service Windows.

Dans ce scénario, tester les méthodes « OnStart » et « OnStop » elles-mêmes dans un contexte de service Windows serait alors un test d'intégration et non quelque chose que vous automatiseriez.

Autres conseils

J'ai testé les services Windows unitairement en ne testant pas le service directement, mais en testant plutôt ce que fait le service.

En règle générale, je crée un assembly pour le service et un autre pour ce que fait le service.Ensuite, j'écris des tests unitaires sur le deuxième assembly.

L’avantage de cette approche est que votre service est très limité.Fondamentalement, tout ce qu'il fait, c'est appeler des méthodes pour effectuer le bon travail au bon moment.Votre autre assemblée contient toute l’essentiel du travail que votre service a l’intention de faire.Cela le rend très facile à tester et à réutiliser ou à modifier selon les besoins.

je commencerais ici.Il montre comment démarrer et arrêter les services en C#

Un exemple pour commencer est

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

J'ai également testé des services principalement via une application console, simulant ce que ferait le service.De cette façon, mon test unitaire est complètement automatisé.

J'utiliserais la classe de service Windows (celle que vous exécutez lorsque vous démarrez/arrêtez le service) un peu comme un proxy pour votre système réel.Je ne vois pas en quoi le code derrière votre service devrait être différent de toute autre programmation.Les méthodes onStart et onStop sont simplement des événements déclenchés, comme appuyer sur un bouton sur une interface graphique.

Votre classe de service Windows est donc une classe très fine, comparable à un formulaire Windows.Il appelle votre logique métier/logique de domaine, qui fait ensuite ce qu'elle est censée faire.Tout ce que vous avez à faire est de vous assurer que la ou les méthodes que vous appelez dans vos onStart et onStop fonctionnent comme elles sont censées le faire.En tout cas, c'est ce que je ferais ;-)

Concevoir pour les tests est une bonne stratégie, comme le soulignent de nombreuses réponses en recommandant que votre OnStart et OnStop les méthodes restent très fines en déléguant aux objets du domaine.

Cependant, si vos tests doivent exécuter les méthodes de service pour une raison quelconque, vous pouvez utiliser un code comme celui-ci pour les appeler depuis une méthode de test (en appelant OnStart dans cet exemple) :

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});

Service de fenêtre de test en puissance automatique, arrêt les conditions du service de la fenêtre de test lorsque le réseau est déconnecté, l'option de service de fenêtre de test connecté Autostart, manuel, etc.

Guy est probablement la meilleure réponse.

Quoi qu'il en soit, si vous le souhaitez vraiment, vous pouvez simplement invoquer dans le test unitaire ces deux méthodes comme décrit par Documentation MSDN mais comme ils sont protégés, vous devrez utiliser Reflection.

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