tutorial services run how examples example and c# .net unit-testing windows-services

services - windows service installer c#



¿Cómo puedo probar la unidad de un servicio de Windows? (7)

Diseñar para la prueba es una buena estrategia, ya que muchas de las respuestas señalan que sus métodos OnStart y OnStop muy delgados al delegar en objetos de dominio.

Sin embargo, si sus pruebas necesitan ejecutar los métodos de servicio por alguna razón, puede usar un código como este para llamarlos desde un método de prueba (llamando a OnStart en este ejemplo):

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

.NET Framework: 2.0 Idioma preferido: C #

Soy nuevo en TDD (Test Driven Development).

En primer lugar, ¿es posible probar el servicio de Windows por unidades?

La clase de servicio de Windows se deriva de ServiceBase, que tiene métodos invalidables,

  1. OnStart
  2. OnStop

¿Cómo puedo activar esos métodos para que se llamen como si la prueba unitaria fuera un servicio real que llame a esos métodos en el orden correcto?

En este punto, ¿estoy haciendo una prueba unitaria? o una prueba de integración?

He visto la pregunta sobre el servicio WCF pero no tenía ningún sentido para mí ya que nunca he tratado con el servicio WCF.


Guy es probablemente la mejor respuesta.

De todos modos, si realmente lo desea, puede invocar en la prueba unitaria estos dos métodos como se describe en la documentación de MSDN pero, como están protegidos, deberá usar Reflection.


He probado servicios de Windows de la unidad al no probar el servicio directamente, sino más bien probar lo que hace el servicio.

Normalmente, creo un ensamblaje para el servicio y otro para lo que hace el servicio. Luego escribo pruebas unitarias contra el segundo conjunto.

Lo bueno de este enfoque es que su servicio es muy delgado. Básicamente, todo lo que hace es llamar a métodos para hacer el trabajo correcto en el momento correcto. Su otra asamblea contiene toda la carne del trabajo que su servicio intenta hacer. Esto hace que sea muy fácil de probar y fácil de reutilizar o modificar según sea necesario.


Probablemente recomendaría diseñar su aplicación para que el "OnStart" y el "OnStop" se anulen en el Servicio de Windows simplemente llame a los métodos en un conjunto de biblioteca de clases. De esta forma, puede automatizar las pruebas unitarias contra los métodos de la biblioteca de clases, y el diseño también abstrae su lógica comercial de la implementación de un servicio de Windows.

En este escenario, probar los métodos "OnStart" y "OnStop" en un contexto de servicio de Windows sería una prueba de integración, no algo que automatizaría.


Servicio de ventana de prueba en apagado automático, condiciones de cierre Servicio de la ventana de prueba cuando la red está desconectada, inicio de la opción de servicio de la ventana de prueba conectada, manual, etc.


Usaría la clase de servicio de Windows (la que ejecuta cuando inicia / detiene el servicio) como un proxy para su sistema real. No veo cómo el código detrás de su servicio debería ser diferente de cualquier otra programación. Los métodos onStart y onStop son simplemente eventos que se activan, como presionar un botón en una GUI.

Entonces su clase de servicio de Windows es una clase muy delgada, comparable a un formulario de Windows. Llama a su lógica de lógica de negocio / dominio, que luego hace lo que se supone que debe hacer. Todo lo que tienes que hacer es asegurarte de que los métodos a los que llamas en onStart y onStop funcionen como deberían. Al menos eso es lo que haría ;-)


Yo comenzaría here . Muestra cómo iniciar y detener servicios en C #

Una muestra para comenzar es

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

También probé servicios principalmente a través de la aplicación de consola, simulando lo que haría el servicio. De esa forma, mi prueba unitaria está completamente automatizada.