从VSTest.Console.exe

时间:2019-06-28 12:10:21

标签: 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)和让实际的测试功能了解某些“禁止操作”选项。

2 个答案:

答案 0 :(得分:3)

基本上,您应该主张测试中仅包含一个Assert,以便每个测试都检查一件事

我想您拥有的与此类似:

[Test]
public void MyTest()
{
    Assert.That(...);
    Assert.That(...);
    Assert.That(...);
}

当您要排除例如第二个Assert,您当然必须在代码中提供一些功能,以执行或不执行这些行,例如:

public void MyTest()
{
    Assert.That(...);
    if(executeSecondAssert)
        Assert.That(...);
    Assert.That(...);
}

您可以引入一些编译开关来设置上述bool-flag的值:

#if(EXECUTE_ASSERT)
    bool executeSecondAssert = true;
#else
    bool executeSecondAssert = false;

现在通过环境变量提供该编译开关。

答案 1 :(得分:2)

您还可以向vstest.console-process提供.runsettings文件,如此处所示。 https://docs.microsoft.com/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019

为了提供自定义参数,请修改public class AlignRightConverter : IValueConverter // samples: _10 F2_14 C2_16 { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { try { if (parameter == null) throw new Exception("Format is missing"); var parameterStr = "" + parameter; if (!parameterStr.Contains('_')) throw new Exception("Unknown format"); var parameterParts = parameterStr.Split('_'); var format = parameterParts[0]; var lengthStr = parameterParts[1]; var length = int.TryParse(lengthStr, out int l) ? l : 12; if (value == null) return new String(' ', length); var type = value.GetType(); String targetStr; if (type == typeof(Double) && format.Length > 0) targetStr = ((Double)value).ToString(format, CultureInfo.GetCultureInfo("ru-ru")); else if (type == typeof(Single) && format.Length > 0) targetStr = ((Single)value).ToString(format, CultureInfo.GetCultureInfo("ru-ru")); else if (type == typeof(Int32) && format.Length > 0) targetStr = ((Int32)value).ToString(format, CultureInfo.GetCultureInfo("ru-ru")); else targetStr = value.ToString(); if (targetStr.Length >= length) return targetStr; else return new String(' ', length - targetStr.Length) + targetStr; } catch (Exception exception) { exception.Log($"Failed convert to string value {value} with parameters {parameter}"); return "" + value; } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } 部分,例如:

<DataGridTextColumn Header="Цена покупки" Binding="{Binding Data.CostBuy.Value, Converter={StaticResource AlignRightConverter}, ConverterParameter=C2_16}"  FontFamily="Courier New"  />

现在可以通过以下代码访问这些参数:

TestRunParameters

使您的最终测试代码如下所示:

<!-- Parameters used by tests at runtime -->
<TestRunParameters>
  <Parameter name="executeAsserts" value="1,2,3" />
</TestRunParameters>

您应该能够使用以下命令运行测试:

TestContext.Properties["executeAsserts"];