从 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