什么是测试?
通俗的讲,软件测试就是测试编写代码的可用性和稳定性。是安全生产的最后屏障。
编写代码只是占据项目建设时长的一部分,还有更多的时间用在了测试代码、修复bug上。而这些代码上的错误得不到重视,就会在开发中埋下一颗雷。不知道何时引爆,且引爆带来的后果通常无法预料。
良好的项目测试可以让产品拥有更好的系统稳定性。
测试的种类
测试一般分为三种:
- 回归测试:一般是由专业的测试工程师通过终端回归一些固定的主流程使用场景。回归测试就是为了发现修复bug的行为是否会导致新的bug发生。
- 集成测试:顾名思义就是将不同的各模块部分集合成一个整体进行测试。因为各模块由不同的人编写,虽然经过了模块的单元测试,但不能保证不同模块组合起来仍然保持正常运行。
- 单元测试:一般在开发阶段由开发者对独立的函数、模块进行功能的验证。这也是开发中我们最常用到的,由我们编写者对编写的代码进行测试。
从回归测试到单元测试,每个测试的规模越小,但覆盖的规模也就越大。因为层级越低需要测试的总规模越大。理所当然的是,单元测试的覆盖率越高,代码的稳定性也就越高。只有良好的底层基础才能撑起工程系统的稳定质量。
单元测试初体验
作为开发人员在代码开发阶段最常用的测试。我们也应当掌握好go语言单元测试的基本使用。
单元测试包括:
- 输入
- 测试单元
- 输出
- 校对
单元可以是接口、函数、模块等。输入通过单元获得输出,再将输出与预期输出进行校对。
而作为开发者的我们,拥有对开发的代码有深入的理解,可以更好的编写单元测试的代码。单元测试也可以让我们对编写的代码可用性、稳定性有更清楚的认识。更好的让我们修复bug。但编写代码本身就极为耗时,倘若再加上单元测试代码的编写更是大大增加开发人员的时间成本。
掌握好go的单元测试工具链和代码编写,让代码开发更高效,代码更稳定。
Go 的单元测试
题外话:go的单元测试是集成在工具链中的,使用方法简单便捷。 而我之前使用过c++的单元测试。是由google开源的google test,通过cmake使用。虽然已经很好用了,但使用上还是颇为复杂。
单元测试基本使用规则:
- 所有测试文件均由 _test.go结尾。
- 如:proxy_test.go
- 测试文件需含有 TestXxx(t *testing.T) 函数
func TestXxx(var *testing.T){
}
(需含testing库) 3. 初始化的逻辑放在TestMain(m *testing.M)中
func TestMain(m *testing.M){
//测试前的数据装载、初始化工作
code:=m.Run()
//测试后的资源释放工作
}
下面是单元测试的简单例子:
HelloTom.go:
package goTest
func HelloTom() string{
//错误输出: return "Jerry"
return "Tom"
}
HelloTom_test.go:
func TestHelloTOm(t *testing.T){
output:=HelloTom()
expectOutput:="Tom"
if output!=expectOutput{
t.Errorf("Expected %s do not match actual %s",expectOutput,output)
}
// assert.Equal(t,expectOutput,output)
}
在HelloTom_test.go文件中含有test函数,在test函数中获得函数输出,与预期进行校对。
接下来,需要使用go自带的go test工具进行单元测试
go test工具
go test HelloTom_test.go HelloTom.go
go test工具可以运行测试函数来进行校对
HelloTom函数成功输出 "Tom" :
go test HelloTom_test.go HelloTom.go
ok command-line-arguments 0.**001s**
HelloTom函数错误输出 "Jerry" :
go test HelloTom_test.go HelloTom.go
--- FAIL: TestHelloTOm (0.00s)
HelloTom_test.go:10: Expected Tom do not match actual Jerry
FAIL
FAIL command-line-arguments 0.001s
FAIL
写在最后
这就是go test单元测试的初体验,这只是基本使用。还有许多的使用方法还没有掌握,在后来的项目实战中逐渐掌握。这是对我们开发人员极为重要的一项技能,能减少在项目后期庞杂的系统中无法确定bug的出错单元的辨认难度。