我有一个包含多个文件和测试的软件包。目前要重新运行我正在使用的失败测试:
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)
}
实际上它可以工作,但是会在单个测试失败的情况下重新运行所有程序包测试。因此有时它会导致下一个序列:通过,通过,失败。这样,测试标记为“失败”。 我的目标是仅重新运行软件包中的失败测试,在第一次成功时将其标记为“通过”,仅在三次失败的情况下将测试标记为“失败”。有什么建议吗?
答案 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)
}
}