1. Go语言单元测试框架
首先我们来了解一下go语言单元测试的基础知识。
go语言的单元测试采用内置的测试框架,通过引入testing包以及go test来提供测试功能。
在源代码包目录内,所有以_test.go为后缀名的源文件被go test认定为测试文件,这些文件不包含在go build的代码构建中,而是单独通过 go test来编译,执行。
通常对于测试用例,go test有着以下规约:
每个测试函数必须导入testing包。测试函数有如下的命名:
func TestName(t *testing.T) { // ... }
测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头:
func TestSin(t *testing.T) { /* ... */ } func TestCos(t *testing.T) { /* ... */ } func TestLog(t *testing.T) { /* ... */ }
将测试文件和源码放在相同目录下,并将名字命名为{source_filename}_test.go
假设被测试文件example.go,那么在example.go相同目录下建立一个example_test.go的文件去测试example.go文件里的方法。
- 通常情况下,将测试文件和源码放在同一个包内。
当运行go test命令时,go test会遍历所有的*_test.go中符合上述命名规则的函数,然后生成一个临时的main包用于调用相应的测试函数,然后构建并运行、报告测试结果,最后清理测试中生成的临时文件。
了解了基础知识,我们举个例子来直观了解在go项目中编写单元测试的全过程,下图是一个项目src/utils包下源码的结构:
对于每个包下的每一个文件都有相应的test文件。对于slice.go这个文件,源码是这样的:
StringInSlice这个函数去检查一个字符串是否在一个字符串列表中,输入一个string,返回一个布尔值。
slice_test.go中对StringInSlice的测试用例是这样的: