关于c#:如何对Windows服务进行单元测试?

关于c#:如何对Windows服务进行单元测试?

How can I unit test a Windows Service?

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

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

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

Windows服务类是从ServiceBase派生的,ServiceBase具有可重写的方法,

  • OnStart
  • 停止
  • 我如何触发这些方法被调用,就好像单元测试是按正确顺序调用这些方法的实际服务一样?

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

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


    我可能会建议设计您的应用程序,以便Windows Service中的" OnStart"和" OnStop"替代仅调用类库程序集上的方法。这样,您可以针对类库方法自动执行单元测试,并且设计还从Windows Service的实现中抽象出您的业务逻辑。

    在这种情况下,在Windows Service上下文中测试" OnStart"和" OnStop"方法本身将是一个集成测试,而不是自动化的测试。


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

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

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


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

    一个示例开始是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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
      {
        // ...
      }
    }

    我还主要通过控制台应用程序测试了服务,以模拟服务将执行的操作。这样,我的单元测试就完全自动化了。


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

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


    设计测试是一个不错的策略,因为许多答案都建议通过委托域对象使OnStartOnStop方法保持精简。

    但是,如果由于某些原因测试确实需要执行服务方法,则可以使用如下代码从测试方法中调用它们(在此示例中调用OnStart):

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

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


    盖伊可能是最好的答案。

    无论如何,如果确实需要,您可以按照MSDN文档中的说明在单元测试中调用这两种方法,但是由于它们是受保护的,因此需要使用Reflection。


    推荐阅读

      服务器重启命令linux?

      服务器重启命令linux?,工作,标准,设备,服务,系统,名称,命令,百度,网络,密码,

      linux服务端常用命令?

      linux服务端常用命令?,工作,地址,系统,网络,基础,命令,标准,工具,信息,管理,l

      linux禁用服务命令行?

      linux禁用服务命令行?,服务,系统,软件,管理,工具,信息,状态,平台,连续,技术,l

      linux停服务常用命令?

      linux停服务常用命令?,地址,工作,系统,命令,服务,信息,标准,管理,代码,进程,l

      linux服务器删除命令?

      linux服务器删除命令?,系统,服务,管理,情况,命令,工作,互动,地址,软件,较大,l

      linux开启服务命令?

      linux开启服务命令?,服务,标准,设备,工作,网络,系统,密码,命令,服务器,终端,

      linux编写c语言命令?

      linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在

      linux服务器负荷命令?

      linux服务器负荷命令?,信息,电脑,中科,环境,工具,系统,平均,检测,情况,状态,l

      linux常见服务器命令?

      linux常见服务器命令?,信息,工作,标准,地址,设备,系统,情况,时间,状态,命令,

      linux服务器基础命令?

      linux服务器基础命令?,设备,标准,工作,地址,服务,系统,信息,情况,图片,基础,

      服务器linux命令大全?

      服务器linux命令大全?,标准,工作,设备,系统,服务,信息,时间,命令,服务器,级

      重启linux服务器命令?

      重启linux服务器命令?,标准,设备,工作,命令,网络,系统,提示,主机,服务器,接

      linux用命令启动服务?

      linux用命令启动服务?,服务,网络,密码,信息,系统,设备,地址,项目,状态,积极,l

      linux停起服务命令?

      linux停起服务命令?,服务,系统,状态,代码,工具,情况,电脑,连续,跨行,软件,如

      linux系统启服务命令?

      linux系统启服务命令?,服务,系统,名称,网络,命令,状态,设备,工作,标准,信息,l

      linux把命令做成服务?

      linux把命令做成服务?,服务,系统,软件,代码,工具,密码,最新,地址,设备,网站,

      服务器关机命令linux?

      服务器关机命令linux?,系统,等级,工作,基础,命令,网络,体系,标准,实战,灵活,l

      linux服务器快捷命令?

      linux服务器快捷命令?,工作,标准,设备,第一,首页,名称,系统,环境,命令,终端,

      linux服务器调用命令?

      linux服务器调用命令?,系统,地址,设备,标准,工作,密码,中心,盘中,网络,软件,