【后端青训营笔记】Go语言工程实践

99 阅读4分钟

0x0 Golang的测试

不同于Java通常使用JUnit进行测试,Golang标准库内置了testing类用于测试

需要知道的点:

  1. 运行go test .文件夹下的文件名必须以*_test.go结尾,因为该命令会自动匹配所有*_test.go运行里面的测试函数。
  2. 测试函数必须以Test开头,因为go test命令只执行以Test开头的函数。
  3. 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 实操工程小项目过程中的小总结

不知道大家有没有对QueryPageInfoFlowPublishPostFlow这两个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有额外的会员内容