我如何testingWindows服务?

.NET Framework:2.0首选语言:C#

我是TDD(testing驱动开发)的新手。

首先,是否可以unit testingWindows服务?

Windows服务类是从ServiceBase派生的,它具有可覆盖的方法,

  1. 的OnStart
  2. 调用OnStop

如何触发这些方法被调用,就好像unit testing是一个实际的服务,以正确的顺序调用这些方法?

在这一点上,我甚至在做unit testing? 还是集成testing?

我已经看过WCF服务的问题,但它没有任何意义,因为我从来没有处理WCF服务。

我可能会推荐devise你的应用程序,这样Windows服务中的“OnStart”和“OnStop”覆盖只是调用类库程序集上的方法。 这样你就可以对类库方法自动进行unit testing,而且这个devise也会从Windows服务的实现中抽象出你的业务逻辑。

在这种情况下,在Windows服务上下文中testing“OnStart”和“OnStop”方法本身就是一个集成testing,而不是自动化。

我已经通过不直接testing服务来testingWindows服务,而是testing服务的function。

通常,我为服务创build一个程序集,为服务创build另一个程序集。 然后我写第二个程序集的unit testing。

这种方法的好处是你的服务非常薄。 基本上它只是调用方法在正确的时间做正确的工作。 您的其他程序集包含您的服务打算执行的所有工作。 这使得testing非常容易,并且可以根据需要轻松重复使用或修改。

我会从这里开始。 它展示了如何在C#中启动和停止服务

一个样本开始是

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

我也主要通过控制台应用程序testing服务,模拟服务将做什么。 这样我的unit testing就完全自动化了。

我将使用Windows服务类(您开始/停止服务时运行的那个类),类似于您的真实系统的代理。 我看不出你的服务背后的代码与其他编程有什么不同。 onStart和onStop方法仅仅是触发事件,就像在GUI上按下button一样。

所以你的Windows服务类是一个非常薄的类,可以与Windows窗体相媲美。 它调用你的业务逻辑/域逻辑,然后做它应该做的事情。 你所要做的就是确保你在onStart和onStop中调用的方法正常工作。 至less这就是我会做的;-)

devisetesting是一个很好的策略,许多答案指出,通过委托给域对象来推荐你的OnStartOnStop方法保持精简。

但是,如果你的testing因某种原因需要执行服务方法,你可以使用这样的代码在testing方法中调用它们(在本例中调用OnStart ):

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

testing窗口服务在自动关机,closures条件testing窗口服务当networking断开,连接testing窗口服务选项自动启动,手动等

盖伊可能是最好的答案。

无论如何,如果你真的想,你可以在unit testing中调用MSDN文档中描述的这两种方法,但由于它们受到保护,所以需要使用Reflection。