在Visual Studio 2019中向测试传递环境变量

19

这看起来是一个相当琐碎的问题,但令我惊讶的是在网络上找不到任何相关信息。

我有一个Nunit测试项目(别人写的,我不想改变太多),需要进行调试。这些测试依赖于它们使用Environment.GetEnvironmentVariable读取的环境变量。

我的问题是:在Visual Studio中调试测试时是否有一种方法可以传递环境变量?

我知道我可以通过 项目属性->调试 在调试可执行项目时传递环境变量,但运行测试(例如通过测试资源管理器)时不起作用。我还知道我可以通过.runsettings文件传递测试参数,但这些只能通过TestContext 类访问。


你好,关于这个问题有任何更新吗?如果我的回答帮助您解决了问题,请不要接受它。如果没有解决问题,请随时告诉我们 :) - Mr Qian
我面临着相同的情况。在 Jenkins 中执行一些集成测试,该测试会注入环境变量以获取连接字符串和其他信息,但是除非我特别修改系统环境变量,否则无法从 VS 测试资源管理器中运行这些测试(在我的情况下,之所以这样做是为了防止凭据被保存在源或配置文件中)。 - Nelson Rodriguez
2个回答

13
我知道可以通过.runsettings文件传递测试参数,但是这些只能通过TestContext类访问。您也可以在.runsettings文件中指定环境变量
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
    <RunConfiguration>
        <EnvironmentVariables>
            <YOUR_VARIABLE>Value for your variable</YOUR_VARIABLE>
            <SOME_OTHER_VARIABLE>With another Value</SOME_OTHER_VARIABLE>
        </EnvironmentVariables>
    </RunConfiguration>
</RunSettings>

或者(如果您需要运行代码或计算值),您可以实现一个DataCollector,通过ITestExecutionEnvironmentSpecifier提供环境变量。

// Add a reference to nuget package `Microsoft.TestPlatform.ObjectModel`
// The assembly name must end with `Collector` (i.e. match `*collector.dll`)

[DataCollectorFriendlyName("my own example collector")]
[DataCollectorTypeUri("datacollector://myown/examplecollector/1.0")]
public class MyDataCollector : DataCollector, ITestExecutionEnvironmentSpecifier
{
    public override void Initialize(
        XmlElement configurationElement,
        DataCollectionEvents events,
        DataCollectionSink dataSink,
        DataCollectionLogger logger,
        DataCollectionEnvironmentContext environmentContext)
    {
        // inspect configurationElement for your custom settings
    }

    public IEnumerable<KeyValuePair<string, string>> GetTestExecutionEnvironmentVariables()
    {
        return new Dictionary<string, string>
        {
            ["YOUR_VARIABLE"] = "your value",
        };
    }
}

你还可以通过.runsettings文件配置数据收集器:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
    <RunConfiguration>
        <TestAdaptersPaths>path/where/to/find/your/collector</TestAdaptersPaths>
    </RunConfiguration>
    <DataCollectionRunSettings>
        <DataCollectors>
            <DataCollector friendlyName="my own example collector" uri="datacollector://myown/examplecollector/1.0">
                <Configuration>
                    <SomeSettingHere/>
                </Configuration>
            </DataCollector>
        </DataCollectors>
    </DataCollectionRunSettings>
</RunSettings>

-2
如果您想在调试项目时更改环境变量而不中断它,可以尝试在系统环境变量中设置它。 1),创建一个名为number的系统环境变量。

enter image description here

2) 在你的代码中使用:

string str=  Environment.GetEnvironmentVariable("number",EnvironmentVariableTarget.Machine);

它将在您的代码中获取系统环境变量number

3) 开始调试此项目并在其上设置断点,当您想要更改变量时,可以直接在计算机属性下更改系统环境变量number的值。

之后,只需将光标移回代码行,即可使用更改后的值。

=========================================

更新 1

enter image description here

当您更改系统变量number的值时,应单击OK以保存新值。然后将断点的光标移回以获取新值。

此外,您应启用编辑并继续选项


2
感谢@Perry。这个解决方案显然可行,甚至可能是唯一的解决方案,但它很糟糕。这意味着我必须将环境变量设置为系统范围内的变量,而不仅仅是针对调试过程(例如在调试控制台应用程序时可以这样做)。 - Arnon Axelrod
1
抱歉,我刚刚检查了一下,它不起作用。我猜只有在打开 Visual Studio 之前设置变量才能使其工作!如果每次需要更改值时都需要关闭和重新打开 VS,那么对我来说这不是一个可行的解决方案 :-( - Arnon Axelrod
如果我的程序中,当我改变系统数字的变量时,我可以获取到改变后的值。那么我会为您更新一个小 GIF。 - Mr Qian
在我的测试中,我没有破坏调试过程,也不需要重新启动VS。只需启用“编辑并继续”选项即可。 - Mr Qian
2
你展示的是一个控制台应用程序项目。我说的是Nunit测试项目。在这种类型的项目中它不起作用... - Arnon Axelrod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接