【问题标题】:Passing environment variables to tests in Visual Studio 2019将环境变量传递给 Visual Studio 2019 中的测试
【发布时间】:2021-01-15 18:54:54
【问题描述】:

似乎是一个非常琐碎的问题,但令我惊讶的是,我在网络上没有提到这个。

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

我的问题是:有没有办法在 Visual Studio 中调试测试时传递环境变量?

我知道我可以在通过Project Properties->Debug调试可执行项目时传递环境变量,但是在运行测试时(例如通过Test Explorer)这不会生效强>)。我也知道我可以通过.runsettings 文件传递​​测试参数,但这些只能通过TestContext 类访问。

【问题讨论】:

  • 嗨,关于这个问题的任何更新?如果我的回答者帮助您处理问题,请不要接受。如果没有,请随时告诉我们:)
  • 我也面临同样的情况。在 Jenkins 中执行的一些集成测试,它为连接字符串和其他东西注入环境变量,在 VS 测试资源管理器中不起作用,除非我专门修改我的系统环境变量,只是为了能够运行测试(在我的情况下,原因这样做的原因是为了防止凭据保存在源文件或配置文件中)

标签: environment-variables nunit visual-studio-2019 visual-studio-debugging test-explorer


【解决方案1】:

我也知道我可以通过 .runsettings 文件传递​​测试参数,但这些只能通过 TestContext 类访问。

您也可以在.runsettings 文件中specify environment variables

<?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>

或者(如果您需要运行代码或计算值)您可以implement 一个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的系统环境变量

    2) 在您的代码中使用它:

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

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

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

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

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

    更新 1

    当你改变系统变量number的值时,你应该点击OK来保存新的值。然后将断点的光标往回移动,得到新的值。

    另外,您应该启用Edit and Continue option

    【讨论】:

    • 谢谢@Perry。这个解决方案显然有效,甚至可能是唯一可能的解决方案,但它很糟糕。这意味着我必须将环境变量设置为系统范围的变量,而不仅仅是针对被调试的进程(例如,我在调试控制台应用程序时可以这样做)
    • 抱歉,我刚刚检查了一下,它不起作用。我猜它只有在打开 Visual Studio 之前设置变量才会起作用!如果我每次需要更改值时都需要关闭并重新打开 VS,那么这对我来说毕竟不是一个可行的解决方案:-(
    • 如果我这边,当我更改系统号的变量时,我可以得到更改后的值。我会为你更新一个小 gif。
    • 在我的测试中,我没有中断调试过程,也不必重新启动VS。只需启用Edit and Continue vs 选项即可。
    • 您展示的是一个控制台应用程序项目。我说的是 Nunit 测试项目。在这种类型的项目中它不起作用......
    猜你喜欢
    • 2019-08-27
    • 2019-02-21
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2020-03-27
    • 2017-03-30
    • 2018-08-19
    相关资源
    最近更新 更多