从 VSTest.Console.exe 向单元测试传递参数或选项
Pass argument or option to Unit Tests from VSTest.Console.exe
我可以从命令行成功 运行 VS 单元测试(因此从构建机器上的构建)。
VSTest.Console.EXE "MyTest.dll" /logger:trx /platform:x64 /inIsolation
我还可以使用 /TestCaseFilter
选项过滤掉我不想在特定环境中执行的任何必需测试:
VSTest.Console.EXE "MyTest.dll" /TestCaseFilter:Name!=Verify_DigitallySigned
这是 而非 到 运行 "check if digitally signed" 测试所必需的。
这样我就可以筛选出需要的测试集case/s。
然而,我想要的是让单元测试知道是否不需要某些测试(断言)。例如传递一个 "/DontTestSigning"
参数。这样单元测试(用 C++ 或 C# 编写)将看到这样的 parameter/option,并且不会做额外的断言,从而防止在非真实生产构建(例如 PR 构建)上的构建失败。
我看到有 /testsettings
选项和 VSTest.Console.exe(还有 MSTest.exe),但我不确定如何( IF) 可以应用并让实际测试函数了解一些 "dont-do" 选项。
基本上你应该倾向于在你的测试中只有一个Assert
,这样每个测试都会检查一个单一的东西。
所以你的情况与此类似,我想:
[Test]
public void MyTest()
{
Assert.That(...);
Assert.That(...);
Assert.That(...);
}
当你想排除例如第二个 Assert
,您当然必须在代码 中提供一些功能 来执行或不执行这些行,例如:
public void MyTest()
{
Assert.That(...);
if(executeSecondAssert)
Assert.That(...);
Assert.That(...);
}
你可以引入一些compile-switch设置上面的值bool-flag:
#if(EXECUTE_ASSERT)
bool executeSecondAssert = true;
#else
bool executeSecondAssert = false;
现在通过 environment-variable.
提供 compile-switch
您还可以向 vstest.runsettings-file 提供一个 .runsettings-file,如此处所示。console-process。 https://docs.microsoft.com/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019.
为了提供自定义参数,请修改 TestRunParameters
部分,例如:
<!-- Parameters used by tests at runtime -->
<TestRunParameters>
<Parameter name="executeAsserts" value="1,2,3" />
</TestRunParameters>
现在可以通过以下代码访问这些参数:
TestContext.Properties["executeAsserts"];
因此您的最终 test-code 可能如下所示:
[Test]
public void MyTest()
{
var assertsToRun = TestContext.Properties["executeAsserts"].Split(",").Select(x => Convert.ToInt(x)).ToArray();
if(assertsToRun.Contains(1)
Assert.That(...);
if(assertsToRun.Contains(2)
Assert.That(...);
if(assertsToRun.Contains(3)
Assert.That(...);
}
您应该能够 运行 使用以下命令进行测试:
vstest.console.exe MyTestAssembly.dll /Settings:MySettings.runsettings
我可以从命令行成功 运行 VS 单元测试(因此从构建机器上的构建)。
VSTest.Console.EXE "MyTest.dll" /logger:trx /platform:x64 /inIsolation
我还可以使用 /TestCaseFilter
选项过滤掉我不想在特定环境中执行的任何必需测试:
VSTest.Console.EXE "MyTest.dll" /TestCaseFilter:Name!=Verify_DigitallySigned
这是 而非 到 运行 "check if digitally signed" 测试所必需的。
这样我就可以筛选出需要的测试集case/s。
然而,我想要的是让单元测试知道是否不需要某些测试(断言)。例如传递一个 "/DontTestSigning"
参数。这样单元测试(用 C++ 或 C# 编写)将看到这样的 parameter/option,并且不会做额外的断言,从而防止在非真实生产构建(例如 PR 构建)上的构建失败。
我看到有 /testsettings
选项和 VSTest.Console.exe(还有 MSTest.exe),但我不确定如何( IF) 可以应用并让实际测试函数了解一些 "dont-do" 选项。
基本上你应该倾向于在你的测试中只有一个Assert
,这样每个测试都会检查一个单一的东西。
所以你的情况与此类似,我想:
[Test]
public void MyTest()
{
Assert.That(...);
Assert.That(...);
Assert.That(...);
}
当你想排除例如第二个 Assert
,您当然必须在代码 中提供一些功能 来执行或不执行这些行,例如:
public void MyTest()
{
Assert.That(...);
if(executeSecondAssert)
Assert.That(...);
Assert.That(...);
}
你可以引入一些compile-switch设置上面的值bool-flag:
#if(EXECUTE_ASSERT)
bool executeSecondAssert = true;
#else
bool executeSecondAssert = false;
现在通过 environment-variable.
提供 compile-switch您还可以向 vstest.runsettings-file 提供一个 .runsettings-file,如此处所示。console-process。 https://docs.microsoft.com/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019.
为了提供自定义参数,请修改 TestRunParameters
部分,例如:
<!-- Parameters used by tests at runtime -->
<TestRunParameters>
<Parameter name="executeAsserts" value="1,2,3" />
</TestRunParameters>
现在可以通过以下代码访问这些参数:
TestContext.Properties["executeAsserts"];
因此您的最终 test-code 可能如下所示:
[Test]
public void MyTest()
{
var assertsToRun = TestContext.Properties["executeAsserts"].Split(",").Select(x => Convert.ToInt(x)).ToArray();
if(assertsToRun.Contains(1)
Assert.That(...);
if(assertsToRun.Contains(2)
Assert.That(...);
if(assertsToRun.Contains(3)
Assert.That(...);
}
您应该能够 运行 使用以下命令进行测试:
vstest.console.exe MyTestAssembly.dll /Settings:MySettings.runsettings