GO语言入门指南3 | 青训营

103 阅读2分钟

3.1 测试

层级从上到下覆盖率逐步上升,成本下降

回归测试

集成测试

3.1 单元测试

WechatIMG79.jpg

测试规则:

  • 所有测试文件以_test.go结尾

  • func TestXxx(*testing.T)

  • 初始化逻辑放在 TestMain

  • go test [flags] [packages] 运行

  • assert 包:验证(assert.Equal()

3.1.2 覆盖率

条件覆盖指在测试时运行被测程序后,所有判断语句中每个条件的可能取值(真值和假值)出现过的比率:

条件覆盖率=(条件操作数值至少被评价一次的数量)/(条件操作数值的总数)

func TestJudgePassLineTrue(t *testing.T){
    isPass := JudgePassLine(score: 70)
    assert.Equal(t,true, isPass)
}
func TestJudgePassLineFail(t *testing.T){
    isPass := JudgePassLine( score: 50)
    assert.Equal(t,false,isPass)
}
func JudgePassLine(score int16) bool {
    if score ≥ 60{
        return true
     }
    return false
}
//只有第一个函数时覆盖率是66.7%
//覆盖率100%

3.2 依赖

WechatIMG84.jpg

func ReadFirstLine() string {
    open, err := os.Open("log")
    defer open.Close()
    if err ≠ nil {
        return ""
    }
    scanner := bufio.NewScanner(open)  //创建一个scanner,将open与scanner对象关联起来
    for scanner.Scan() {
        return scanner.Text()  //逐行读取
    }
    return ""  //否则返回空字符
}
func ProcessFirstLine() string {
    Line := ReadFirstLine()
    destLine := strings.ReplaceAll(line, "11""00")   //将00代替11
    return destLine
func TestProcessFirstLine(t*testing.T){    //
    firstLine := ProcessFirstLine()
    assert.Equal(t,"line00",firstLine)

3.3 Mock

通过“虚拟”代码替换掉依赖的方法和资源 WechatIMG86.jpg

//用Mock替换了ReadFirstLine函数,不再依赖原文件,
func TestProcessFirstLineWithMock(t *testing.T){
    monkey.Patch(ReadFirstLine,func() string {
    return "line110"  
})   // func() string{return "line110"} 是匿名函数
    defer monkey.Unpatch(ReadFirstLine)
    Line := ProcessFirstLine()
    assert.Equal(t,"line000",Line)
}

匿名函数

func(a, b int) int {
    return a + b
}(3, 4)   //后面的括号是传入的参数

3.4 基准测试 Benchmark

基准测试是一种测量和评估软件性能指标的活动。

//随机服务器

import (
"math/rand"
)
var ServerIndex [10]int
func InitServerIndex() {
    for i := 0; i< 10; i++ {
        ServerIndex[i] = i+100
    }
}

func Select() int {
    return ServerIndex[rand.Intn(10)]  //设定随机整数,上限是10  // 用fastrand并行效率更高
}

// 基准测试

func BenchmarkSelect(b *testing.B){
    InitServerIndex()
    b.ResetTimer()  //定时器重置
    for i:= 0; i<b.N; i++ {    
        Select()    //循环多次调用函数计时
    }
}
func BenchmarkSelectParallel(b *testing.B) {  
    InitServerIndex(
    b.ResetTimer()
    b.RunParallel(func(pb *testing.PB) {  //并行调用函数并计时
        for pb.Next() {
            Select() 
        }
    })
}

4.1 实战项目

  • 需求描述:社区话题页面
    • 展示话题(标题,文字描述)和回站列表
    • 暂不考虑前端页面实现,仅仅实现一个本地web服务
    • 话题和回帖数据用文件存储
  • 需求用例

911690553342_.pic.jpg

  • E-R图

WechatIMG92.jpg

  • 分层结构

WechatIMG93.jpg

  • 组件工具