很遗憾,MStest / VStest没有本地测试重跑逻辑。
我正在尝试实现类似于这样的自定义逻辑:
测试部分:
static int testNum = 1;
[TestMethod]
public void RerunTestOnce_Test()
{
testNum = testNum + 1;
Console.WriteLine("Test started");
Assert.IsTrue(testNum == 3, $"Test Failed with number {testNum}");
}
第一次测试应该失败,第二次当testNum达到3时测试应该通过。
更新:这是一个人工制作的示例,目的是在第一次运行时模拟失败。实际测试非常复杂,包括UI搜索方法和其他与系统和网络的交互,并且在大型长时间测试套件期间没有信心一切都会顺利。
有一个特殊的方法可以解决这个问题 - 在TestCleanup中调用RerunTestOnce():
[TestCleanup]
public void TestCleanup()
{
TestHelper.RerunTestOnce(TestContext, this);
}
以下是测试辅助类中RerunTestOnce方法的实现。在此方法中,我们使用反射和TestContext获取测试方法和初始化方法的名称,并再次运行它们:
public static void RerunTestOnce(TestContext testContext, object testInstance)
{
if (testContext.CurrentTestOutcome == UnitTestOutcome.Failed)
{
var type = testInstance.GetType();
if (type != null)
{
var testMethod = type.GetMethod(testContext.TestName);
var initMethod = type.GetMethods().SingleOrDefault(m=>m.CustomAttributes.SingleOrDefault(a=>a.AttributeType.Name == "TestInitializeAttribute")!= null);
var cleanupMethod = type.GetMethods().SingleOrDefault(m => m.CustomAttributes.SingleOrDefault(a => a.AttributeType.Name == "TestCleanupAttribute") != null);
Console.WriteLine($"[WARNING] Method [{testMethod}] was failed in first attempt. Trying to rerun...");
try
{
initMethod.Invoke(testInstance, null);
testMethod.Invoke(testInstance, null);
}
catch
{
Console.WriteLine($"[ERROR] Method [{testMethod}] was failed in second attempt. Rerun finished.");
}
}
}
}
一切都没问题,在第二次测试方法通过,但最后我看到了第一次尝试的失败结果和断言错误信息:
Test Failed - RerunTestOnce_Test
Message: Assert.IsTrue failed. Test Failed with number 2
MSTest 是何时创建测试结果的?第二次尝试后是否可以更新上一次结果?
.Should().[Not]Throw()
),并将整个内容包装为一个接受Action
委托的方法,如果您需要重用此逻辑。 - Jeroen Mostertvstest.console.exe
),并根据任何测试是否失败来应用此“重试逻辑”。 - Jeroen Mostert