go语言开发基础43 - 之go语言里的单元测试文件编写

  • 当我们写好一段go语言的代码后,想测试下这段代码执行的结果是否符合预期时就可以用到单元测试,
  • 单元测试文件必须以:_test.go结尾
  • 写好单元测试文件后,到需要测试的目录下执行:go test查看测试结果(PASS就是正常的,FAILD是不正常的),-v显示自定义的输出信息,具体看下面示例

 

示例一:运算函数的单元测试示例:

一、运算代码(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"        // 单元测试文件需要导入testing包
)


func TestAdd(t *testing.T) { // 函数名必须以Test开头后面加测试的函数名(函数名首字母大写),变量和变量类型是固定的
    r := add(2, 4)
    if r != 6 {
        // 测试结果不符合预期用t.Fatalf来输出结果,t.Fatalf输出结果后会自动退出
        t.Fatalf("add(2,4) error, expect:%d, actual:%d", 6, r)
    }
    // 如果测试结果符合预期的输出信息
    t.Log("add function test : successfull.")
}

func TestSub(t *testing.T) { // 函数名必须以Test开头后面加测试的函数名(函数名首字母大写),变量和变量类型是固定的
    r := sub(2, 4)
    if r != -2 {
        // 测试结果不符合预期用t.Fatalf来输出结果,t.Fatalf输出结果后会自动退出
        t.Fatalf("sub(2,4) error, expect:%d, actual:%d", -2, r)
    }
    // 如果测试结果符合预期的输出信息
    t.Log("sub function test : successfull.")
}

 

示例二:结构体与数据写入文件代码的单元测试示例:

一、代码(student.go)如下:

package main

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

// 定义结构体
type student struct {
    Name string
    Age  int
    Sex  string
}

// 给结构体定义Save方法
func (p *student) Save() (err error) {
    data, err := json.Marshal(p)
    if err != nil {
        return
    }
    // ioutil.WriteFile:直接写到文件里了
    err = ioutil.WriteFile("f:/stu.dat", data, 0755)
    return
}

// 给结构体定义Load方法
func (p *student) Load() (err error) {
    data, err := ioutil.ReadFile("f:/stu.dat")
    if err != nil {
        fmt.Println("read file err:", err)
        return
    }
    err = json.Unmarshal(data, p)
    if err != nil {
        fmt.Println("Unmarshal data err:", err)
        return
    }
    return
}

二、单元测试文件(student_test.go)内容如下

package main

import "testing"      // 单元测试文件需要导入testing包

func TestSave(t *testing.T) {
    // 示例化一个student类型的变量
    stu := &student {
        Name: "stu01",
        Age: 22,
        Sex: "man",
    }

    // 执行student类型变量的Save方法
    err := stu.Save()
    // 判断是否有错误
    if err != nil {
        t.Fatalf("stu save failed: %s", err)
    }
    // 正常提示
    t.Logf("stu save successFull")
    return
}

func TestLoad(t *testing.T) {
    // 实例化一个student类型的变量
    stu := &student {
        Name: "stu01",
        Age: 22,
        Sex: "man",
    }

    // 执行save方法 
    err := stu.Save()
    // 判断save方法是否有错误
    if err != nil {
        t.Fatalf("stu save failed: %s", err)
    }
    // 重新实例化一个student类型的变量
    stu1 := &student{}
    // 执行load方法
    err = stu1.Load()
    // 判断load方法是否有错误
    if err != nil {
        t.Fatalf("stu1 loading data failed: %s", err)
    }

    // 判断写入的student类型变量和读取的student类型变量的字段值是否一致
    if stu.Name != stu1.Name {
        t.Fatalf("loading stu Name failed")
    }
    if stu.Age != stu1.Age {
        t.Fatalf("loading stu Name failed")
    }
    if stu.Sex != stu1.Sex {
        t.Fatalf("loading stu Name failed")
    }
}

 

 

posted @ 2020-08-12 17:50  欧-阳  阅读(353)  评论(0)    收藏  举报