GetEnvironmentVariable应该在xUnit Test中工作吗?

Eri*_*ric 27 xunit.net visual-studio .net-core visual-studio-2017

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

Ily*_*kov 41

GetEnvironmentVariable在的xUnit测试精品工程.该问题是正确地设置一个变量.如果在Properties -> Debug页面上设置变量,则会写入变量Properties\launchSettings.json,Visual Studio会使用所选配置文件启动应用程序.如您所见,launchSettings.json默认情况下甚至没有复制到输出文件夹.将此文件作为参数传递给dotnet run或者是不可能的,dotnet 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
    }
}
Run Code Online (Sandbox Code Playgroud)

设置Copy to output directory: AlwayslaunchSettings.json允许从测试访问该文件.

  • @AnthonyLiriano 我们不会添加对 Visual Studio 特定启动文件的支持。我们为什么要这么做?我们与 Visual Studio 没有任何关系,对其使用没有任何要求;它不是跨平台的,甚至离人们使用 xUnit.net 的唯一地方也不远。 (3认同)
  • @StephenBuck xUnit.net 中没有“发明的环境设置”。 (2认同)

Dan*_*eis 8

对于 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>
Run Code Online (Sandbox Code Playgroud)
  1. 在 test .csproj 中添加RunSettingsFilePath标记,指向.runsettings文件。

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

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

在此输入图像描述

使用 .runsettings 的另一个选项位于下面的链接中:

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