Skip to content

Instantly share code, notes, and snippets.

@enobufs
Created May 7, 2022 23:07
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save enobufs/2d542211fb098e063d0c4fec1d855124 to your computer and use it in GitHub Desktop.
Save enobufs/2d542211fb098e063d0c4fec1d855124 to your computer and use it in GitHub Desktop.
beforeEach and afterEach with go-test
package main
import (
"fmt"
"os"
"runtime"
"testing"
)
func TestMain(m *testing.M) {
fmt.Println("Before All")
m.Run()
fmt.Println("After All")
os.Exit(0)
}
// SetBeforeAndAfterEach takes before and after functions and returns a function called by t.Run().
func SetBeforeAndAfterEach(beforeFunc, afterFunc func(*testing.T)) func(func(*testing.T)) func(*testing.T) {
return func(test func(*testing.T)) func(*testing.T) {
return func(t *testing.T) {
if beforeFunc != nil {
beforeFunc(t)
}
test(t)
if afterFunc != nil {
afterFunc(t)
}
}
}
}
// TestSetBeforeAndAfterEach show the usage example of SetBeforeAndAfterEach
func TestSetBeforeAndAfterEach(t *testing.T) {
t.Logf("Test entered")
defer t.Logf("Test exited")
var nGoRoutine int
run := SetBeforeAndAfterEach(
func(t *testing.T) {
t.Logf("Before %s", t.Name())
nGoRoutine = runtime.NumGoroutine()
},
func(t *testing.T) {
t.Logf("After %s (goroutines: %d => %d)", t.Name(), nGoRoutine, runtime.NumGoroutine())
},
)
t.Run("subtest 1", run(func(t *testing.T) {
defer t.Logf("Running %s", t.Name())
}))
t.Run("subtest 2", run(func(t *testing.T) {
defer t.Logf("Running %s", t.Name())
}))
}
@enobufs
Copy link
Author

enobufs commented May 7, 2022

% go test -v
Before All
=== RUN   TestSetBeforeAndAfterEach
    before_after_each_test.go:34: Test entered
=== RUN   TestSetBeforeAndAfterEach/subtest_1
    before_after_each_test.go:41: Before TestSetBeforeAndAfterEach/subtest_1
    before_after_each_test.go:51: Running TestSetBeforeAndAfterEach/subtest_1
    before_after_each_test.go:45: After TestSetBeforeAndAfterEach/subtest_1 (goroutines: 3 => 3)
=== RUN   TestSetBeforeAndAfterEach/subtest_2
    before_after_each_test.go:41: Before TestSetBeforeAndAfterEach/subtest_2
    before_after_each_test.go:55: Running TestSetBeforeAndAfterEach/subtest_2
    before_after_each_test.go:45: After TestSetBeforeAndAfterEach/subtest_2 (goroutines: 3 => 3)
=== CONT  TestSetBeforeAndAfterEach
    before_after_each_test.go:56: Test exited
--- PASS: TestSetBeforeAndAfterEach (0.00s)
    --- PASS: TestSetBeforeAndAfterEach/subtest_1 (0.00s)
    --- PASS: TestSetBeforeAndAfterEach/subtest_2 (0.00s)
PASS
After All

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment