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") } }

浙公网安备 33010602011771号