如何在解决方案中集成测试控制台应用?

时间:2015-09-25 20:12:30

标签: c# unit-testing console-application

我有一个控制台应用程序(稍后将作为Windows服务安装),它基本上运行一个无限循环,从队列中读取消息并对该消息执行某些操作。

我想创建一个自动化测试用例来启动测试端到端行为。我的问题是,在单元测试中启动应用程序的最佳方法是什么? 使用Process.Start? 或者我可以直接引用Program.cs - static void main并运行它吗?

想法?示例代码将不胜感激,谢谢!

[更新:是的,我知道这是一个集成测试。我已经更新了标题。我已经把业务逻辑的逻辑分开了。集成测试的价值实际上是以自动化方式实现的。它确保我的所有配置设置都正确,我的装配版本问题都没问题,我的日志记录是,数据库和队列以及缓存访问都在运行,等等。]

3 个答案:

答案 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...
    }
}

然而,正如其他人所指出的那样,它不会是单元测试