If I define, two tests, each with its own TestMain
method, go test
errors: "multiple definitions found of TestMain"
.
I can understand and was expecting this behaviour actually, because, there should not be more than one TestMain in the same package. However, I don't know what to do now. Each test suite has its own needs. I need to create distinct TestMain
s to setup the tests, of course, without renaming my packages.
I could do that easily in other languages with setup methods like before
, after
, which is unique to a test class.
I'll probably go and use testify's suites. Sad that this is not supported in stdlib.
Do you have any suggestions?
Basically the TestMain function provides more control over running tests than was available in the prior releases of Go. So if the test code contains a function: func TestMain(m *testing.M) that function will be called instead of running the tests directly. The M struct contains methods to access and run the tests.
TestMain runs in the main goroutine and can do whatever setup and teardown is necessary around a call to m. Run. m. Run will return an exit code that may be passed to os.
You can use M.Run.
func TestMain(m *testing.M) {
setup()
code := m.Run()
close()
os.Exit(code)
}
See subtest for additional info.
More detailed example:
package main
import (
"testing"
)
func setup() {}
func teardown() {}
func setup2() {}
func teardown2() {}
func TestMain(m *testing.M) {
var wrappers = []struct {
Setup func()
Teardown func()
}{
{
Setup: setup,
Teardown: teardown,
},
{
Setup: setup2,
Teardown: teardown2,
},
}
for _, w := range wrappers {
w.Setup()
code := m.Run()
w.Teardown()
if code != 0 {
panic("code insn't null")
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With