2008-09-03 13 views
57

.NET Framework: 2.0 Langue préférée: C#Comment puis-je tester un service Windows?

Je suis nouveau à TDD (Test Driven Development).

Tout d'abord, est-il même possible de tester un service Windows?

classe de service Windows est dérivé de ServiceBase, qui a des méthodes Overridable,

  1. OnStart
  2. OnStop

Comment puis-je déclencher ces méthodes à appeler comme test unitaire est une réelle service qui appelle ces méthodes dans le bon ordre?

À ce stade, est-ce que je fais même un test d'unité? ou un test d'intégration? J'ai examiné la question du service WCF mais cela n'avait aucun sens pour moi puisque je n'ai jamais traité le service WCF.

Répondre

80

Je vous recommande 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 extrait également votre logique métier de l'implémentation d'un service Windows. Dans ce scénario, tester les méthodes "OnStart" et "OnStop" dans un contexte Windows Service serait alors un test d'intégration, pas quelque chose que vous automatiseriez.

11

Je voudrais commencer here. Il montre comment démarrer et arrêter les services en C#

Un échantillon de départ est 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é les services principalement par l'application de la console, simulant ce que le service ferait. De cette façon, mon test unitaire est complètement automatisé.

+1

ce que cela code retour service.WaitForStatus? Quelle est l'utilité de la fonction WaitForStatus()? S'il vous plaît, expliquez. merci – Mou

30

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

Généralement, je crée un assembly pour le service et un autre pour ce que fait le service. Ensuite, j'écris des tests unitaires contre le second assemblage.

La bonne chose à propos de cette approche est que votre service est très mince. Fondamentalement, tout ce qu'il fait, c'est appeler des méthodes pour faire le bon travail au bon moment. Votre autre assemblage contient toute la viande du travail que votre service a l'intention de faire. Cela le rend très facile à tester et facile à réutiliser ou à modifier au besoin.

+0

Bonne approche, qui sépare également votre BL du service. – JPReddy

5

Je voudrais utiliser la classe de service Windows (celle que vous exécutez lorsque vous démarrez/arrêtez le service) un peu comme un proxy à votre système réel. Je ne vois pas comment 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, par exemple en poussant un bouton sur une interface graphique. Donc, votre classe de service Windows est une classe très fine, comparable à un formulaire Windows. Il appelle votre logique métier/logique de domaine, qui fait alors ce qu'il est censé faire. Tout ce que vous avez à faire est de vous assurer que la ou les méthodes que vous appelez dans votre onStart et votre OnStop fonctionnent comme elles sont censées le faire.Au moins, c'est ce que je ferais ;-)

0

service de fenêtre de test en mise hors tension automatique, arrêtez conditions service de fenêtre de test lorsque le réseau déconnecté, connecté option de service de fenêtre Test de démarrage automatique, etc manuel

+1

Je pense qu'il ne pose pas de questions sur les types de tests d'un service Windows. – JPReddy

0

Guy est probablement le meilleure réponse. Quoi qu'il en soit, si vous le voulez vraiment, vous pouvez simplement appeler dans l'unité de test ces deux méthodes comme décrit par MSDN documentation mais, comme elles sont protégées, vous devrez utiliser Reflection.

2

La conception de test est une bonne stratégie, comme le soulignent la plupart des réponses en recommandant que vos méthodes OnStart et OnStop restent très minces en déléguant des objets de domaine.

Cependant, si vos tests ne doivent exécuter les méthodes de service pour une raison quelconque, vous pouvez utiliser le code comme ceci pour les appeler à partir d'une méthode d'essai (appelant OnStart dans cet exemple):

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