Go语言的单元测试
假设你在一个package中, 写了很多函数, 现在, 你要对这些函数写UnitTest.
你可以在项目的任意位置单独创建一个文件写UnitTest, 但是这个文件的名称必须是XXX_test.go
.
在这个文件中, package
的名称必须要和你要测的函数的名称一样.
然后, 在这个文件的开头导入:
import "testing"
然后, 测试函数的格式必须是如下:
func TestXXX(t *testing.T) {
}
然后函数中写你自己的逻辑, 如果测试不通过, 你可以调用这样一个函数:
t.Errorf(占位符, 参数)
来标注错误信息.
一种比较优雅的测试用例的写法如下:
testcases := []struct {
// 这里写一个测试用例所需要的数据
/* ID for this bytecode opcode */
op Opcode
/* operand value */
operands []int
/* Combine opcode and operand, the final generated bytecode */
expected []byte
}{
// 这里构造结构体写具体的测试用例
/* Testcase 1 */
{ OpConstant, []int{ 65534 }, []byte{ byte(OpConstant), 255, 254 } },
}
// 然后遍历去写逻辑
for _, testcase := range testcases {
//
}
写完了测试用例之后, 执行的命令的格式如下:
go test -v <单元测试文件所在的目录> -run=<你要运行哪个测试函数> -count=1
-v
: 如果你在单元测试函数中, 用到了Print
, 那么加上-v
的话就会输出在终端, 如果不加-v
就不会输出.- 一般来说, 所有单元测试文件都会放到一个目录里面.
-run
后面指定的是正则表达式, 匹配到的测试函数会被运行.-count=1
: 单元测试编译后的结果禁止缓存.
Go语言的性能测试
假设现在你要看你写的Go函数的性能如何.
你可以在项目的任意位置创建一个文件, 但是这个文件的名称必须叫XXX_test.go
.
在这个文件中, package
的名称必须要和你要测的函数的名称一样.
然后在这个文件开头加上:
import "testing"
测试函数的格式必须是:
func BenchmarkXXX(b *testing.B) {
for i := 0; i < b.N; i ++ {
/* 这里写你要测试的函数 */
}
}
执行的命令的格式如下:
go test -v <性能测试所在目录> -bench=<你要运行哪个benchmark> -count=1 -benchmem -benchtime=<benchmark运行的时间>
-bench
: 后面指定的是benchmark函数的正则表达式.-benchmem
: 表示输出内存消耗.-benchtime
: 表示你要运行的每个benchmark函数要跑多长时间, 如果是1秒就用1s
.
Go Profiling
Go语言可以进行性能调优, 在运行Benchmark函数的时候, 在go test
命令中需要加上这样两个选项:
-memprofile=<Mem-Profiling输出文件的路径>
-cpuprofile=<CPU-Profiling输出文件的路径>
之后, 用如下命令:
go tool pprof <Profiling文件>
就可以进入Profiling模式, 进入到这个模式后, 就可以用一些命令去查看函数中哪些语句的cost最多等.