timerring

Go Common Test

January 22, 2025 · 2 min read · Page View:
Tutorial
Go | Test
If you have any questions, feel free to comment below. Click the block can copy the code.
And if you think it's helpful to you, just click on the ads which can support this site. Thanks!

The test methods in Go mainly include three types: unit test, benchmark test, and example test.

First of all:

  1. You should import the testing package first.
  2. In the package directory, all source code files with the suffix *_test.go are part of the go test test, and will not be compiled into the final executable file by go build.

Unit Test #

The basic format/signature is:

func TestXxx(t *testing.T) {
    // ...
}

Put the _test.go and .go in the same dir, and run go test -v to execute the test detailed, the go test -cover to check the coverage of the test.

Benchmark test #

The benchmark test will not be excuted by default, you need to use go test -bench=Xxx to execute the benchmark test.

The basic format/signature is:

func BenchmarkXxx(b *testing.B) {
    for i := 0; i < b.N; i++ {
        // ...
    }
}

The b.N is the number of times the test is run, and the b.N is automatically adjusted by the go test tool.

    BenchmarkSplit-8        10000000               215 ns/op
  • The -8 means the test is run on the 8 GOMAXPROCS
  • The 10000000 means the test is run 10000000 times.
  • The 215 ns/op means the test takes 215 nanoseconds average per operation.

go test -bench=Xxx -benchmem can check the memory allocation and the number of allocations per operation.

    BenchmarkSplit-8        10000000               215 ns/op             112 B/op          3 allocs/op
  • The 112 B/op means the test allocates 112 bytes per operation.
  • The 3 allocs/op means the test allocates 3 times per operation.

Performance comparison #

// note: the n is the parameter of Fib not the b.N, the b.N is the number of times the test is run. it will be automatically adjusted by the go test tool.
func benchmarkFib(b *testing.B, n int) {
    for i := 0; i < b.N; i++ {
        Fib(n)
    }
}

func BenchmarkFib1(b *testing.B)  { benchmarkFib(b, 1) }
func BenchmarkFib2(b *testing.B)  { benchmarkFib(b, 2) }
func BenchmarkFib3(b *testing.B)  { benchmarkFib(b, 3) }

go test -bench=. will execute the benchmark test for all functions with the prefix Benchmark.

func BenchmarkSplit(b *testing.B) {
    time.Sleep(5 * time.Second) // some time-consuming operations
    b.ResetTimer()              // reset the timer(ignore the time above)
    for i := 0; i < b.N; i++ {
        // some time-consuming operations
    }
}

// you can also use this method

func BenchmarkSplit(b *testing.B) {
    b.StopTimer()
    // some time-consuming operations
    b.StartTimer()
    for i := 0; i < b.N; i++ {
        // some time-consuming operations
    }
}

Parallel test #

Signature:

func BenchmarkSplitParallel(b *testing.B) {
    // b.SetParallelism(1) // set the number of CPU to use
    b.RunParallel(func(pb *testing.PB) {
        for pb.Next() {
            // some time-consuming operations
        }
    })
}

Example test #

Signature:

func ExampleName() {
    // No parameters and no return
}

<< prev | Go Concurrency... Continue strolling CPU can only... | next >>

If you want to follow my updates, or have a coffee chat with me, feel free to connect with me: