Frage

.NET Framework:2.0 bevorzugte Sprache:C#

Ich bin neu bei TDD (Test Driven Development).

Erstens: Ist es überhaupt möglich, den Windows-Dienst einem Unit-Test zu unterziehen?

Die Windows-Dienstklasse ist von ServiceBase abgeleitet, das über überschreibbare Methoden verfügt.

  1. Am Start
  2. OnStop

Wie kann ich den Aufruf dieser Methoden auslösen, als wäre Unit Test ein tatsächlicher Dienst, der diese Methoden in der richtigen Reihenfolge aufruft?

Führe ich zu diesem Zeitpunkt überhaupt einen Unit-Test durch?oder ein Integrationstest?

Ich habe mir die Frage zum WCF-Dienst angesehen, aber sie ergab für mich keinen Sinn, da ich mich nie mit dem WCF-Dienst befasst habe.

War es hilfreich?

Lösung

Ich würde wahrscheinlich empfehlen, Ihre App so zu entwerfen, dass die „OnStart“- und „OnStop“-Überschreibungen im Windows-Dienst nur Methoden für eine Klassenbibliotheksassembly aufrufen.Auf diese Weise können Sie Komponententests für die Methoden der Klassenbibliothek automatisieren, und das Design abstrahiert außerdem Ihre Geschäftslogik von der Implementierung eines Windows-Dienstes.

In diesem Szenario wäre das Testen der Methoden „OnStart“ und „OnStop“ selbst in einem Windows-Dienstkontext ein Integrationstest und nicht etwas, das Sie automatisieren würden.

Andere Tipps

Ich habe Windows-Dienste einheitlich getestet, indem ich den Dienst nicht direkt getestet habe, sondern vielmehr getestet habe, was der Dienst tut.

Normalerweise erstelle ich eine Assembly für den Dienst und eine andere für die Aufgaben des Dienstes.Dann schreibe ich Unit-Tests für die zweite Assembly.

Das Schöne an diesem Ansatz ist, dass Ihr Service sehr dünn ist.Im Grunde ist alles, was es tut, das Aufrufen von Methoden, um die richtige Arbeit zur richtigen Zeit zu erledigen.Ihre andere Versammlung enthält den gesamten Kern der Arbeit, die Ihr Dienst durchführen möchte.Dadurch ist es sehr einfach zu testen und bei Bedarf leicht wiederzuverwenden oder zu ändern.

ich würde anfangen Hier.Es zeigt, wie man Dienste in C# startet und stoppt.

Ein Beispiel für den Anfang ist

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
  {
    // ...
  }
}

Ich habe Dienste auch hauptsächlich über die Konsolen-App getestet und simuliert, was der Dienst tun würde.Auf diese Weise ist mein Unit-Test vollständig automatisiert.

Ich würde die Windows-Dienstklasse (die, die Sie ausführen, wenn Sie den Dienst starten/stoppen) verwenden, sozusagen als Proxy für Ihr reales System.Ich verstehe nicht, wie sich der Code hinter Ihrem Dienst von anderen Programmen unterscheiden sollte.Die Methoden onStart und onStop sind einfach ausgelöste Ereignisse, etwa das Drücken einer Taste auf einer GUI.

Ihre Windows-Serviceklasse ist also eine sehr dünne Klasse, vergleichbar mit einem Windows-Formular.Es ruft Ihre Geschäftslogik/Domänenlogik auf, die dann das tut, was sie tun soll.Sie müssen lediglich sicherstellen, dass die Methoden, die Sie in Ihrem onStart und onStop aufrufen, wie vorgesehen funktionieren.Zumindest würde ich das tun ;-)

Das Entwerfen für Tests ist eine gute Strategie, wie viele Antworten darauf hinweisen, indem sie dies empfehlen OnStart Und OnStop Methoden bleiben durch die Delegierung an Domänenobjekte sehr dünn.

Wenn Ihre Tests jedoch aus irgendeinem Grund die Servicemethoden ausführen müssen, können Sie Code wie diesen verwenden, um sie innerhalb einer Testmethode aufzurufen (Calling). OnStart in diesem Beispiel):

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

Testfensterservice im automatischen Ausschalten, Ausschalten der Bedingungen Testfenster -Service Wenn Netzwerk getrennt ist, angeschlossene Testfenster -Service -Option Autostart usw. usw.

Guy ist wahrscheinlich die beste Antwort.

Wie auch immer, wenn Sie wirklich möchten, können Sie diese beiden Methoden einfach im Unit-Test aufrufen, wie in beschrieben MSDN-Dokumentation Da sie jedoch geschützt sind, müssen Sie Reflection verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top