我有一个控制台应用程序(稍后将作为Windows服务安装),它基本上运行一个无限循环,从队列中读取消息并对该消息执行某些操作。
我想创建一个自动化测试用例来启动测试端到端行为。我的问题是,在单元测试中启动应用程序的最佳方法是什么? 使用Process.Start? 或者我可以直接引用Program.cs - static void main并运行它吗?
想法?示例代码将不胜感激,谢谢!
[更新:是的,我知道这是一个集成测试。我已经更新了标题。我已经把业务逻辑的逻辑分开了。集成测试的价值实际上是以自动化方式实现的。它确保我的所有配置设置都正确,我的装配版本问题都没问题,我的日志记录是,数据库和队列以及缓存访问都在运行,等等。]
答案 0 :(得分:2)
当我创建这种类型的设置时,我将所有工作放在一个单独的DLL中。 Windows服务/控制台应用程序位于一个小型项目中,它将大部分工作委托给DLL。大多数功能测试都是针对该DLL发生的。
为了测试最终的可执行文件,我将启动一个进程(假设您的测试正在生成控制台添加处理的消息,以便您的单元测试可以测量)。
确保您有适当的方法来终止控制台应用程序(例如发送“关闭”消息),并检查该进程是否实际退出单元测试。
如果您有多个单元测试都希望启动控制台应用程序,那么如果每个单独的测试启动控制台应用程序,它们将无法并行运行测试。在这种情况下,让您的测试类负责开始和结束过程,而不是每个单独的单元测试。
答案 1 :(得分:0)
有一个相关的article in Code Project建议使用条件编译进行调试:
static class Program
{
static void Main()
{
#if(!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()
};
ServiceBase.Run(ServicesToRun);
#else
MyService myServ = new MyService();
myServ.Process();
// here Process is my Service function
// that will run when my service onstart is call
// you need to call your own method or function name here instead of Process();
#endif
}
}
答案 2 :(得分:0)
是的,您可以引用.exe并在公开时调用main
:
public class Program
{
public static int Main(string[] args)
{
// Implementation here...
}
}
然而,正如其他人所指出的那样,它不会是单元测试。