go-单元测试
基本介绍
- golang中自带有一个轻量级的测试架构
testing 和自带的go test 命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对响应函数的测试用例,也可以基于该框架写想用的压力测试用例,可用于解决以下问题:
- 确保每个函数是可运行的,并且运行结果是正确的
- 确保写出来的代码性能是好的
- 单元测试能及时的发现程序设计或实现的逻辑错误,是问题尽早暴露,便于问题的丁文解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下保持稳定
package main
import (
"testing"
)
func TestAddUpper(t *testing.T) {
res := addUpper(10)
if res != 55 {
t.Fatalf("addUpper(10) error!")
}
t.Logf("addUpper(10) ok")
}
func TestSub(t *testing.T) {
res := sub(10, 3)
if res != 5 {
t.Fatalf("sub(10,3) error!")
}
t.Logf("sub(10,3) ok")
}
package main
func addUpper(n int) int {
res := 0
for i := 0; i <= n; i++ {
res += i
}
return res
}
func sub(a, b int) int {
return a - b
}
注意
- 测试用例文件名以
xxx_test.go 表示 - 测试用例函数必须是
TestXxx(t *Testing.T) - TestXxx的形参必须是
t *Testing.T - 一个测试用例文件中,可以有多个测试用例函数
- 运行测试用例的指令:
go test ,若正确运行,无日志,错误时,会输出日志go test -v ,不管运行正确还是错误,都会输出日志 - 当出现错误时,可以使用
t.Fatalf() 来格式化输出错误信息,并退出程序 t.Logf() 方法可以输出相应的日志- 测试用例函数,并没有放在main函数中,也会执行
- PASS表示测试用例运行成功,FAIL表示测试用例运行失败
- 可以只测试单个文件
- 可以测试单个方法
案例
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Skill string `json:"skill"`
}
func (monster *Monster) Store() {
filePath := "src/go_code/Study_go/Study_go_fifteen/demo02/file/monster.txt"
file, err2 := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0666)
if err2 != nil {
fmt.Printf("err2: %v\n", err2)
return
}
defer file.Close()
fmt.Printf("monster: %v\n", monster)
strjson, err := json.Marshal(monster)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
writer := bufio.NewWriter(file)
str := string(strjson)
fmt.Printf("str: %v\n", str)
_, err3 := writer.WriteString(str)
if err3 != nil {
fmt.Printf("err3: %v\n", err3)
return
}
writer.Flush()
}
func (monster *Monster) ReStore() Monster {
filePath := "src/go_code/Study_go/Study_go_fifteen/demo02/file/monster.txt"
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("err: %v\n", err)
}
defer file.Close()
reader := bufio.NewReader(file)
strjson, err2 := reader.ReadString('\n')
if err2 != nil {
fmt.Printf("err2: %v\n", err2)
}
err3 := json.Unmarshal([]byte(strjson), &monster)
if err3 != nil {
fmt.Printf("err3: %v\n", err3)
}
return *monster
}
import (
"fmt"
"testing"
)
func TestStore(t *testing.T) {
var monster Monster = Monster{"tom", 222, "xxxxxxx"}
monster.Store()
}
func TestReStore(t *testing.T) {
var monster Monster
monster = monster.ReStore()
if monster.Name != "tom" {
t.Fatalf("error")
}
t.Logf("success")
fmt.Printf("monster: %v\n", monster)
}
import (
"fmt"
"go_code/Study_go/Study_go_fifteen/demo02/monster"
)
func main() {
var m monster.Monster = monster.Monster{
Name: "tom",
Age: 22,
Skill: "xxxxxxx",
}
fmt.Printf("m: %v\n", m)
m.Store()
m.ReStore()
fmt.Printf("m: %v\n", m)
}
|