在go中进行单元测试的案例分享
作者:coderyeah
这篇文章主要介绍了使用Go进行单元测试的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一. 基础介绍
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 math
func Sum(a, b int) int {
return a + b
}
创建一个名为 math_test.go 的测试文件,其中包含以下内容:
goCopy code// math_test.go
package math
import "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_case
import (
"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_case
import (
"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 测试通过")
}

以上就是在go中进行单元测试的案例分享的详细内容,更多关于go中进行单元测试的资料请关注脚本之家其它相关文章!
