这是我参与「第五届青训营」伴学笔记创作活动的第4天
笨人纯小白,笔记包括一些上课学到的知识和课外总结的内容,如有错误请指正!
六、Golang单元测试
单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。
单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
6.1 单元测试概述
- 要开始一个单元测试,需要准备一个go源码文件,在命名文件时需要让文件以
_test结尾; - 单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀;
func TestXXX( t *testing.T )
- 测试用例文件不会参与正常源码编译,不会被包含到可执行文件中;
- 测试用例文件使用
go test指令来执行,没有也不需要main()作为函数入口,所有在以_test结尾的源码内以Test开头的函数会自动被执行; - 测试用例可以不传入
*testing.T参数; - 新建的测试问卷一般和源文件放同一目录;
- go单元测试,引入包testing。
示例:
hello.go文件:
6.2 单元测试命令
- 单个文件进入到测试文件所在目录;执行
go test xx_test.go xx.go - 如果该目录有go.mod存在,直接
go testPASS表示测试成功
6.3 运行指定单元测试用例
go test默认执行文件内的所有测试用例;也可以使用-run参数选择需要的测试用例单独执行
//以下文件还有多个测试用例
package code11_3
import "testing"
func TestA(t *testing.T) {
t.Log("A")
}
func TestAK(t *testing.T) {
t.Log("AK")
}
func TestB(t *testing.T) {
t.Log("B")
}
func TestC(t *testing.T) {
t.Log("C")
}
这里指定TestA进行测试:
$ go test -v -run TestA select_test.go
=== RUN TestA
--- PASS: TestA (0.00s)
select_test.go:6: A
=== RUN TestAK
--- PASS: TestAK (0.00s)
select_test.go:10: AK
PASS
ok command-line-arguments 0.003s
TestA和TestAK的测试用例都被执行,原因是-run跟随的测试用例的名称支持正则表达式,若使用-run TestA$ 即可只执行TestA测试用例。
6.4 标记单元测试结果
当需要终止当前测试用例时,可以使用FailNow
func TestFailNow(t *testing.T) {
t.FailNow()
}
还有一种只标记错误不终止测试的方法,代码如下:
func TestFail(t *testing.T) {
fmt.Println("before fail")
t.Fail()
fmt.Println("after fail")
}
测试结果如下:
=== RUN TestFail
before fail
after fail
--- FAIL: TestFail (0.00s)
FAIL
exit status 1
FAIL command-line-arguments 0.002s
从日志中看出,第三行调用Fail()后测试结果标记为失败,但是第四行依然被程序执行了。