如何在命令行上将运行时参数传递给 dotnet test?
Posted
技术标签:
【中文标题】如何在命令行上将运行时参数传递给 dotnet test?【英文标题】:How do I pass runtime parameters to dotnet test on the command line? 【发布时间】:2019-08-28 07:00:09 【问题描述】:我在 .NET Core 项目中有一组单元测试并使用运行设置文件。我正在尝试设置 Azure DevOps 以对我的部署进行自动化测试。作为此过程的一部分,我需要在命令行上覆盖运行设置中的参数。
我有一个包含以下部分的运行设置文件:
<TestRunParameters>
<Parameter name="ApiUrl" value="https://myurl..." />
</TestRunParameters>
我有一个像这样保存 TestContext 的静态构造函数:
[ClassInitialize]
public static void TestClassInitialize(TestContext context)
TestContext = context;
我正在使用以下方法从 TestContext 中检索设置:
protected string GetStringSetting(string settingName)
return TestContext.Properties[settingName] as string;
当我在选择运行设置文件的情况下运行测试时,它会获取 TestContext 并且我看到 ApiUrl 条目已成功检索。
现在,我想从命令行设置这个参数。我正在使用如下命令:
dotnet test <myproject.csproj> --configuration Release -- ApiUrl=https://newurl
我收到一条错误消息,指出字典不包含键“ApiUrl”,这表明设置未处理。从阅读文档中,我认为也许我需要使用 TestRunParameters.ApiUrl 完全指定设置的名称。这给了我一个 XML 错误。
从我所阅读的所有内容来看,我认为我这样做是正确的,但无法弄清楚哪里出了问题。我正在使用 2.1.503 版的工具。
有人可以指导我如何完成这项工作吗?
【问题讨论】:
测试运行良好,从 runsettings 文件中读取值。我遇到的问题是覆盖 Azure DevOps 框架中的这些参数。我可以使用“dotnet 测试”步骤或“Visual Studio 测试”步骤。我无法让其中任何一个使用参数替换。 【参考方案1】:您可以使用以下参数语法来做到这一点:
dotnet test <myproject.csproj> --configuration Release -- TestRunParameters.Parameter(name=\"ApiUrl\", value=\"https://newurl\")
来源:https://github.com/Microsoft/vstest-docs/blob/master/docs/RunSettingsArguments.md
【讨论】:
【参考方案2】:您可以通过inject environment variables from your pipeline 来克服dotnet test
命令的限制。通过这样做,您将不需要处理临时 *.runsettings 文件来获取您的测试参数。您可以从 CI 管道设置环境变量,然后在运行时在测试中检索它们。
您的 YAML 文件可以设置环境变量:
run_tests:
# Set environment variables as you need
variables:
FOO: "bar"
您的测试可以检索环境变量:
[Test]
public void Test()
var foo = Environment.GetEnvironmentVariable("FOO"); //set to "bar"
【讨论】:
【参考方案3】:这是目前无法实现的。在 github 上查看那些已关闭的问题:
Runsettings from command line (--) doesnt have capability to pass TestRunParameters dotnet test with TestRunParameters defined should pass parameters to the test runner您在这里唯一的选择是使用新值创建另一个运行设置文件,并将其传递给带有--settings
标志的dotnet test
。
【讨论】:
【参考方案4】:在使用DotNetCoreCLI@2
任务或dotnet test
命令时,您不能从命令行替换TestRunParameters
,但您可以创建一个临时的.runsettings
文件,其中包含有效参数值作为您在 Azure Pipelines 中的构建管道:
- powershell: |
[xml]$doc = Get-Content Tests/Settings.runsettings
$doc.RunSettings.TestRunParameters.ChildNodes.Item(0).value = 'https://newurl'
$doc.Save("$(Build.SourcesDirectory)/Tests/UpdatedSettings.runsettings")
displayName: 'Override TestRunParameters'
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: test
projects: 'Tests/Tests.csproj'
arguments: '-s $(Build.SourcesDirectory)/Tests/UpdatedSettings.runsettings'
- powershell: |
Remove-Item $(Build.SourcesDirectory)/Tests/UpdatedSettings.runsettings
displayName: Remove temporary .runsettings file
您可以在 GitHub 上找到完整的 YAML 文件和示例测试项目。
【讨论】:
以上是关于如何在命令行上将运行时参数传递给 dotnet test?的主要内容,如果未能解决你的问题,请参考以下文章