gpt4 book ai didi

c# - MSTest/VSTest 重试(rerun)逻辑

转载 作者:行者123 更新时间:2023-12-05 04:03:43 29 4
gpt4 key购买 nike

不幸的是,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 时,第二次通过。

UP:这是模拟首次运行失败的合成示例。真正的测试很复杂,有 UI 搜索方法和其他与系统和网络一起工作的东西,并且没有信心在一个大而长的测试套件中一切都会好起来。

为此有一个特殊的方法 - RerunTestOnce(),在 TestCleanup 中调用:

    [TestCleanup]
public void TestCleanup()
{
TestHelper.RerunTestOnce(TestContext, this);
}

这里是测试助手类中 RerunTestOnce 的实现。在其中,我们使用 Reflection & 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 如何以及何时创建测试结果 - 是否可以在第二次尝试最后的结果后更新测试结果?

最佳答案

我想到了以下解决方案

public static void Retry(Action test, int retry = 10, int sleep = 0, [CallerMemberName] string testName = null)
{
int current = 1;
retry = Math.Max(1, Math.Min(retry, 10));
while (current <= retry)
{
try
{
test();
break;
}
catch (Exception ex) when (current < retry)
{
Debug.WriteLine("Test {0} failed ({1}. try): {2}", testName, current, ex);
}

if (sleep > 0)
{
Thread.Sleep(sleep);
}
current++;
}
}

用法

[TestMethod]
public void CanRollbackTransaction()
{
Helpers.Retry(() =>
{
var even = DateTime.Now.Second % 2 == 0;
Assert.IsTrue(even);
}, 3, 1000);
}

关于c# - MSTest/VSTest 重试(rerun)逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53430550/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com