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

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

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

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

  1. 启动时
  2. 停止

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

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

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

有帮助吗?

解决方案

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

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

其他提示

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

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

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

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

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

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

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

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

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

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

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

盖伊可能是最好的答案。

无论如何,如果您确实愿意,您可以在单元测试中调用这两个方法,如 MSDN 文档 但是,由于它们受到保护,因此您需要使用反射。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top