怎么写测试

go的测试分为:

  • 单元测试
  • 性能测试
  • 用例测试

下面逐一讲解如何编写

单元测试

// some.go
package sometest

func Add(a, b int) int {
    return a + b
}

// some_test.go

package sometest

import "testing"

func TestAdd(t *testing.T) {
    a := 1
    b := 2
    expectd := 3
    actual := Add(a, b)
    if actual != expectd {
        t.Errorf("Add(%d,%d) == %d, expected: %d", a, b, actual, expectd)
    }
}

注意测试文件都是以_test.go 结尾,而且测试的函数名必须都是以Test开始,名称风格则是驼峰。

# 运行单元测试
go test .

性能测试

// bench_test.go

package basicbench

import "testing"

// go test -bench=.

// BenchmarkSlicWithoutPreAlloc
func BenchmarkSlicWithoutPreAlloc(b *testing.B) {
    var slice []int
    for i := 0; i < b.N; i++ {
        for j := 0; j < 100000; j++ {
            slice = append(slice, j)
        }
    }
}

// BenchmarkSliceWithPreAlloc
func BenchmarkSliceWithPreAlloc(b *testing.B) {
    for i := 0; i < b.N; i++ {
        slice := make([]int, 0, 100000)
        for j := 0; j < 100000; j++ {
            slice = append(slice, j)
        }
    }
}

这里面有一个性能测试方法,一个没有预先分配切片的空间,一个预先分配了切片的空间。 go test -bench=. 运行性能测试,结果如下:

image-20230608154658318

第一列是函数名称,第二列是运行的次数,而最后一列则表示一次操作的耗时。两者差了十几倍。

从结果可以看得出来预先分配slice还是非常重要的。

Leave a Comment

Your email address will not be published. Required fields are marked *

PHP 8.1.1 - 18.614 ms, 0 Q