如何在使用 NUnit 或 XUnit 时将参数传递给 dotnet test 命令
How to pass parameters to the dotnet test command while using NUnit or XUnit
我正在使用 C# 以及 .NET Core、Selenium 和 NUnit 开发一些端到端测试。
现在我想写一个登录测试用例。我的测试是通过使用 dotnet test
命令从控制台开始的。
我只想将用户名和密码传递给此命令并在我的测试中获取它们。 我无法使用 NUnit-Console,因为它目前不支持 .NET Core。
解决这个问题的建议方法是什么?我宁愿不将设置存储在文件中,而是直接将它们输入到控制台中。
不幸的是,将设置从 dotnet test
传递到 NUnit 的唯一方法是使用 .runsettings
文件。 NUnit 无法为 dotnet test
工具创建自定义命令行参数——尽管我们很乐意这样!
查看示例 .runsettings
文件 here。您需要的具体位:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<!-- Parameters used by tests at runtime -->
<TestRunParameters>
<Parameter name="webAppUrl" value="http://localhost" />
<Parameter name="webAppUserName" value="Admin" />
<Parameter name="webAppPassword" value="Password" />
</TestRunParameters>
</RunSettings>
然后您应该能够使用 -s
标志将此文件传递到 dotnet test
。
dotnet test myProj.csproj -s mySettings.runsettings
如果您想避免运行设置文件,可以使用此解决方法。传递参数的推荐方法之一是通过环境变量。因此,在您的 C# nunit(或 xunit)文件中,您可以执行以下操作:
// in mytest.cs
var user = Environment.GetEnvironmentVariable("TestUser");
var password = Environment.GetEnvironmentVariable("TestPassword");
var url = Environment.GetEnvironmentVariable("TestUrl");
如果您不想明确设置您的环境变量,请记住您可以随时为您的会话进程临时设置它们。一种方法是创建一个简单的 cmd 文件
#launchtests.cmd
SETLOCAL
SET TestUser='pete001'
SET TestPassword='secret'
SET TestUrl='http://testserver.local/login'
DOTNET TEST mytest.csproj
现在是有趣的部分。您可以参数化它的每个方面。所以你可以把它改成:
#run wity launchtests.cmd pete001 secret 'http://testserver.local/login'
SETLOCAL
SET TestUser=%1
SET TestPassword=%2
SET TestUrl=%3
DOTNET TEST mytest.csproj
或者如果你想从 Azure DevOps(fka VSTS 或 TFS)管道启动测试,你可以简单地使用 $(...) 符号来内联变量,即使它们被标记为秘密 and/or 来自 Azure KeyVault。
#In Azure DevOps, variables not marked as secret are already added to the environment
SET TestPassword=$(TestPassword)
dotnet test $(Build.SourcesDirectory)\MyCompany.MyProduct.UITests\MyTest.csproj --configuration $(BuildConfiguration) --collect "Code Coverage" --logger trx --results-directory $(Agent.TempDirectory)
本文档建议现在应该可以在命令行而不是在 runsettings 文件中传递参数。
https://github.com/Microsoft/vstest-docs/blob/master/docs/RunSettingsArguments.md
dotnet test -- MSTest.MapInconclusiveToFailed=True MSTest.DeploymentEnabled=False
注意 --
之后的 space。
编辑 1
对我有用的是添加 runsettings 文件的组合,然后使用以下语法覆盖我想要的参数:
dotnet test -- TestRunParameters.Parameter(name=\"myParam\", value=\"value\")
我正在使用 C# 以及 .NET Core、Selenium 和 NUnit 开发一些端到端测试。
现在我想写一个登录测试用例。我的测试是通过使用 dotnet test
命令从控制台开始的。
我只想将用户名和密码传递给此命令并在我的测试中获取它们。 我无法使用 NUnit-Console,因为它目前不支持 .NET Core。
解决这个问题的建议方法是什么?我宁愿不将设置存储在文件中,而是直接将它们输入到控制台中。
不幸的是,将设置从 dotnet test
传递到 NUnit 的唯一方法是使用 .runsettings
文件。 NUnit 无法为 dotnet test
工具创建自定义命令行参数——尽管我们很乐意这样!
查看示例 .runsettings
文件 here。您需要的具体位:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<!-- Parameters used by tests at runtime -->
<TestRunParameters>
<Parameter name="webAppUrl" value="http://localhost" />
<Parameter name="webAppUserName" value="Admin" />
<Parameter name="webAppPassword" value="Password" />
</TestRunParameters>
</RunSettings>
然后您应该能够使用 -s
标志将此文件传递到 dotnet test
。
dotnet test myProj.csproj -s mySettings.runsettings
如果您想避免运行设置文件,可以使用此解决方法。传递参数的推荐方法之一是通过环境变量。因此,在您的 C# nunit(或 xunit)文件中,您可以执行以下操作:
// in mytest.cs
var user = Environment.GetEnvironmentVariable("TestUser");
var password = Environment.GetEnvironmentVariable("TestPassword");
var url = Environment.GetEnvironmentVariable("TestUrl");
如果您不想明确设置您的环境变量,请记住您可以随时为您的会话进程临时设置它们。一种方法是创建一个简单的 cmd 文件
#launchtests.cmd
SETLOCAL
SET TestUser='pete001'
SET TestPassword='secret'
SET TestUrl='http://testserver.local/login'
DOTNET TEST mytest.csproj
现在是有趣的部分。您可以参数化它的每个方面。所以你可以把它改成:
#run wity launchtests.cmd pete001 secret 'http://testserver.local/login'
SETLOCAL
SET TestUser=%1
SET TestPassword=%2
SET TestUrl=%3
DOTNET TEST mytest.csproj
或者如果你想从 Azure DevOps(fka VSTS 或 TFS)管道启动测试,你可以简单地使用 $(...) 符号来内联变量,即使它们被标记为秘密 and/or 来自 Azure KeyVault。
#In Azure DevOps, variables not marked as secret are already added to the environment
SET TestPassword=$(TestPassword)
dotnet test $(Build.SourcesDirectory)\MyCompany.MyProduct.UITests\MyTest.csproj --configuration $(BuildConfiguration) --collect "Code Coverage" --logger trx --results-directory $(Agent.TempDirectory)
本文档建议现在应该可以在命令行而不是在 runsettings 文件中传递参数。
https://github.com/Microsoft/vstest-docs/blob/master/docs/RunSettingsArguments.md
dotnet test -- MSTest.MapInconclusiveToFailed=True MSTest.DeploymentEnabled=False
注意 --
之后的 space。
编辑 1
对我有用的是添加 runsettings 文件的组合,然后使用以下语法覆盖我想要的参数:
dotnet test -- TestRunParameters.Parameter(name=\"myParam\", value=\"value\")