-
Notifications
You must be signed in to change notification settings - Fork 18.5k
Closed
Labels
Description
A relatively common pattern is to run a test that has multiple subtests that can be run in parallel:
func TestSomething(t *testing.T) {
t.Run("case1", func (t *testing.T) { t.Parallel(); ... })
t.Run("case2", func (t *testing.T) { t.Parallel(); ... })
}
But what if the parent test needs to set something up and clean it up at the end? You'd be tempted to do:
func TestSomething(t *testing.T) {
setup()
defer cleanup()
t.Run("case1", func (t *testing.T) { t.Parallel(); ... })
t.Run("case2", func (t *testing.T) { t.Parallel(); ... })
}
Unfortunately this is not correct - cleanup will run too early, before the subtests finish (in fact, before they even get passed the Parallel() call).
Most CockroachDB tests use a defer leaktest.AfterTest(t)() call in the beginning that checks for stray goroutines; using Parallel() in subtests breaks that pattern.
My proposal is to add an API to T that runs a cleanup step after all subtests finish; defer cleanup() would become t.Defer(cleanup()) or similar.
Also, this gotcha should be called out in the documentation (#23368 is related).
tommyknows and bouk