当前位置: 首页 > news >正文

吉安网站建设收费三只松鼠营销策划书

吉安网站建设收费,三只松鼠营销策划书,北京微信公众号定制开发,设计师网站哪个好没有后端基础,学起来真是费劲,所以打算速刷一下,代码跟着敲一遍,有个印象,大项目肯定也做不了了,先把该学的学了,有空就跟点单体项目,还有该看的书.... 目录 🍌单元测试…

没有后端基础,学起来真是费劲,所以打算速刷一下,代码跟着敲一遍,有个印象,大项目肯定也做不了了,先把该学的学了,有空就跟点单体项目,还有该看的书....

目录

🍌单元测试

🌼assert

🌼覆盖率

🦊tips

🦊依赖

🦊文件处理

🍌Mock测试

🍌基准测试

🍉项目实战

🦂ER图

🦂分层结构

🦂组件工具

💪Repository

💪Service

💪Controller

💪Router

💤运行


🍌单元测试

规则

(1)测试文件以 _test.go 结尾

源代码与测试代码👇

(2)测试函数命名规范:func TestXxx(*testing.T)     Test紧挨着第一个字母大写👇

(3)初始化逻辑放到TestMain()里

🌼assert

导入开源网站的assert包,来进行判等,不等等测试操作👇

单元测试的样例👇

judge.go

package judgefunc JudgePassLine(score int16) bool {if score >= 60 {return true}return false
}

judge_test.go

package judgeimport ("github.com/stretchr/testify/assert""testing"
)func TestJudgePassLineTrue(t *testing.T) {isPass := JudgePassLine(70)assert.Equal(t, true, isPass)
}

Run一下👇

👇

👆解释

testing.T 是 Go 语言测试框架中的一个结构体类型,它提供了一组方法和属性用于管理和报告测试的结果。当你编写和运行测试函数时,测试框架会自动创建一个 testing.T 类型的实例,并将其传递给测试函数

🌼覆盖率

当我们写了单元测试后👇

覆盖率越高,代码的质量越有保证,那如何查看覆盖率呢👇

PS:发现个Goland小技巧,ctrl + z可以返回上一步代码,误删了也不要紧

要查看覆盖率,首先要切到对应目录下,视频中是👇

但我只会先cd到对应目录,结果一样👇

覆盖率意味着👇

judge.go,函数中一共3行有效代码,但是judge_test.go传入的70,只会运行前2行,所以覆盖率是 2 / 3

当我们需要100%覆盖率,只需要增加一个测试分支👇

func TestJudgePassLineFail(t *testing.T) {isPass := JudgePassLine(50)assert.Equal(t, true, isPass)
}

👆通过不断地,对各个分支的测试,保证了测试的完备性, 减少了BUG的产生

🦊tips

🦊依赖

DB:数据库database

Cache:Redis类似的组件

File:本地文件

👆三项属于项目中的强依赖

在单元测试中,一般有2个目标:(1)幂等  (2)稳定

(1)幂等:多次重复一个case的测试,结果一样

(2)稳定:单元测试之间是相互隔离的,即任何时间 / 函数下,都能够运行

而需要保证幂等 / 稳定,需要Mock机制,下面先讲文件处理

🦊文件处理

log

line11
line22
line33
line44
line55

ProcessFirstLine.go

package firstLineimport ("bufio""os""strings"
)// ReadFirstLine 从文件中读取第一行内容
func ReadFirstLine() string {open, err := os.Open("log") // 打开名为 "log" 的文件defer open.Close()          // 延迟关闭文件, 避免资源泄露if err != nil {return "" // 发生错误时返回空字符串}scanner := bufio.NewScanner(open) // 创建一个扫描器for scanner.Scan() {              // 循环遍历文件的每一行return scanner.Text() // 返回第一行内容}return "" // 文件为空时返回空字符串
}// ProcessFirstLine 处理第一行内容,将 "11" 替换为 "00"
func ProcessFirstLine() string {line := ReadFirstLine()                          // 调用 ReadFirstLine 函数获取第一行内容destLine := strings.ReplaceAll(line, "11", "00") // 将 "11" 替换为 "00"return destLine                                  // 返回替换后的结果
}

ProcessFirstLine_test.go

package firstLineimport ("github.com/stretchr/testify/assert""testing"
)// TestProcessFirstLine 是对 ProcessFirstLine 函数的单元测试
func TestProcessFirstLine(t *testing.T) {firstLine := ProcessFirstLine()      // 调用 ProcessFirstLine 函数assert.Equal(t, "line00", firstLine) // 使用断言验证结果是否符合预期
}

equal还是报错,但是点击这里还是可以PASS👇

解释

(1)bufio:高效读取数据的包

  • bufio.NewReader():创建一个新的Reader对象,用于读取数据。它接收一个io.Reader类型的参数,并使用默认大小的缓冲区
  • bufio.NewScanner():创建一个新的Scanner对象,用于对输入流进行扫描。Scanner可用于逐行读取文本等
  • Reader类型:它提供了各种方法来从输入流中读取数据,如ReadString()用于读取字符串,ReadBytes()用于读取字节切片等
  • Scanner类型:它提供了各种方法来解析输入流中的数据,如Scan()用于逐行读取文本,ScanBytes()用于逐个字节读取等
  • Scanner.Text():返回当前扫描的文本内容
  • Scanner.Scan():将扫描器移动到下一行,并返回是否还有更多行可供扫描

(2)os是一个提供与操作系统相关功能的包

  • os.Args:一个字符串切片,包含命令行参数
  • os.Exit(code int):终止当前程序的执行,并返回给定的错误码
  • os.Getwd():返回当前的工作目录的路径名
  • os.Chdir(dir string):将当前的工作目录更改为指定的目录
  • os.Mkdir(name string, perm FileMode) error:创建一个新目录
  • os.Open(name string) (*File, error):打开一个文件用于读取
  • os.Create(name string) (*File, error):创建一个文件用于写入
  • os.Remove(name string) error:删除指定的文件或目录
  • os.Rename(oldname, newname string) error:重命名(移动)文件或目录
  • os.Stdoutos.Stdinos.Stderr:标准输出、标准输入和标准错误输出的文件对象

但是,如果源文件被人篡改,那么测试文件,在特定场景下,也就无法运行,那如何Mock呢?👇

🍌Mock测试

开源Mock测试包 -- bouk/monkey: Monkey patching in Go (github.com)

打桩,即用函数A替换函数B👇

不得不吐槽一下,内部课贴的代码只贴部分,默认剩下部分你都会了,没学过也不能无中生有吧...真的觉得,每一点代码都力求自己得到对应输出,有点浪费时间了,先速通吧...

🍌基准测试

看了一遍...

🍉项目实战

描述

用例

👆用户浏览页面,主要展示2方面内容,一是Topic话题,一是PostList回帖的列表

🦂ER图

Entity Relationship Diagram

ER图由以下三个主要组成部分构成:实体,属性,关系。

🦂分层结构

数据层:数据Model,外部数据的增删改查

逻辑层:业务Entity

视图层:视图view,处理和外部的交互逻辑

🦂组件工具

(1)Gin高性能 go web 框架

gin-gonic/gin: Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin. (github.com)

(2)Go mod

go mod init

go get gopkg.in/gin-gonic/gin.v1@v1.3.0 --> 执行后,go.mod就有gin的依赖

💪Repository

index

两个索引👇

初始化话题数据索引👇

package main //入口import ("bufio"         //缓冲读取"encoding/json" //处理JSON数据"os"            //操作系统交互
)// 初始化主题索引映射
func initTopicIndexMap(filePath string) error {open, err := os.Open(filePath + "topic") //打开文件filePathif err != nil {                          //打开错误return err}scanner := bufio.NewScanner(open) //逐行扫描的工具topicTmpMap := make(map[int64]*Topic) //值是指向Topic结构体的指针for scanner.Scan() {text := scanner.Text() //保存每行内容var topic Topicif err := json.Unmarshal([]byte(text), &topic); err != nil {return err //json.Unmarshal将text解析为Topic结构体}topicTmpMap[topic.Id] = &topic //保存解析的结构体保}topicIndexMap = topicTmpMap //映射赋值给全局变量return nil
}

查询 

👇

package mainimport ("bufio"         //缓冲读取"encoding/json" //处理JSON数据"os"            //操作系统交互"sync"
)// 声明一个全局变量 topicIndexMap,用于存储主题索引映射
var topicIndexMap map[int64]*Topic// Topic 定义 Topic 结构体,包含了主题的属性
type Topic struct {Id         int64  `json:"id"`Title      string `json:"title"`Content    string `json:"content"`CreateTime int64  `json:"create_time"`
}// TopicDao 定义 TopicDao 结构体
type TopicDao struct {
}var (topicDao  *TopicDaotopicOnce sync.Once
)// NewTopicDaoInstance 函数返回一个 TopicDao 实例
func NewTopicDaoInstance() *TopicDao {topicOnce.Do(func() {topicDao = &TopicDao{}})return topicDao
}// QueryTopicById 方法根据 id 查询并返回对应的 Topic 实例
func (*TopicDao) QueryTopicById(id int64) *Topic {return topicIndexMap[id]
}// 初始化主题索引映射
func initTopicIndexMap(filePath string) error {open, err := os.Open(filePath + "topic") //打开文件filePathif err != nil {                          //打开错误return err}scanner := bufio.NewScanner(open)     //逐行扫描的工具topicTmpMap := make(map[int64]*Topic) //值是指向Topic结构体的指针for scanner.Scan() {text := scanner.Text() //保存每行内容var topic Topicif err := json.Unmarshal([]byte(text), &topic); err != nil {return err //json.Unmarshal将text解析为Topic结构体}topicTmpMap[topic.Id] = &topic //保存解析的结构体保}topicIndexMap = topicTmpMap //映射赋值给全局变量return nil
}

💪Service

定义两个实体👇

流程👇

流程代码👇

//Do 方法执行查询页面信息的流程,返回 PageInfo 实例和错误信息
func (f *QueryPageInfoFlow) Do() (*PageInfo, error) {if err := f.checkParam(); err != nil { //参数校验return nil, err //校验失败}if err := f.prepareInfo(); err != nil { //准备数据return nil, err}if err := f.packPageInfo(); err != nil { //组装实体return nil, err}return f.pageInfo, nil //返回 PageInfo 实例和 nil,操作成功
}

💪Controller

....看了一遍....

💪Router

💤运行

end....

http://www.yidumall.com/news/45094.html

相关文章:

  • 广东专业的网站制作网页制作代码html制作一个网页
  • 网站开发备案搜索引擎优化seo多少钱
  • 做网站日赚1万搜狗网站提交入口
  • 做视频直播网站需要多少资金seo搜索工具栏
  • ip分享网站石家庄百度关键词搜索
  • 做网站公司怎样网络推广优化培训
  • 工作方案的格式及范文电商seo搜索引擎优化
  • 做的比较好的小众网站企业品牌营销推广
  • 百度收录左侧带图片的网站百度销售系统登录
  • 专业做网站哪家强网站一般需要怎么推广
  • 怎么给公司做免费网站焊工培训内容有哪些
  • 网站设计技巧巧克力软文范例200字
  • 南宁住房和城乡建设委员会网站网站运营推广方案
  • 外国小孩和大人做网站北京网站排名推广
  • 订餐网站设计百度关键词搜索引擎排名优化
  • 做网站用软件智能网站推广优化
  • 现在哪些做进口商品的电商网站最吸引人的引流话术
  • 网站做联盟收入阿里指数数据分析平台
  • 包头市做网站制作网站模板
  • 微信公众平台开发流程seo系统培训哪家好
  • 网站建设需要哪些方面互动营销案例
  • 河南今日新闻最新头条10条seo知识点
  • 免费网站制作视频教程seo运营工作内容
  • 微信怎么制作网页系统优化软件推荐
  • 万州房地产网站建设互联网营销外包推广
  • 南京的网站建设公司白帽优化关键词排名seo
  • 做网站制作挣钱吗广州市网络seo外包
  • 计算机培训中心网站域名服务器查询
  • 哪里有做阿里网站的sem扫描电镜
  • 张掖艺能网站建设百度榜单