【问题标题】:Should GetEnvironmentVariable Work in xUnit Test?GetEnvironmentVariable 应该在 xUnit 测试中工作吗?
【发布时间】:2017-10-11 04:42:58
【问题描述】:

如果我使用项目属性页面在 Visual Studio 2017 中为 .Net Core Web 项目设置环境变量,我可以使用 Environment.GetEnvironmentVariable 读取变量的值;但是,当我为我的 xUnit 测试项目设置环境变量然后调试测试时,Environment.GetEnvironmentVariable 总是返回 null。它是一个测试项目,是否应该阻止变量与 Web 项目一样使用?如果是这样,有没有办法可以为测试项目设置环境变量?谢谢。

【问题讨论】:

  • 请说明您如何为测试项目设置环境变量。
  • @Ilya,如果我知道如何添加屏幕截图。在 Visual Studio 2017 中,打开单元测试项目的“属性”窗口。在调试选项卡上有一个网格,您可以在其中输入环境变量。当我在我的web项目中添加一个自定义的,我在调试的时候可以读取它,但是当我在单元测试项目中设置一个时,该值被读取为null。

标签: visual-studio .net-core visual-studio-2017 xunit.net


【解决方案1】:

对于 mstest 或 xunittest,在单元测试中使用环境变量的解决方案是通过为平台提供的“.runsettings”文件:

更新: 这仅适用于 mstest。

  1. 在项目中添加扩展名为 .runsettings 的文件:

  1. 在创建的文件“xxx.runsettings”中配置环境变量:
<!-- File name extension must be .runsettings -->
<RunSettings>
  <RunConfiguration>
      <EnvironmentVariables>
          <!-- List of environment variables we want to set-->
          <VARIABLE_XXXX>value X</VARIABLE_XXXX>
          <VARIABLE_YYYY>value Y</VARIABLE_YYYY>
      </EnvironmentVariables>
  </RunConfiguration>
</RunSettings>
  1. 在 test .csproj 中添加 RunSettingsFilePath 标记,指向 .runsettings 文件。

重要提示:路径是绝对的。

使用 $(MSBuildProjectDirectory) 变量将返回项目目录的绝对路径。

使用 .runsettings 的其他选项在下面的链接中:

https://docs.microsoft.com/pt-br/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019

【讨论】:

  • 原来的问题是关于xUnit的,但是xUnit不支持runsettings文件。
  • 解决方案使用 dotnet core SpecFlow BDD
【解决方案2】:

GetEnvironmentVariable 在 xUnit 测试中运行良好。 问题是正确设置一个变量。如果您在Properties -&gt; Debug 页面设置变量,则该变量将被写入Properties\launchSettings.json,Visual Studio 将使用所选配置文件启动应用程序。如您所见,launchSettings.json 默认情况下甚至不会复制到输出文件夹。不可能将此文件作为参数传递给dotnet rundotnet test,如果在 CI 服务器上自动运行测试,这会导致明显的问题。因此,launchSettings.json 不被测试运行者考虑也就不足为奇了。

解决方案:有很多方法可以在 xUnit 中设置测试环境:

例如,这个集合夹具设置来自launchSettings.json的所有环境变量:

public class LaunchSettingsFixture : IDisposable
{
    public LaunchSettingsFixture()
    {
        using (var file = File.OpenText("Properties\\launchSettings.json"))
        {
            var reader = new JsonTextReader(file);
            var jObject = JObject.Load(reader);

            var variables = jObject
                .GetValue("profiles")
                //select a proper profile here
                .SelectMany(profiles => profiles.Children())
                .SelectMany(profile => profile.Children<JProperty>())
                .Where(prop => prop.Name == "environmentVariables")
                .SelectMany(prop => prop.Value.Children<JProperty>())
                .ToList();

            foreach (var variable in variables)
            {
                Environment.SetEnvironmentVariable(variable.Name, variable.Value.ToString());
            }
        }
    }

    public void Dispose()
    {
        // ... clean up
    }
}

Copy to output directory: Always 设置为launchSettings.json 以使文件可以从测试中访问。

【讨论】:

  • 很棒的解决方案@Ilya。感谢您的发表。我什至不知道 launchSettings.json 文件。
  • @Eric,谢谢你的好问题。实际上我们不使用launchsettings.json 来设置测试环境。相反,我们创建了一个简化的 json 键值文件。它作为解决方案中所有集成测试项目的链接共享。如果您需要保留多个环境/配置文件,请考虑像在 ASP.NET Core 中为 appsettings.json 所做的配置转换。
  • @IlyaChumakov 你知道我怎样才能获得当前的个人资料吗?所以我可以只过滤配置文件的变量正在运行测试
  • 如此恼人的是为什么 xUnit 会发明它自己的环境设置。谢谢你让我摆脱困境。
  • @StephenBuck xUnit.net 中没有“发明的环境设置”。
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 2019-10-02
  • 2018-02-12
相关资源
最近更新 更多