如何对Windows服务进行单元测试?

时间:2008-09-03 17:28:30

标签: c# .net unit-testing windows-services

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

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

首先,甚至可以对Windows服务进行单元测试吗?

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

  1. OnStart
  2. 调用OnStop
  3. 如何触发调用这些方法,就好像单元测试是一个以正确顺序调用这些方法的实际服务?

    此时,我是否正在进行单元测试?还是整合测试?

    我已经查看了WCF服务问题,但由于我从未处理过WCF服务,因此对我没有任何意义。

7 个答案:

答案 0 :(得分:87)

我可能建议您设计应用程序,以便Windows服务中的“OnStart”和“OnStop”覆盖只调用类库程序集上的方法。这样,您就可以针对类库方法自动执行单元测试,并且该设计还可以从Windows服务的实现中抽象出您的业务逻辑。

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

答案 1 :(得分:31)

我通过不直接测试服务来测试Windows服务,而是测试服务的功能。

通常我会为服务创建一个程序集,为服务创建另一个程序集。然后我针对第二个组件编写单元测试。

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

答案 2 :(得分:11)

我会开始here。它显示了如何在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
  {
    // ...
  }
}

我还主要通过控制台应用测试服务,模拟服务的功能。这样我的单元测试就完全自动了。

答案 3 :(得分:5)

我会使用Windows服务类(当你启动/停止服务时运行的那个)有点像你真实系统的代理。我不知道你的服务背后的代码应该与任何其他编程有什么不同。 onStart和onStop方法只是被触发的事件,就像按下GUI上的按钮一样。

因此,您的Windows服务类是一个非常薄的类,可与Windows窗体相媲美。它调用您的业务逻辑/域逻辑,然后执行它应该执行的操作。您所要做的就是确保您在onStart和onStop上调用的方法正如他们应该的那样工作。至少这就是我要做的事情; - )

答案 4 :(得分:3)

设计测试是一个很好的策略,因为许多答案都指出,通过委托域对象,您的OnStartOnStop方法保持非常薄。

但是,如果您的测试由于某种原因需要执行服务方法,您可以使用这样的代码在测试方法中调用它们(在此示例中调用OnStart):

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

答案 5 :(得分:0)

测试窗口服务在自动断电,关闭条件下 网络断开,连接时的测试窗口服务 测试窗口服务选项自动启动,手动等

答案 6 :(得分:-1)

盖伊可能是最好的答案。

无论如何,如果你真的想,你可以在单元测试中调用MSDN documentation描述的这两种方法,但是,由于它们受到保护,你需要使用反射。