23、Golang 教程 - 单元测试

在提交测试工程师代码前,先进行单元测试自检,没有问题,方可提交代码,对于模块或者函数需要自行写测试用例。

规则:

  1. 文件名必须以 _test.go 结尾。
  2. 如果是测试函数,必须以 Test 开头。

1. 函数测试

calc.go

 package main

// 加法
func add(a,b int) int {

    return a + b
}

// 减法
func sub(a,b int) int {

    return a - b
}

calc_test.go

 package main

import "testing"

// 必须是 Test 开头
func TestAdd(t *testing.T) {

    r := add(2,4)
    if r != 6 {

        // 测试异常抛出(类似于 fmt.Printf)
        // t.Fatalf("计算异常,原结果:%d,现结果:%d",6,r)
        t.Fatalf("add(2,4) err,expect:%d,actual:%d",6,r)
    }
    t.Logf("test is success")
}

func TestSub(t *testing.T) {

    r := sub(10,4)
    if r != 6 {

        t.Fatalf("sub(10,4) err,expect:%d,actual:%d",6,r)
    }
    t.Logf("test is success")
}

go testgo test -v 看测试信息

2. 结构体测试

student.go

 package main

import (
    "encoding/json"
    "io/ioutil"
)

type student struct {

    Name string
    Sex string
    Age int
}

// 信息保存文件
func (s *student) Save() (err error) {

    // 生成 json 格式
    data,err := json.Marshal(s) // 编码
    if err != nil {

        return
    }
    // 写入文件
    err = ioutil.WriteFile("stu.txt",data,0755)
    return
}

// 从文件读取信息
func (s *student) Load() (err error) {

    // 从文件读取
    data,err := ioutil.ReadFile("stu.txt")
    if err != nil {

        return
    }
    err = json.Unmarshal(data,s)    // 解码
    return
}

student_test.go

 package main

import "testing"

func TestSave(t *testing.T) {

    // 结构体实例
    stu := &student{

        Name: "zhangsan",
        Sex: "男",
        Age: 18,
    }
    // 测试保存
    err := stu.Save()
    if err != nil {

        t.Fatalf("save stu failed,err:%v",err)
    }
}

// 测试信息获取
func TestLoad(t *testing.T) {

    // 保存
    stu := &student{

        Name: "lisi",
        Sex: "女",
        Age: 20,
    }
    err := stu.Save()
    if err != nil {

        t.Fatalf("save stu failed,err:%v",err)
    }
    // 加载
    stu2 := &student{

     }
    err2 := stu2.Load()
    if err2 != nil {

        t.Fatalf("load stu failed,err:%v",err2)
    }
    // 验证比较数据
    if stu.Name != stu2.Name {

        t.Fatal("stu name different")
    }
    if stu.Sex != stu2.Sex {

        t.Fatal("stu sex different")
    }
    if stu.Age != stu2.Age {

        t.Fatal("stu age different")
    }
}

运行结果:

 D:\goproject\src\dev_code\test\main>go test -v
=== RUN   TestSave
--- PASS: TestSave (0.00s)
=== RUN   TestLoad
--- PASS: TestLoad (0.00s)
PASS
ok      dev_code/test/main      0.053s