如何在运行测试中仅重新运行失败的测试

时间:2020-09-01 20:45:35

标签: go testing automated-tests

我有一个包含多个文件和测试的软件包。目前要重新运行我正在使用的失败测试:

func TestMain(m *testing.M) {
    var r int = -1
    maxRuns := 3
    for i := 0; i < maxRuns && r != 0; i++ {
        r = m.Run()
    }
    os.Exit(r)
}

实际上它可以工作,但是会在单个测试失败的情况下重新运行所有程序包测试。因此有时它会导致下一个序列:通过,通过,失败。这样,测试标记为“失败”。 我的目标是仅重新运行软件包中的失败测试,​​在第一次成功时将其标记为“通过”,仅在三次失败的情况下将测试标记为“失败”。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这可能是一个很长的答案,但我在集成测试中看到的方式是将重试代码包装在一个函数中,该函数需要对您的测试实现进行回调。如果您进行 API 调用并且需要 context.Done 来检查挂起调用或超时,这将特别有用。例如:https://pkg.go.dev/k8s.io/client-go/util/retry

这是一个简单的例子。

func MyPolicy(ctx context.Context, t *testing.T, retries int, testImpl func(context.Context, t *testing.T)) error {
  for i := 0; i < retries; i++ {
    err := testImpl(ctx, t)
    if err != nil {
      t.Logf("Test error: %v", err)
      continue
    }
    return nil
  }
  return fmt.Errorf("Retry budget of %d attempts exhausted", retries)
}


func TestIntegration(t *testing.T) {
  impl := func(ctx context.Context, t *testing.T) error {
   // implement here calling t.Logf when needed not t.Fatal/Error
  }

  if err := MyPolicy(context.Background(), t, 3, impl); err != nil {
    t.Fatalf("Test failed with: %v", err)
  } 
}