c# - 从 VSTest.Console.exe 向单元测试传递参数或选项

标签 c# c++ visual-studio unit-testing vstest

我可以从命令行(因此从构建机器上的构建)成功运行 VS 单元测试。

VSTest.Console.EXE "MyTest.dll" /logger:trx /platform:x64 /inIsolation

我还可以使用 /TestCaseFilter 选项过滤掉我不想在特定环境中执行的任何必需测试:

VSTest.Console.EXE "MyTest.dll" /TestCaseFilter:Name!=Verify_DigitallySigned

这是运行“检查是否数字签名”测试所必需的。

这样我就可以筛选出所需的测试用例集。

但是,我想要的是让单元测试知道是否不需要某些测试(断言)。例如传递一个 "/DontTestSigning" 参数。这样,单元测试(用 C++ 或 C# 编写)将看到这样的参数/选项,并且不会做额外的断言,从而防止在非真实生产构建(例如 PR 构建)上的构建失败。

我看到 VSTest.Console.exe(还有 MSTest.exe)有 /testsettings 选项,但我不确定 (IF)可以应用并让实际的测试函数知道一些“不要做”的选项。

最佳答案

您还可以向 vstest.console 进程提供一个 .runsettings 文件,如此处所示。 https://learn.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]
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

关于c# - 从 VSTest.Console.exe 向单元测试传递参数或选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56806702/

相关文章:

c# - 如何在 IL 代码中发出三元运算符

c++ - std::bitset::at() 在 VS2015 中消失

c++ - 仅使用 600 MB 内存时调整 QByteArray 的大小会抛出 std::bad_alloc

c++ - 由于从 C 到 C++ 的类型转换,无法编译并出现错误 C2440

.net - 有没有办法在 Visual Studio 的 Node.js 工具上打开控制台窗口?

c# - 从 TFS 打开文件会出现错误 TF10187

c# - 从字符串名称返回 FontStyle

c# - ViewContext.Writer() 在 ASP.NET MVC 1.0 中不存在?

c# - 在 .NET MVC 中,我们可以将 CSS 保留在 Views 文件夹中吗?

c++ - 如何将断言宏实现为一种方法?