go中如何进行单元测试案例

一. 基础介绍

1. 创建测试文件

  • 测试文件通常与要测试的代码文件位于同一个包中。
  • 测试文件的名称应该以 _test.go 结尾。例如,如果你要测试的文件是 math.go,那么测试文件可以命名为 math_test.go

2. 编写测试函数

  • 测试函数必须导入 testing 包。
  • 每个测试函数必须以 Test 开头,后跟一个首字母大写的名字,例如 TestSumTestSubtract
  • 测试函数的签名应该接受一个指向 testing.T 类型的指针:func TestXxx(t *testing.T) { ... }

3. 使用 t 对象进行断言和日志记录

  • t 对象用于记录测试信息和控制测试流程。
  • 使用 t.Errort.Errorf 报告失败,但继续执行当前测试。
  • 使用 t.Fatalt.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 testgo test -v 来执行测试。

二. 综合案例

  1. 结构

在这里插入图片描述

  1. 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
    }
    
    
  2. 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 测试通过")
    }
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/325191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HIve项目入门 环境部署遇到的问题及解决方案

环境布置的步骤建议是jdk, hadoop hive这几个分别去下载,参考以下几个安装教程: 【主要参考:傻瓜式教程】Windows下安装Hive MySQL版【附安装Hadoop教程】全网最详细的图文教程 【有一些补充的内容】:Windows下安装Hive 遇到的几个…

2024.1.16每日一题

LeetCode 2719.统计整数数目 2719. 统计整数数目 - 力扣(LeetCode) 题目描述 给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数: num1 &l…

QT 原生布局和QML的区别

一、QML 与 Qt Quick的区别 1.1 从概念上区分 为了更精确地对两者进行说明,先看助手对 QML 的描述: QML is a user interface specification and programming language. QML 是一种用户界面规范和标记语言,允许开发人员和设计师创建高性能、流…

招生官怒批ChatGPT文书质量“缺少灵魂”

ChatGPT无疑是最近两年留学届的热门话题,也成为了不少留学生再也离不开的万能工具,从总结文献、润色论文、给教授写email似乎无所不能。甚至还有不少同学在考虑直接提交ChatGPT生成的文书。 那么ChatGPT生成的文书质量高吗?各大高校对于学生…

【NI国产替代】PXI-6254,32 AI(16位,1 MS/s),48 DIO,PXI多功能I/O模块

32 AI(16位,1 MS/s),48 DIO,PXI多功能I/O模块 PXI-6254提供模拟输入、关联数字I/O、两个32位计数器/定时器以及模拟和数字触发。该设备为从实验室自动化、研究、设计验证/测试到制造测试等各种应用提供了低成本的可靠D…

基于ssm的疫苗预约系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疫苗预约系统软件来发挥其高效地信息处理的作用&#xff0c…

Vue-API

$parent 和 $children $parent 父传子--在子组件中使用,放在计算属性、生命周期中: $children 子传父--方法中使用: $nextTick: $ref: 操作dom $set、$delete:

Docker-01-安装基础命令

Docker-01-安装&基础命令 文章目录 Docker-01-安装&基础命令一、Docker是什么?二、安装Docker①:卸载旧版②:配置Docker的yum库③:安装Docker④:启动和校验⑤:配置镜像加速01:注册阿里云…

第二证券:旅游股大涨 “预热”春节黄金周

在淄博烧烤热、哈尔滨冰雪热火爆出圈后,希望能接住文旅下一波“泼天富贵”的各地文旅局各出奇招并“卷”出新高度,被各地网友谈论“杀疯了”。 其间,A股游览概念股迎来一波集体上涨,成为不少出资者的重视热点,而行将到…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中,人和机器之间的时间和空间的交织和共同作用。 在时间维度上,人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

Java 使用 EasyExcel 爬取数据

一、爬取数据的基本思路 分析要爬取数据的来源 1. 查找数据来源:浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息:复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件:FeHelper&a…

Dockerfile: CMD与ENTRYPOINT区别

CMD和ENTRYPOINT的作用 CMD和ENTRYPOINT这两个命令,我接触到的是用在了Dockerfile中用于构建容器。 CMD:The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容…

力扣hot100 多数元素 摩尔投票

Problem: 169. 多数元素 文章目录 思路解题方法复杂度💖 Code👨‍🏫 参考代码 思路 👨‍🏫 参考题解 👨‍🏫 参考图解 解题方法 描述你的解题方法 复杂度 时间复杂度: 添加时间复杂度, 示例…

成都爱尔谭娇解读眼睑松弛“提拉”要趁早,避免遮挡损害视力!

眼皮耷拉无力没法抬起,仿佛永远没睡醒。 怎么使力都没用眼睛就是睁不开, 甚至两只眼睛一大一小不对称, 这种时候要警惕一种病症“上睑下垂”! 早期上睑下垂症状并不明显,很容易被忽视,但眼睑下垂时间久了可能会对视力产…

ArcGIS Pro 拓扑编辑和常见一些拓扑错误处理

7.4 拓扑编辑 拓扑编辑也叫共享编辑,多个数据修改时,一块修改,如使用数据:chp7\拓扑检查.gdb,数据集DS下JZX、JZD和DK,加载地图框中,在“地图”选项卡下选择“地图拓扑”或“ds_Topology(地理数据库)”&…

23年全球数字经济发展如何?这本《白皮书》告诉你答案丨附下载

这一年,全球主要国家优化数字经济政策布局, 促进数字产业化创新升级、发展数字基础设施; 这一年,全域国际合作让“命运共同体” 构建见成效, 全球经济多极化趋势加强,中国坐拥Top1数字市场; …

Java NIO (一)简介

1 NIO简介 在1.4版本之前,Java NIO类库是阻塞IO,从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。New IO类库的目的 就是要让Java支持非阻塞IO。 Java NIO类库包含三个核心组件: …

go服务分片下载文件+分片上传文件

目录 先看效果 全代码实现 注意 完整输出 如有帮助,欢迎留下足迹哦! 先看效果 待上传的源文件(这里以一个140多M的为例) 上传后服务端下载完成的文件(result.exe): 全代码实现 定义主要路…

WebRTC视频会议/视频客服系统EasyRTC进入会议室密码验证的开发与实现

基于WebRTC技术的EasyRTC视频会议系统,建设目标是让用户随时随地、快捷方便地进行视频会议,并根据行业需求有针对性地提供多样化、个性化功能,该系统是覆盖全球的实时音视频开发平台,支持一对一、一对多等视频通话,极大…

第二证券:行业术语解读:CPO概念是什么意思?

cpo概念又名共封装光学概念,它是指把硅光模块和CMOS芯片用高级封装的方法耦合在背板PCB上,从而在成本、功耗和尺度上都进一步提升数据中心使用中的光互联技能等相关上市公司组成的概念。 概念股,并不特指于某一支股,而是一个选股话…