0x0 Golang的测试
不同于Java通常使用JUnit进行测试,Golang标准库内置了testing类用于测试
需要知道的点:
- 运行
go test .文件夹下的文件名必须以*_test.go结尾,因为该命令会自动匹配所有*_test.go运行里面的测试函数。 - 测试函数必须以
Test开头,因为go test命令只执行以Test开头的函数。 go test将按顺序执行测试函数。
如何更合理的使用go test
测试分为经典的两大类黑盒测试和白盒测试
在go-project-example中,我们可以看到*_test.go都和被测文件在同一个包内,这种包内的测试,我们应该作为白盒测试,其注重的是代码原有的BUG,对所有func都进行测试,尽量使覆盖率变高减少BUG出现的可能。
同时,为了减少程序使用过程出现的BUG,我们还需要黑盒测试针对功能性的测试,比如经典的“酒吧点炒饭”
一个测试工程师走进一家酒吧,要了一杯啤酒
一个测试工程师走进一家酒吧,要了一杯咖啡
一个测试工程师走进一家酒吧,要了0.7杯啤酒
一个测试工程师走进一家酒吧,要了-1杯啤酒
一个测试工程师走进一家酒吧,要了2^32杯啤酒
一个测试工程师走进一家酒吧,要了一杯洗脚水
一个测试工程师走进一家酒吧,要了一杯蜥蜴
一个测试工程师走进一家酒吧,要了一份asdfQwer@24dg!&*(@
一个测试工程师走进一家酒吧,什么也没要
一个测试工程师走进家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来
一个测试工程师走进家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿
一个测试工程师走进一家酒吧,要了一杯烫烫烫
一个测试工程师走进一家酒吧,要了NaN杯Null
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒,并且不付钱
一万个测试工程师在酒吧外呼啸而过
一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧;
测试工程师们满意地离开了酒吧
然后一名顾客点了一份炒饭,酒吧炸了
对暴露在外的接口进行测试,我们可以使用包外测试,即新建包,在package xxxx_test中写测试,目的是对程序的功能进行测试,将自己作为使用者并对可能的输入边界进行测试,尽量覆盖所有集合。
0x1 实操工程小项目过程中的小总结
不知道大家有没有对QueryPageInfoFlow和PublishPostFlow这两个struct存在疑惑,为什么要对这两个操作单独写一个类,而且都写一个func (x *XXX) Do()
我的理解:
这是对这两个操作流程的抽象,类内的字段可以理解为操作过程中需要的Context,Golang的方法和Java的类内方法有点出入,这样将整个操作流程继续拆分成粒度更小的操作,比如checkParam,在设计模式上比较类似模板模式的在Golang上的一种实现。
将一个操作流程定义为一个模板,类内字段都是操作流程需要的Context,操作流程拆分出完成操作所需的几个顺序子操作,子操作都是模板所需的方法,最后在Do()中选择具体的方法去匹配模板所需的checkParam,prepareInfo,packPageInfo三个操作。
如果是按照我上面的理解,那我可以定义一个
type QueryPageInfoImpl interface {
checkParam() error
prepareInfo() error
packPageInfo() error
Do() (*PageInfo, error)
}
把查询PageInfo这个操作封装,对外的API只有Do(),实现细节隐藏,这样的好处是针对不同的场景,可以使用不同的模板来实现操作,比如对是会员的用户prepareInfo有额外的会员内容。