【问题标题】:Environment variables from launchsettings.json are being used in tests?来自 launchsettings.json 的环境变量正在测试中使用吗?
【发布时间】:2019-12-10 11:49:23
【问题描述】:

我有一个 .NET Core 构建管道,用于在 Azure DevOps 上运行一些测试。每个环境的设置都存储在配置文件中,例如:

  • appsettings.json
  • appsettings.qa.json
  • appsettings.test.json

构建非常基础 - 它包含 dotnet restore、dotnet build 和 dotnet test 任务:

ASPNETCORE_ENVIRONMENT 环境变量在构建管道的 Variables 部分中设置:

这些构建在包含多个构建代理(私有,非托管)的 VM 上运行。

现在奇怪的部分 - 有时构建会选择错误的设置!。

经过一些调查并添加更多日志记录后,我们意识到ASPNETCORE_ENVIRONMENT 的值有时是Development-Selfhost,而不是QA。该值似乎来自测试项目引用的项目的launchsettings.json 文件:

{
  "profiles": {
    "MyProject.PublicApi": {
      "commandName": "Project",
      "launchBrowser": false,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development-Selfhost"
      },
      "applicationUrl": "http://localhost:5028/"
    }
  }
}

根据Use multiple environments in ASP.NET Core,使用dotnet run启动应用时使用launchSettings.json文件:

launchSettings.json 被读取(如果可用)。 launchSettings.json 中的 environmentVariables 设置会覆盖环境变量。

将launchSettings.json 添加到.gitignore 解决了我的问题,但我试图了解如果我不在构建管道中执行dotnet run 命令,它为什么会使用这些设置。另外,为什么这种行为如此随机?有时它使用正确的设置,有时却没有。

更新 1(2019 年 13 月 12 日):

我检查了日志,可以确认文件launchSettings.json 已复制到测试项目的bin 文件夹中。

我已尝试为 ASPNETCORE_ENVIRONMENT 设置其他任何地方都没有设置的不同值:

{
  "profiles": {
    "MyProject.PublicApi": {
      "commandName": "Project",
      "launchBrowser": false,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Rui"
      },
      "applicationUrl": "http://localhost:5028/"
    }
  }
}

行为基本相同——有时它使用管道中设置的值,有时它会使用launchSettings.json中设置的值,并且会失败,因为没有对应的配置文件:

System.IO.FileNotFoundException : 配置文件 'appsettings.Rui.base.json' 未找到并且不是可选的。

【问题讨论】:

  • 由于您的构建是自托管的,是否可以同时运行其他构建覆盖该环境变量?
  • @Crowcoder 是的,这是我想到的第一件事,即 ASPNETCORE_ENVIRONMENT 在构建运行时在某处被修改。问题是我设置了一个任务以在构建的开始和结束时显示该变量值,但值是相同的,在本例中为 QA
  • 另外,值 Development-Selfhost 未在任何管道中设置,仅在源代码中 - 在此特定构建中,launchsettings.json
  • 您能告诉我们您是从哪里看到 ASPNETCORE_ENVIRONMENT 的值,是从 Artifact 的文件中还是从构建管道的日志中看到的?
  • 在这种情况下,我会在github.com/aspnet/AspNetCore 向 ASP.NET Core 团队提交错误报告,因为这可能不是故意的。

标签: c# .net-core azure-devops


【解决方案1】:

我也遇到了类似的问题,但在我的情况下,“launchSettings.json”中的环境变量总是覆盖其他配置。

我通过在launchSettings.json中设置多个配置文件解决了这个问题

{
  "profiles": {
    "grpc-server": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://0.0.0.0:5001"
    },
    "staging-profile": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      },
      "applicationUrl": "http://0.0.0.0:5000"
    },
    "live-profile": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "applicationUrl": "http://0.0.0.0:80"
    }
  }
}

并使用

传递配置文件名称
dotnet run --launch-profile {profile-name}

【讨论】:

    【解决方案2】:

    看起来您有一个测试,可能不止一个,它正在启动和运行一个应用程序。这将导致在 dotnet 测试任务期间读取启动设置并设置环境变量。这可以解释:

    1. 您的环境变量是如何被覆盖的
    2. 以下异常是如何引发的

    System.IO.FileNotFoundException : 配置文件 'appsettings.Rui.base.json' 未找到并且不是可选的。

    【讨论】:

    • dotnet test 任务仅在运行 selenium 测试。
    • selenium 是一个 UI 测试框架,所以这些测试需要一个正在运行的应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多