这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
go语言上手总结
单元测试
每个测试函数必须导入testing包,测试函数的基本格式(签名)如下:
func TestName(t *testing.T){
}
测试函数的名字必须以Test开头,可选的后缀名必须以大写字母开头,举几个例子:
func TestAdd(t *testing.T){ ... }
func TestSum(t *testing.T){ ... }
func TestLog(t *testing.T){ ... }
mock测试
打桩函数的意思:
举个具体的例子说明,如测试function()函数时,function()中调用了函数test(),但是在测试function()的时候test()函数可能还没有写出来,这时可以写一个test()的存根(stub)函数,来模拟test()函数,让它仅仅返回一个值,这样的话就可以完成对函数function()的测试了。
func TestProcessFirstLineWithMock(t *testing.T) {
//为ReadFirstLine函数打桩
monkey.Patch(ReadFirstLine, func() string {
return "line110"
})
//恢复打桩之前的函数
defer monkey.Unpatch(ReadFirstLine)
line := ProcessFirstLine()
assert.Equal(t, "line000", line)
}
基准测试
可以测试运行时的性能和CPU的损耗,分析代码的性能。
社区话题页面
从github拿下来的代码有个地方有问题,在repository的topic里,type Topic struct 的CreateTime的类型应该是int64。
改完之后运行server,然后在浏览器输入http://localhost:8080/community/page/get/1 和 http://localhost:8080/community/page/get/2 可以看到效果。
topicId := c.Param("id")
是通过URL传递参数。
大致逻辑:运行server后,会初始化topic和post数据,把json字符串反序列化成结构体的形式。初始化的数据都保存在结构体topicIndexMap和postIndexMap里。注意postIndexMap的value是一个切片,是根据post.ParentId分类的,和topic的id相对应。
输入对应的ID,界面层controller会调用QueryPageInfo,然后接着调用逻辑层service的QueryPageInfo,新建了一个topicId为输入的ID的结构体,然后结构体调用Do方法。
Do方法里有三步
①检查输入的ID是否正确(是否大于0)
②准备信息,获得初始化完成的topic信息和post信息。
③把信息写到pageInfo里,然后返回。
最后回到server里,返回的信息保存在data,然后通过c.JSON序列化输出data到页面上。