【问题标题】:How can I unit test a Windows Service?如何对 Windows 服务进行单元测试?
【发布时间】:2008-09-03 17:28:30
【问题描述】:

.NET 框架:2.0 首选语言:C#

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

首先,是否可以对 Windows 服务进行单元测试?

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

  1. OnStart
  2. OnStop

我怎样才能触发这些方法被调用,就好像单元测试是一个以正确顺序调用这些方法的实际服务一样?

此时,我是否还在进行单元测试?还是集成测试?

我看过 WCF 服务问题,但对我来说没有任何意义,因为我从未处理过 WCF 服务。

【问题讨论】:

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


    【解决方案1】:

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

    在这种情况下,在 Windows 服务上下文中测试“OnStart”和“OnStop”方法本身将是一个集成测试,而不是您需要自动化的东西。

    【讨论】:

      【解决方案2】:

      我通过不直接测试服务,而是测试服务的功能,对 Windows 服务进行了单元测试。

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

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

      【讨论】:

      • 不错的方法,也可以将您的 BL 与服务分开。
      【解决方案3】:

      我会开始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
        {
          // ...
        }
      }
      

      我还主要通过控制台应用程序测试服务,模拟服务会做什么。这样我的单元测试就完全自动化了。

      【讨论】:

      • 这段代码返回什么 service.WaitForStatus ? WaitForStatus() 函数有什么用?请解释。谢谢
      【解决方案4】:

      我会使用 Windows 服务类(您在启动/停止服务时运行的服务类)有点像您真实系统的代理。我看不出您的服务背后的代码应该与任何其他编程有何不同。 onStart 和 onStop 方法只是被触发的事件,例如按下 GUI 上的按钮。

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

      【讨论】:

        【解决方案5】:

        为测试而设计是一个很好的策略,正如许多答案指出的那样,建议您的 OnStartOnStop 方法通过委派给域对象来保持非常精简。

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

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

        【讨论】:

          【解决方案6】:

          Test Window服务在自动关机、关机条件下 网络断开、连接时测试窗口服务 测试窗口服务选项自动启动、手动等

          【讨论】:

          • 我认为他不是在询问测试 Windows 服务的类型。
          【解决方案7】:

          Guy 可能是最好的答案。

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

          【讨论】:

            猜你喜欢
            • 2010-09-07
            • 2020-07-10
            • 2018-01-06
            • 2014-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-01
            相关资源
            最近更新 更多