Hammer invokes a test concurrently in P goroutines N times per goroutine.
Here's an example:
P := 8 // max count of goroutines N := 1000 // work per goroutine if testing.Short() { // Adjust down if `-test.short` P = 4 N = 100 } hammer.NewHammer(t, P, N).Run(func(name string) { // Do test using name if something needs to be unique. }, nil) if t.Failed() { return // At least one test failed, so return now. }
See /RATIONALE.md
type Hammer interface { // Run invokes a concurrency test, as described in /RATIONALE.md. // // * test is concurrently run in P goroutines, each looping N times. // * name is unique within the hammer. // * onRunning is any function to run after all goroutines are running, but before test executes. // // On completion, return early if there's a failure like this: // if t.Failed() { // return // } Run(test func(name string), onRunning func()) }
func NewHammer(t *testing.T, P, N int) Hammer
NewHammer returns a Hammer initialized to indicated count of goroutines (P) and iterations per goroutine (N). As discussed in /RATIONALE.md, optimize for Hammer.Run completing in .1 second on a modern laptop.