dan*_*die 59 .net c# unit-testing windows-services
.NET Framework:2.0首选语言:C#
我是TDD(测试驱动开发)的新手.
首先,甚至可以对Windows服务进行单元测试吗?
Windows服务类派生自ServiceBase,它具有可覆盖的方法,
如何触发调用这些方法,就好像单元测试是一个以正确顺序调用这些方法的实际服务?
在这一点上,我甚至做了单元测试?还是整合测试?
我查看了WCF服务问题,但由于我从未处理过WCF服务,因此对我没有任何意义.
Guy*_*uck 88
我可能建议您设计应用程序,以便Windows服务中的"OnStart"和"OnStop"覆盖只调用类库程序集上的方法.这样,您可以针对类库方法自动执行单元测试,并且该设计还可以从Windows服务的实现中抽象出您的业务逻辑.
在这种情况下,在Windows服务上下文中测试"OnStart"和"OnStop"方法本身将是一个集成测试,而不是您要自动化的东西.
Kev*_*dge 32
我通过不直接测试服务来测试Windows服务,而是测试服务的功能.
通常,我为服务创建一个程序集,为服务创建另一个程序集.然后我针对第二个组件编写单元测试.
这种方法的好处是你的服务非常薄.基本上它所做的就是调用方法在正确的时间做正确的工作.您的其他程序集包含您的服务打算执行的所有工作.这使得测试非常容易,并且可以根据需要轻松重用或修改.
Dav*_*rab 11
我会从这里开始.它展示了如何在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
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我还主要通过控制台应用程序测试服务,模拟服务的功能.这样我的单元测试就完全自动化了.
我会使用Windows服务类(当你启动/停止服务时运行的那个)有点像你真实系统的代理.我不知道你的服务背后的代码应该与任何其他编程有什么不同.onStart和onStop方法只是被触发的事件,就像按下GUI上的按钮一样.
因此,您的Windows服务类是一个非常薄的类,可与Windows窗体相媲美.它调用您的业务逻辑/域逻辑,然后执行它应该执行的操作.您所要做的就是确保您在onStart和onStop上调用的方法正如他们应该的那样工作.至少那是我会做的;-)