一. 基础介绍
1. 创建测试文件
- 测试文件通常与要测试的代码文件位于同一个包中。
- 测试文件的名称应该以
_test.go
结尾。例如,如果你要测试的文件是math.go
,那么测试文件可以命名为math_test.go
。
2. 编写测试函数
- 测试函数必须导入
testing
包。 - 每个测试函数必须以
Test
开头,后跟一个首字母大写的名字,例如TestSum
或TestSubtract
。 - 测试函数的签名应该接受一个指向
testing.T
类型的指针:func TestXxx(t *testing.T) { ... }
。
3. 使用 t
对象进行断言和日志记录
t
对象用于记录测试信息和控制测试流程。- 使用
t.Error
或t.Errorf
报告失败,但继续执行当前测试。 - 使用
t.Fatal
或t.Fatalf
报告失败并立即终止当前测试。
4. 运行测试
- 在命令行中,进入包含测试文件的目录。
- 执行
go test
命令运行所有测试,或使用go test -v
以详细模式运行(打印每个测试的名字和运行状态)。 - 使用
go test -run
加上正则表达式来运行特定的测试。例如,go test -run TestSum
仅运行名为TestSum
的测试。
示例
假设有一个名为 math.go
的文件,其中定义了一个函数 Sum
:
goCopy code// math.go
package mathfunc Sum(a, b int) int {return a + b
}
创建一个名为 math_test.go
的测试文件,其中包含以下内容:
goCopy code// math_test.go
package mathimport "testing"func TestSum(t *testing.T) {total := Sum(5, 5)if total != 10 {t.Errorf("Sum was incorrect, got: %d, want: %d.", total, 10)}
}
然后在终端中运行 go test
或 go test -v
来执行测试。
二. 综合案例
-
monster.go
package test_caseimport ("encoding/json""fmt""os" )type Monster struct {Name string `json:"name"`Age int `json:"age"`Skill string `json:"skill"` }// Store 将其序列化保存为文件 func (m *Monster) Store() bool {data, err := json.Marshal(m)if err != nil {fmt.Println("json parse Monster err ", err)return false}// 写入文件err = os.WriteFile("d:/monster.txt", data, 0666)if err != nil {fmt.Println("write file err ", err)return false}return true }// ReStore 反序列化文件 func (m *Monster) ReStore() bool {data, err := os.ReadFile("d:/monster.txt")if err != nil {fmt.Println("read file err ", err)return false}// 将读取的数据进行反序列化err = json.Unmarshal(data, m)if err != nil {fmt.Println("json Unmarshal err ", err)return false}return true }
-
monster_test.go
package test_caseimport ("testing" )func TestStore(t *testing.T) {monster := &Monster{Name: "小狐狸",Age: 200,Skill: "魅惑",}res := monster.Store()if !res {t.Fatalf("TestStore fail,expected is %v,but got %v", true, res)}t.Logf("TestStore 测试通过")}func TestReStore(t *testing.T) {monster := &Monster{} //空的结构体res := monster.ReStore() // 反序列化后结构体就有数据if !res {t.Fatalf("TestReStore fail,expected is %v,but got %v", true, res)}if monster.Name != "小狐狸" {t.Fatalf("TestStore fail,expected monster.Name is %v,but got %v", "小狐狸", monster.Name)}t.Logf("TestStore 测试通过") }