这是我参与「第五届青训营 」伴学笔记创作活动的第9天
工程实践
(1). 单元测试
单元测试,它是针对程序模块来进行程序的正确性检验的测试工作。其中,程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等,这与面向对象不同,面向对象的一个最小的单元式方法。每次对程序的修改都至少进行一次单元测试。
单元测试主要包括输入、测试单元、输出、期望以及与期望的校对几个部分。
在Golang中,单元测试基本上按照函数进行划分,通过完成一个测试函数,可以大大简化测试的步骤,并且在需求时只需改变测试的输入和期望值即可。
单元测试的规则首先是文件命名规则,含有单元测试代码的go文件必须以_test.go结尾,单元测试文件名_test.go前面的部分尽量是被测试的方法所在go文件的文件名。从函数声明规则来看,测试函数的签名必须接收一个指向testing.T类型的指针,并且函数没有返回值。从函数命名规则来看,单元测试的函数名必须以Test开头,是可导出公开的函数,是Test+要测试的方法函数名为佳,对于测试的初始化逻辑,最好放在TestMain之中。
func TestMain(m *testing.M) {
fmt.Println("Start")
tst := m.Run()
fmt.Println("Stop")
os.Exit(tst)
}
func TestCal(t *testing.T) {
tr:= Cal(0, 1)
ec := 2
if tr != ec {
t.Errorf("The answer %v is not the same as the expected one %v .", ec, tr)
}
}
/*
Start
=== RUN TestCal
--- PASS: TestCal (0.00s)
PASS
Stop
*/
go命令行式测试命令:
go test -v(查看详细测试输出) -run(指定输出函数的测试结果,默认为当前路径下所有单元测试函数) -coverprofile(指定生成覆盖率测试输出文件)
在单元测试的函数中,编写判断逻辑时可以使用一些开源测试包来简化代码,如样例视频中的Testiff,安装命令:
go get github.com/stretchr/testify
按照以下例子,调用assert.Equal直接省略多余的if语句,采用封装好的函数进行调用判断。
func TestHelloTom(t *testing.T) {
output := HelloTom()
assert.Equal(t, "Tom", output) //测试输出内容是否为Tom
}