如何对Windows服务进行单元测试?
.NET Framework:2.0
首选语言:C#
我是TDD(测试驱动开发)的新手。
首先,甚至可以对Windows Service进行单元测试吗?
Windows服务类是从ServiceBase派生的,ServiceBase具有可重写的方法,
- OnStart
- 停止
我如何触发这些方法被调用,就好像单元测试是按正确顺序调用这些方法的实际服务一样?
此时,我是否还在进行单元测试?或者集成测试?
我已经看过WCF服务问题,但是对我来说这没有任何意义,因为我从未处理过WCF服务。
解决方案
回答
我将从这里开始。它显示了如何在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 Service中的" OnStart"和" OnStop"替代仅调用类库程序集上的方法。这样,我们可以针对类库方法自动执行单元测试,并且设计还可以从Windows服务的实现中抽象出业务逻辑。
在这种情况下,在Windows Service上下文中测试" OnStart"和" OnStop"方法本身将是一个集成测试,而不是自动化的测试。
回答
我已经通过不直接测试Windows服务,而是测试服务的功能来对Windows服务进行单元测试。
通常,我为该服务创建一个程序集,并为该服务创建另一个程序集。然后,我针对第二个程序集编写单元测试。
这种方法的好处是服务非常薄。基本上,它所做的只是调用方法以在正确的时间进行正确的工作。另一个程序集包含服务打算完成的所有工作。这使得测试非常容易,并且可以根据需要轻松重用或者修改。
回答
我将使用Windows服务类(在启动/停止服务时运行的服务类),就像真实系统的代理一样。我看不出服务背后的代码与任何其他程序应该有什么不同。 onStart和onStop方法只是触发事件,例如按GUI上的按钮。
因此,Windows服务类是非常薄的类,可与Windows窗体相比。它调用业务逻辑/域逻辑,然后执行应做的事情。我们所要做的就是确保我们在onStart和onStop中调用的方法按预期运行。至少那是我会做的;-)
回答
自动关闭,关闭条件下的测试窗口服务
网络断开连接时测试窗口服务
测试窗口服务选项自动启动,手动等