Golang语言自带单元测试,使用时只需要按照提供的命名规则以及导入testing 包就能开始允许需要测试的方法。如下:
// 编写一个Monster结构体
package model
import (
"encoding/json"
"os"
"fmt"
"errors"
"bufio"
"io"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Skill string `json:"skill"`
}
// 提供一个工厂方法,创建Monster指针对象
func NewMonster(name string, age int, skill string) *Monster {
return &Monster {
Name : name,
Age: age,
Skill : skill,
}
}
// 通过序列化monster
func (monster *Monster) Store() error {
// 拿到序列化结果
data, err := json.Marshal(monster)
if err != nil {
fmt.Println("Json serialized error, err=", err)
return errors.New("Json serialized error")
}
// 创建一个文件
filePath := "E:/serialized.txt"
file, err2 := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0744)
if err2 != nil {
fmt.Println("File create error, ", err)
return errors.New("File create error")
}
// 使用defer关闭资源
defer file.Close()
// 使用bufio来写入文件,也可以使用io/ioutil 包中的
// ioutil.WriteFile(file2Path, content, 0744) 来写入文件内容。
writer := bufio.NewWriter(file)
str := string(data) + "\r
"
writer.WriteString(str)
writer.Flush()
fmt.Println("File content writer file success.")
return nil
}
// 通过读取文件并反序列化为 monster结构体
func (monster *Monster) Restore(filePath string) error {
// 打开指定的文件
file, err := os.Open(filePath)
if err != nil {
fmt.Println("File open error=", err)
return errors.New("File open error")
}
defer file.Close()
// 通过缓冲区来读取文件。
// 同时也可以通过io/ioutil.ReadFile() 来读取文件,如果大文件不建议使用该函数
reader := bufio.NewReader(file)
temp := ""
for {
str, err := reader.ReadString('
')
if err == io.EOF {
break
}
temp += str
}
fmt.Println("Read file result : ", temp)
// 反序列化为monster实力
err2 := json.Unmarshal([]byte(temp), &monster)
if err2 != nil {
fmt.Println("Unserialized error=", err2)
return errors.New("Unserialized error")
}
fmt.Println("Unserialized result=", monster)
return nil
}
上面构造体中,提供了Store()和Restore()两个方法,一个是将monster对象序列化之后保存到文件中,后者则是读取该文件,然后反序列化为monster结构体。
命名规则 xxx_test.go ,xxx表示需要测试的文件名。 单元测试中的函数命名规则: func TestXxx(t *testing.T) , Test为函数名固定写法,Xxx首字符必须大写,一般是需要测试的方法名称。
package model
import (
"testing"
)
// 测试Monster中的Store方法
func TestStore(t *testing.T) {
// 通过工厂方法创建Monster实例
monster := NewMonster("Mic", 300, "Just cry...")
t.Logf("Create monster= %v
", monster)
// 调用Store方法
err := monster.Store()
if err != nil {
t.Fatalf("Monster.Store() testing failed.")
}
t.Logf("Monster.Store() testing success.")
}
// 测试Monster中的Restore方法
func TestRestore(t *testing.T) {
monster := Monster{}
filePath := "E:/serialized.txt"
// 传入需要读取文件路径
err := monster.Restore(filePath)
if err != nil {
t.Fatalf("Monster.Restore() testing failed.")
}
t.Logf("Monster.Restore() testing success.")
}
go test : 只打印不成功的日志
go test -v : 打印所有日志,包括方法中成功的日志或者不成功的日志
go test -v xxx_test.go xxx.go
go test -v -test.run TestRestore
表示只测试叫TestRestore的单元测试方法
留言与评论(共有 0 条评论) “” |