Go 语言工程实践之测试 | 青训营笔记

132 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第3天

3、测试

  1. 回归测试

  2. 集成测试

  3. 单元测试

3.1单元测试

image.png

3.1.1 单元测试规则

所有测试代码文件_test.go结尾

测试函数:

func TestXXX(*testing.T)

初始化逻辑放入TestMain()

3.1.2 单元测试例子

3.1.4 assert

func HelloTom() string{
    return Tom
}

func TestHelloTom(t *tessting.T) {
    output := HelloTom()
    expectOutput := "Tom"
    assert.Equal(t, expectOutput, output)
}

image.png

在Goland中测试代码会出现上图左边的运行测试图标

3.1.5 单元测试-覆盖率

image.png

3.2 单元测试-依赖

外部依赖 >= 幂等&稳定(相互隔离)

3.3 单元测试-文件处理

涉及处理文件,导致测试不稳定

3.4 单元测试-Mock

快速Mock函数:

  1. 为一个函数打桩

  2. 为一个方法打桩

image.png

打桩可以理解为:有一个A函数,B函数替换A,B函数为打桩函数

target是被替换函数,replacement是替换函数

mock打桩测试不依赖本地文件

3.5 基准测试

image.png

func BenchmarkXXXX(*testing.B){}

上面代码中的对select()函数进行测试

3.5.3 优化

image.png

4、项目实战

社区话题页面(前端) 本地web服务

4.2 需求用例

image.png

4.4 分层结构

image.png

4.5 组件工具

开源web框架:(github.com/gin-gonic/g…)

go mod
import "github.com/gin-gonic/gin"
go get -u github.com/gin-gonic/gin

4.6 Repository

image.png

image.png

var (
   topicIndexMap map[int64]*Topic
   postIndexMap  map[int64][]*Post
)

topicIndexMap里面的value是指针类型

postIndexMap里面的value是切片(slice)指针类型

因为topic和post是一对多的关系,所以post的Map-value采用切片

Tip: 切片声明,当方括号里面没数值时为切片

var s []int
var s [n]int

sync.Once
//可以控制函数只能被调用一次。不能多次重复调用。
var (
   topicDao  *TopicDao
   topicOnce sync.Once
)
func NewTopicDaoInstance() *TopicDao {
   topicOnce.Do(
      func() {
         topicDao = &TopicDao{}
      })
   return topicDao
}
func (*TopicDao) QueryTopicById(id int64) *Topic {
   return topicIndexMap[id]
}

什么是方法?
方法与函数的区别是,函数不属于任何类型,方法属于特定的类型。

普通类型的方法接受者
Go语言中的 ​​方法(Method)​​ 是一种作用于特定类型变量的函数。这种特定类型变量叫做 ​​接收者(Receiver)​​。
接收者的概念就类似于其他语言中的​​this​​或者 ​​self​​。

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {  
    函数体  
}

其中,接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是​​self​​、​​this​​之类的命名。例如,​​Person​​类型的接收者变量应该命名为 ​​p​​,​​Connector​​类型的接收者变量应该命名为​​c​​等。
接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
方法名、参数列表、返回参数:具体格式与函数定义相同。

func ( x DDDD) FOO(var type) ( ret type , err Errot),这里来说一下 x DDDD是什么意思。

在go语言中,没有类的概念但是可以给类型(结构体,自定义类型)定义方法。

所谓方法就是定义了接受者的函数,方法和函数只差了一个,那就是方法在 func 和标识符之间多了一个参数。接受者定义在func关键字和函数名之间:

接收者有两种,一种是值接收者,一种是指针接收者。顾名思义,值接收者,是接收者的类型是一个值,是一个副本,方法内部无法对其真正的接收者做更改;指针接收者,接收者的类型是一个指针,是接收者的引用,对这个引用的修改之间影响真正的接收者。

上面代码中QueryTopicById的接收者的类型为 TopicDao结构体指针 但是未定义接收者,所以QueryTopicById为TopicDao结构体指针类型的方法,即NewTopicDaoInstance()的方法,NewTopicDaoInstance()类似于一个构造函数