【问题标题】:How to integration test console application in solution?如何在解决方案中集成测试控制台应用程序?
【发布时间】:2015-09-25 20:12:29
【问题描述】:

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

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

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

[更新:是的,我知道这是一个集成测试。我已经更新了标题。我已经为业务逻辑分离了我的逻辑。集成测试的价值在于以一种自动化的方式真正做到这一点。它确保我所有的配置设置都是正确的,我的程序集版本问题没问题,我的日志记录是,数据库和队列和缓存访问都在运行,等等]

【问题讨论】:

  • 理想情况下,您的 Program.cs 中有一个类可以为您完成工作。所以你是 Program.cs 只会构造和调用该类上的任何方法。这样,如果您的控制台应用程序中有依赖项(例如数据),那么您可以将它们注入到您的单元测试中。
  • 如果您说的是单元测试...那么您的应用程序中每个类(严格来说)的测试呢?您不应该一起测试应用程序,而是测试它的组件。同样在极端情况下,您的应用程序(作为黑匣子)可能不会/不应该得到。对于集成测试,然后使用 Process.Start() 运行您的应用程序,直接调用其类会破坏测试,因为您的测试台将/可能会过多地影响其环境。

标签: c# unit-testing console-application


【解决方案1】:

当我创建这种类型的设置时,我将所有工作放在一个单独的 DLL 中。 Windows 服务/控制台应用程序位于一个将大部分工作委托给 DLL 的小型项目中。大多数功能测试都是针对该 DLL 进行的。

为了测试最终的可执行文件,我将启动一个进程(假设您的测试正在生成控制台以您的单元测试可以测量的方式添加句柄的消息)。

确保您有适当的方式终止控制台应用程序(例如发送“关闭”消息),并检查该进程是否在您的单元测试中实际退出。

如果您有多个单元测试都想启动控制台应用程序,那么如果每个单独的测试都启动控制台应用程序,它们将无法并行运行测试。在这种情况下,让您的测试类负责启动和结束流程,而不是每个单独的单元测试。

【讨论】:

    【解决方案2】:

    有一个相关的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
        }
    }
    

    【讨论】:

    • 他(大概)已经在这样做了。他的问题是如何测试程序,而不是如何编译为服务和控制台应用程序。
    【解决方案3】:

    是的,如果您将其公开,您可以引用 .exe 并调用 main

    public class Program
    {
        public static int Main(string[] args)
        {
            // Implementation here...
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多