【问题标题】:How to run acceptance test against dotnet core console app?如何对 dotnet core 控制台应用程序运行验收测试?
【发布时间】:2019-11-26 14:25:49
【问题描述】:

我正在尝试针对 dotnet 核心控制台应用程序运行一些验收测试。我的测试不断失败,因为控制台应用程序没有正确启动。正确启动是指我为运行控制台应用程序而生成的 System.Diagnostics.Process 没有按照我的意愿执行。

这是我设置场景的方式:

通过运行创建控制台应用程序:

dotnet new console -o myconsoleapp

然后修改Program.Main,通过Environment.Exit(-1)返回一个-1退出代码

通过运行创建测试项目:

dotnet new xunit -o myconsoleapp.tests

在测试项目中添加 myconsoleapp 作为参考:

dotnet add ./myconsoleapp.tests reference ./myconsoleapp

编写验收测试:

[Fact]
public void AppExistsWithProperExitCode(){
  var @params = "myconsoleapp.dll";
  using(var sut = Process.Start("dotnet", @params))
  {
    sut.WaitForExit();
    var actual = sut.ExitCode;
    Assert.Equal(-1,actual);
  }
}

设置好场景后,我运行测试:

dotnet test ./myconsoleapp.tests

运行测试总是会导致失败。为了诊断我运行的问题:

dotnet build ./myconsoleapp.tests
dotnet ./myconsoleapp.tests/bin/Debug/netcoreapp2.2/myconsoleapp.dll

运行这两个命令会返回以下错误消息:

A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'myconsoleapp.tests/bin/Debug/netcoreapp2.2/'.
Failed to run as a self-contained app. If this should be a framework-dependent app, add the myconsoleapp.tests/bin/Debug\netcoreapp2.2/myconsoleapp.runtimeconfig.json file specifying the appropriate framework.

错误消息非常清楚地说明了所需内容,但我对 dotnet 核心的了解不足以完成我的任务。

【问题讨论】:

  • Program.Main(args) 不是验收测试吗?
  • @Fabio 是的,我同意运行Program.Main(args) 将是一个合适的验收测试。我最终做了类似的事情来完成我的任务。

标签: c# .net-core tdd xunit.net acceptance-testing


【解决方案1】:

我已经确定没有任何一个答案。上下文是这里的关键。我最终做了类似于@Fabio 建议的事情,但@Marius 也有一个合理的答案。仅取决于您要测试的具体内容。

我想测试可执行文件是否相应地运行。我相信我说这是一个验收测试是错误的,但它似乎更类似于功能测试。在测试中生成可运行的可执行文件的努力超出了我的预期。我改为测试Program.Main

【讨论】:

    【解决方案2】:

    您可以使用dotnet publish -c Release -r win10-x64(对于Windows exe)创建一个自包含的可执行文件,然后将您的测试代码更改为

    using(var sut = Process.Start(@"<path-to-the-executable>"))
    {
      sut.WaitForExit();
      var actual = sut.ExitCode;
      Assert.Equal(-1,actual);
    }
    

    这适用于我的带有 dotnet core 3 预览版的 Windows 10 电脑。

    【讨论】:

    • 您是正确的,运行发布将提供我运行该过程所需的可执行文件。在测试中有效地运行发布会很棘手,但肯定不是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2018-02-09
    • 2018-02-16
    • 2022-12-14
    • 2021-03-20
    • 2018-10-17
    • 2017-08-17
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多