Jak Mogę przetestować usługę Windows?

. NET Framework: 2.0 Preferowany Język: C #

Jestem nowy w TDD (Test Driven Development).

Po pierwsze, czy można w ogóle przetestować usługę Windows?

Klasa usług Windows pochodzi z ServiceBase, która ma nadpisywalne metody,

  1. OnStart
  2. OnStop

Jak mogę wywołać te metody tak, jakby test jednostkowy był rzeczywistą usługą, która wywołuje te metody w odpowiedniej kolejności?

W tym momencie jestem nawet przeprowadzasz testy jednostkowe? czy test integracyjny?

Spojrzałem na pytanie dotyczące obsługi WCF, ale nie miało to dla mnie żadnego sensu, ponieważ nigdy nie miałem do czynienia z obsługą WCF.

Author: GEOCHET, 2008-09-03

7 answers

Prawdopodobnie zalecałbym zaprojektowanie Twojej aplikacji tak, aby" OnStart "i" OnStop " nadpisywały w usłudze Windows tylko wywołując metody na zbiorze biblioteki klas. W ten sposób można zautomatyzować testy jednostkowe względem metod biblioteki klas, a projekt również abstrakuje logikę biznesową z implementacji usługi Windows.

W tym scenariuszu testowanie samych metod "OnStart" i "OnStop" w kontekście usługi Windows byłoby testem integracji, a nie czymś, co można by automatyzacja.

 82
Author: Guy Starbuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 17:33:08

Przetestowałem usługi windows nie testując bezpośrednio usługi, ale raczej testując to, co usługa robi.

Zazwyczaj tworzę jeden zestaw dla usługi, a drugi dla tego, co robi usługa. Następnie piszę testy jednostkowe z drugim montażem.

Fajną rzeczą w tym podejściu jest to, że Twoja usługa jest bardzo cienka. Zasadniczo wszystko, co robi, to wywoływanie metod, aby wykonać właściwą pracę we właściwym czasie. Twoje drugie zgromadzenie zawiera całe mięso pracy Twoje serwis zamierza zrobić. Dzięki temu jest bardzo łatwy do przetestowania i łatwy do ponownego użycia lub modyfikacji w razie potrzeby.

 31
Author: Kevin Berridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 17:33:43

Zacząłbym Tutaj . Pokazuje jak uruchamiać i zatrzymywać usługi w C #

Próbka do rozpoczęcia jest

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

Testowałem również usługi głównie za pomocą aplikacji konsolowej, symulując, co zrobi usługa. W ten sposób mój test jednostkowy jest całkowicie zautomatyzowany.

 11
Author: David Basarab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-19 12:36:58

Użyłbym klasy usługi windows (tej, którą uruchamiasz podczas uruchamiania / zatrzymywania usługi), jakby proxy do twojego prawdziwego systemu. Nie widzę, żeby kod stojący za Twoim serwisem różnił się od jakiegokolwiek innego programu. Metody onStart i onStop są po prostu wywoływanymi zdarzeniami, takimi jak naciśnięcie przycisku w interfejsie graficznym.

Więc twoja klasa usług windows jest bardzo cienką klasą, porównywalną do formy windows. Nazywa logikę biznesową / logikę domeny, która następnie robi to, co ma do zrobienia. Wszystko, co musisz zrobić, to upewnić się, że metody, które wywołujesz w onStart i onStop, działają tak, jak powinny. Przynajmniej tak bym zrobił; -)

 5
Author: Erik van Brakel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-03 17:34:33

Projektowanie do testu jest dobrą strategią, jak wiele odpowiedzi wskazuje, zalecając, aby twoje metody OnStart i OnStop pozostały bardzo cienkie, delegując je do obiektów domain.

Jednakże, jeśli twoje testy muszą z jakiegoś powodu wykonać metody usługi, możesz użyć kodu takiego, aby wywołać je z poziomu metody testowej (wywołanie OnStart w tym przykładzie):

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});
 2
Author: BitMask777,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-14 17:43:55

Usługa okna testowego w Warunkach automatycznego wyłączania, wyłączania Usługa okna testowego po odłączeniu sieci, podłączeniu Opcja serwisowa okna testowego autostart, manual itp

 0
Author: Trupti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-30 07:13:40

Facet to chyba najlepsza odpowiedź.

W każdym razie, jeśli naprawdę chcesz, możesz po prostu wywołać w teście jednostkowym te dwie metody, jak opisano w MSDN documentation , ale ponieważ są one chronione, musisz użyć Reflection.

 0
Author: Simone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-18 08:59:21