项目测试与实践 | 青训营笔记

110 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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
}