-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Testing with multiple suites has them run in parallel #52
Comments
Interesting - is this a bug or feature? :) On May 2, 2014, at 2:15 PM, seantalts notifications@github.com wrote:
|
I think it's a bug, as normally go test will only execute tests in parallel if they mark themselves as parallel by calling *testing.T.Parallel(). |
I've been running in to this lately, and have been trying to find a fix. Work on it is slow, though - I'm swamped. |
Thanks for looking in to this, @nelsam :) |
I believe our team is running into this too today. Basically I created a new test file in a particular package with some barebone test structure - no actual tests...just an empty struct type that embeds suite.Suite, and a function that takes in a *testing.T object and calls suite.Run() on said struct. This immediately caused all our other tests to start failing indeterministically. The nature of the failures were associated with database unique key integrity violations on inserts and deletes into a single Postgres DB. This is leading me to believe that the tests were being run concurrently without calling our setup methods to prepare the environment properly between tests. Needless to say, the moment I move this test file to another package, everything magically works! We are not choosing to run any of the tests concurrently. |
Would an option to run synchronously be the solution? |
The issue really boils down to the fact that I don't know what's causing suites to run in parallel. I've done some research (again, I'm swamped), but haven't really gotten much worthwhile about what's causing it. Technically, tests that can be run in parallel should call I'll see what I can find out today, but no promises. This is on my priority list, but it's below several other things I'm working on. |
@tylerb how about two eyes on it?
|
They're running in parallel because of the implementation of golang's HTH, on a bus sorry.
|
Found it. It basically looks like testing.RunTests and testing.InternalTest are not intended for use externally. I'll see what I can do. I think our original version just walked through methods calling them individually (instead of adding them to a slice and calling testing.RunTests), and I think that would be a better choice than what we currently have; however, I'd love it if I could get individual test methods to respect both testing.T.Parallel() and the For the time being, I'll probably just strip out the testing.InternalTest and testing.RunTests usage, because (as I mentioned previously) I'm swamped and don't have much time to dedicate to this. However, I'll keep an item on my todo list to figure out a way to make use of the parallel test stuff. I'm pretty sure GoCheck works with those flags, but their solution is pretty complicated, and I think I'd rather have a simple solution than a complete solution. Anyone who really needs that functionality can probably just use GoCheck. EDIT: Actually, I think I have a better idea. Sorta. Maybe. We'll see how much it breaks things. |
... Argh. Okay, so, I was pretty sure I had found the problem, but I was (to put it simply) wrong. I added channels to suite.Run() to ensure that only one instance of suite.Run() was calling testing methods at a time, and then I just removed everything so that suite.Run() called every method in sequence (without using testing.InternalTest or testing.RunTests). Same issue, both times. My boss found this, which suggests that the issue isn't exclusive to our suites: http://stackoverflow.com/questions/15721238/go-serial-execution-of-package-tests It looks like relying on serial execution when using |
As that StackOverflow thread pointed out, it's possible to use the -p=1 flag to force the maximum number of packages to be ran in parallel (with 1 effectively serializing it all). This doesn't seem to be a problem with testify - but rather, just how go test works. Another thread for this issue is here: http://stackoverflow.com/questions/23715302/go-how-to-run-tests-for-multiple-packages |
Can confirm @MysticHLE 's solution works. Go documentation matches: https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies
Ticket should be closed I think. |
I guess it wouldn't hurt to document this in the godoc or README or something. Looks like some people already stumbled into this and where clueless. Me included. |
just |
How to reproduce this problem, is there a gist? I cannot reproduce by package main
import (
"testing"
"time"
"github.com/stretchr/testify/suite"
)
type ExampleTestSuite struct {
suite.Suite
}
func TestExampleTestSuite(t *testing.T) {
suite.Run(t, new(ExampleTestSuite))
}
func (s ExampleTestSuite) TestSimple() {
time.Sleep(2*time.Second)
s.True(true)
}
type ExampleTestSuite2 struct {
suite.Suite
}
func TestExampleTestSuite2(t *testing.T) {
suite.Run(t, new(ExampleTestSuite2))
}
func (s ExampleTestSuite2) TestSimple1() {
time.Sleep(2*time.Second)
s.True(true)
} It executes in 4 seconds. |
try to put suites in different files |
It's how the go test works. Please see this answer.
|
@dolmen, shouldn't this behavior be at least mentioned in package documentation? |
If use go test on all of your packages at once and there are multiple test suites, the suites will end up running in parallel with other suites.
The text was updated successfully, but these errors were encountered: