在 Visual Studio 2019 年将环境变量传递给测试
Passing environment variables to tests in Visual Studio 2019
这似乎是一个非常微不足道的问题,但令我惊讶的是我在网上没有发现这个问题。
我有一个 Nunit 测试项目(别人写的,我不想改动太多),我需要调试它。这些测试取决于他们使用 Environment.GetEnvironmentVariable
.
读取的环境变量
我的问题是:在 Visual Studio 中调试测试时,有什么方法可以传递环境变量吗?
我知道在通过Project Properties->Debug调试可执行项目时可以传递环境变量,但是在运行测试时这不会生效(例如,通过 Test Explorer)。我也知道我可以通过 .runsettings
文件传递测试参数,但这些只能通过 TestContext
class.
访问
如果你想在调试项目时改变可用的环境而不破坏它,你可以尝试在系统环境变量中设置它。
1),创建一个名为number
的系统环境变量
2) 在您的代码中使用:
string str= Environment.GetEnvironmentVariable("number",EnvironmentVariableTarget.Machine);
它将在您的代码中获取系统环境变量number
。
3)开始调试这个项目,在上面设置断点,当你想改变变量的时候,可以改变系统环境变量上的值number
直接在计算机的属性下。
之后,只需将光标移回代码行,即可使用更改后的值。
=========================================
更新 1
当您更改系统变量number
的值时,您应该点击OK
来保存新值。然后将断点的光标移回,得到新的值。
此外,您应该启用 Edit and Continue option。
I also know I can pass test parameters through a .runsettings files, but these are accessible only through the TestContext class.
您还可以 specify environment variables 在 .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>
或者(如果您需要 运行 编码或计算值)您可以 implement a 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>
这似乎是一个非常微不足道的问题,但令我惊讶的是我在网上没有发现这个问题。
我有一个 Nunit 测试项目(别人写的,我不想改动太多),我需要调试它。这些测试取决于他们使用 Environment.GetEnvironmentVariable
.
我的问题是:在 Visual Studio 中调试测试时,有什么方法可以传递环境变量吗?
我知道在通过Project Properties->Debug调试可执行项目时可以传递环境变量,但是在运行测试时这不会生效(例如,通过 Test Explorer)。我也知道我可以通过 .runsettings
文件传递测试参数,但这些只能通过 TestContext
class.
如果你想在调试项目时改变可用的环境而不破坏它,你可以尝试在系统环境变量中设置它。
1),创建一个名为number
2) 在您的代码中使用:
string str= Environment.GetEnvironmentVariable("number",EnvironmentVariableTarget.Machine);
它将在您的代码中获取系统环境变量number
。
3)开始调试这个项目,在上面设置断点,当你想改变变量的时候,可以改变系统环境变量上的值number
直接在计算机的属性下。
之后,只需将光标移回代码行,即可使用更改后的值。
=========================================
更新 1
当您更改系统变量number
的值时,您应该点击OK
来保存新值。然后将断点的光标移回,得到新的值。
此外,您应该启用 Edit and Continue option。
I also know I can pass test parameters through a .runsettings files, but these are accessible only through the TestContext class.
您还可以 specify environment variables 在 .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>
或者(如果您需要 运行 编码或计算值)您可以 implement a 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>