Open zwass opened 6 years ago
Note that Go 1.10 has updated wording here:
current: https://golang.org/pkg/testing/#T.Run go1.10: https://tip.golang.org/pkg/testing/#T.Run
go1.10 says:
Run runs f as a subtest of t called name. It runs f in a separate goroutine and blocks until f returns or calls t.Parallel to become a parallel test. Run reports whether f succeeded (or at least did not fail before calling t.Parallel).
Run may be called simultaneously from multiple goroutines, but all such calls must return before the outer test function for t returns.
That was added in d4529867 for #22993.
Is that sufficient?
I don't think the doc update is sufficient. There is still a critical bit of information missing:
its execution is suspended until its calling test function, that of the parent test, has returned.
Also hit this. There is definitely a lot more detail necessary in the doc for Parallel()
. The fact that the test does not proceed until the parent finishes is very important and not at all obvious.
Also, what may not be obvious on first look:
func TestMain(t *testing.T) {
setup()
defer teardown()
for name, tt := range testCases {
t.Run(name, func(t *testing.T) {
t.Parallel()
doStuff()
})
}
}
doStuff()
will NEVER be executed before the defer teardown()
kicks in.
Using sync.waitGroup
doesn't help with this either, because the subtests only run once the parent has finished.
Is there any possibility to make this "work as expected"?
@tommyknows That is best discussed in a forum, not on this issue. Let's not clutter up the issue. Thanks. https://golang.org/wiki/Questions.
@tommyknows put them in a group
func TestMain(t *testing.T) {
setup()
defer teardown()
t.Run("group", func(t *testing.T) {
for name, tt := range testCases {
t.Run(name, func(t *testing.T) {
t.Parallel()
doStuff()
})
}
})
}
What version of Go are you using (
go version
)?go version go1.9.2 darwin/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (
go env
)?What did you do?
go test -v
with the following code:What did you expect to see?
All statements print and test completes
What did you see instead?
Test hangs after "deferred done" and "waiting" are printed.
This is explained by the following comment in the blog post introducing subtests.
But I cannot find this mentioned anywhere in the documentation for the
testing
package.It seems like we at least need to update those docs with the appropriate details.