在go中进行单元测试的案例分享

 更新时间:2024年01月16日 10:34:23   作者: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中进行单元测试的资料请关注脚本之家其它相关文章!

相关文章

  • GoFrame错误处理常用方法及错误码使用示例

    GoFrame错误处理常用方法及错误码使用示例

    这篇文章主要为大家介绍了GoFrame错误处理常用方法及错误码使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 详解golang中的闭包与defer

    详解golang中的闭包与defer

    闭包一个函数与其相关的引用环境组合的一个实体,其实可以理解为面向对象中类中的属性与方法,这篇文章主要介绍了golang的闭包与defer,需要的朋友可以参考下
    2022-09-09
  • go语言题解LeetCode1122数组的相对排序

    go语言题解LeetCode1122数组的相对排序

    这篇文章主要为大家介绍了go语言题解LeetCode1122数组的相对排序,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • go日志系统logrus显示文件和行号的操作

    go日志系统logrus显示文件和行号的操作

    这篇文章主要介绍了go日志系统logrus显示文件和行号的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Go并发控制WaitGroup的使用场景分析

    Go并发控制WaitGroup的使用场景分析

    WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束,本文通过具体场景结合实际例子给大家介绍使用WaitGroup控制的实现方法,感兴趣的朋友跟随小编一起看看吧
    2021-07-07
  • golang1.16新特性速览(推荐)

    golang1.16新特性速览(推荐)

    这篇文章主要介绍了golang1.16新特性速览,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 浅谈一下前端http与https有什么区别

    浅谈一下前端http与https有什么区别

    这篇文章主要介绍了浅谈一下前端http与https有什么区别,现今大部分的网站都已经使用了 https 协议,那么https对比http协议有哪些不同呢,需要的朋友可以参考下
    2023-04-04
  • gin通过go build -tags实现json包切换及库分析

    gin通过go build -tags实现json包切换及库分析

    这篇文章主要为大家介绍了gin通过go build -tags实现json包切换及库分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语言中的switch用法实例分析

    Go语言中的switch用法实例分析

    这篇文章主要介绍了Go语言中的switch用法,实例分析了switch的功能及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go 语言中程序编译过程详解

    Go 语言中程序编译过程详解

    本文旨在深入探讨Go语言的编译机制和最新的模块管理系统——Go Modules,通过详细的示例和步骤,我们将演示从简单的 “Hello World” 程序到使用第三方库的更复杂项目的开发过程,感兴趣的朋友跟随小编一起看看吧
    2024-05-05

最新评论