测试超时时重试nunit不起作用

时间:2019-02-21 11:49:29

标签: c# automated-tests nunit

我正在对nunit测试用例使用Timeout属性,如下所示:

@rest() //Not yet sure if i really need this
class AnotherRestCall{

    @get("/path")
    doSomething(name: string, id: number){ //Not the same order as above
        console.log(id+": "+name);
    }
}

我已经阅读了nunit的文档,但它说除了断言错误之外,重试将不起作用,但是我遇到了测试超时的情况。

我希望此测试在超时时再次执行,但是使用上述代码仅执行一次。请帮忙。

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题(端到端UI测试,这很挑剔,因此测试会抛出异常,而重试不起作用)

您可以采取解决方法并包装测试代码IE

protected void ExecuteTest(Action test)
{
  try
  {
    test();
  }
  catch (Exception ex)
  {
    //If the caught exception is not an assert exception but an unhandled exception.
    if (!(ex is AssertionException))
      Assert.Fail(ex.Message);
  }
}

您想要重试的测试,即使它看起来像

[Test, Retry(3)]
public void TestCase()
{
  ExecuteTest(() =>{
    <test code>
  });
}

我不确定nunit timeout属性的工作方式(我假设test()调用只会抛出超时异常,在这种情况下此解决方案将起作用),但是对于您可以切换到任务或操作而言,该解决方案不起作用和WaitOne之类的东西,并且对于超时IE,执行测试的默认参数为1000

 protected void ExecuteTest(Action test, int timeoutSeconds = 10)
{
  try
  {
    var task = Task.Run(test);
    if (!task.Wait(TimeSpan.FromSeconds(timeoutSeconds)))
      throw new TimeoutException("Timed out");
    test.BeginInvoke(null,null);
  }
  catch (Exception ex)
  {
    //If the caught exception is not an assert exception but an unhandled exception.
    if (!(ex is AssertionException))
      Assert.Fail(ex.Message);
  }
}

这看起来像是我们最好的解决方案,因此这是我们目前已实施的方法,并且工作正常