这是我参与「第五届青训营 」笔记创作活动的第3天
3、测试
-
回归测试
-
集成测试
-
单元测试
3.1单元测试
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)
}
在Goland中测试代码会出现上图左边的运行测试图标
3.1.5 单元测试-覆盖率
3.2 单元测试-依赖
外部依赖 >= 幂等&稳定(相互隔离)
3.3 单元测试-文件处理
涉及处理文件,导致测试不稳定
3.4 单元测试-Mock
快速Mock函数:
-
为一个函数打桩
-
为一个方法打桩
打桩可以理解为:有一个A函数,B函数替换A,B函数为打桩函数
target是被替换函数,replacement是替换函数
mock打桩测试不依赖本地文件
3.5 基准测试
func BenchmarkXXXX(*testing.B){}
上面代码中的对select()函数进行测试
3.5.3 优化
4、项目实战
社区话题页面(前端) 本地web服务
4.2 需求用例
4.4 分层结构
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
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()类似于一个构造函数