这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
测试分为回归测试, 集成测试和单元测试三部分
其中单元测试是在测试开发阶段进行
学习Mock测试的用例
func ReadFirstLine() string {
open, err := os.Open("log")
defer open.Close()
if err != nil {
return ""
}
scanner := bufio.NewScanner(open)
for scanner.Scan() {
return scanner.Text()
}
return ""
}
func ProcessFirstLine() string {
line := ReadFirstLine()
destLine := strings.ReplaceAll(line, "11", "00")
return destLine
}
学习使用单元测试
func TestMain(m *testing.M) {
repository.Init("../data/")
os.Exit(m.Run())
}
func TestQueryPageInfo(t *testing.T) {
pageInfo, _ := QueryPageInfo(1)
assert.NotEqual(t, nil, pageInfo)
assert.Equal(t, 5, len(pageInfo.PostList))
}
项目实践部分
需求分析阶段
浏览消费用户
User -> Topic User -> PostList
通过对本地数据的读取和插入
来模拟场景
var (
topicIndexMap map[int64]*Topic
postIndexMap map[int64][]*Post
rwMutex sync.RWMutex
)
func Init(filePath string) error {
if err := initTopicIndexMap(filePath); err != nil {
return err
}
if err := initPostIndexMap(filePath); err != nil {
return err
}
return nil
}
func initTopicIndexMap(filePath string) error {
open, err := os.Open(filePath + "topic")
if err != nil {
return err
}
scanner := bufio.NewScanner(open)
topicTmpMap := make(map[int64]*Topic)
for scanner.Scan() {
text := scanner.Text()
var topic Topic
if err := json.Unmarshal([]byte(text), &topic); err != nil {
return err
}
topicTmpMap[topic.Id] = &topic
}
topicIndexMap = topicTmpMap
return nil
}
func initPostIndexMap(filePath string) error {
open, err := os.Open(filePath + "post")
if err != nil {
return err
}
scanner := bufio.NewScanner(open)
postTmpMap := make(map[int64][]*Post)
for scanner.Scan() {
text := scanner.Text()
var post Post
if err := json.Unmarshal([]byte(text), &post); err != nil {
return err
}
posts, ok := postTmpMap[post.ParentId]
if !ok {
postTmpMap[post.ParentId] = []*Post{&post}
continue
}
posts = append(posts, &post)
postTmpMap[post.ParentId] = posts
}
postIndexMap = postTmpMap
return nil
}
学习mvc分层结构来进行项目的分层
其中controller层是对外声明接口
调用service层也就是业务层中的方法 平常我们写的一些业务都在service中进行封装
service再继续调用dao层中获取的数据
dao层可以连接数据库或其他资源,来获取相应的数据
并且学习使用了go-snowflake工具来生成不唯一的id来传入data中
func (f *PublishPostFlow) publish() error {
post := &repository.Post{
ParentId: f.topicId,
Content: f.content,
CreateTime: time.Now().Unix(),
}
s, err := snowflake.NewSnowflake(int64(0), int64(0))
if err != nil {
return err
}
id := s.NextVal()
post.Id = id
if err := repository.NewPostDaoInstance().InsertPost(post); err != nil {
return err
}
f.postId = post.Id
return nil
}