我可以从命令行(因此也可以从构建计算机上的构建)成功运行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)和让实际的测试功能了解某些“禁止操作”选项。
答案 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"];