Golang单元测试详解:单元测试的基本使用方法

news2024/11/15 11:16:55

Golang 单元测试

Golang 中的单元测试是使用标准库 testing 来实现的,编写一个单元测试是很容易的:

·创建测试文件:在 Go 项目的源代码目录下创建一个新的文件(和被测代码文件在同一个包),以 _test.go 为后缀名。例如,要测试net包中 dial.go 中的方法,在 net 包中创建一个名字为 dial_test.go 文件。

· 导入 testing 包:在测试文件中导入testing包,以使用相关的的函数和工具。

· 编写测试函数:在测试文件中,编写一个以 Test 为前缀的函数,后面跟上一个或多个字符或字符组合来标识测试用例的名称(一般使用被测的函数名称),参数必须是 t *testing.T。

· 编写测试代码:如果认为测试不通过,当被测程序功能与预期不符,调用 t.Error 或 t.Errorf 方法记录错误;如果出现了使测试无法继续进行的错误,调用tFatal 和 t.Fatalf;如果测试函数体正常运行结束,没有异常,则测试通过。

以 json 格式校验工具

https://github.com/luduoxin/json-validator-go 为例,validator包中的 scanner.go 文件中的关键函数 Valid 用于校验给定字符串是否 json 格式,对应的单元测试文件为 scanner_test.go,里面的测试函数为 TestValid。scanner_test.go 的源代码如下:

package validator
  import "testing"
  var validTests = []struct {
  data string
  ok   bool
  }{
  {`foo`, false},
  {`}{`, false},
  {`{]`, false},
  {`123`, false},
  {`123.5`, false},
  {`0.5`, false},
  {`true`, false},
  {`false`, false},
  {`null`, false},
  {`[1,2,3]`, false},
  {`["a","b","c"]`, false},
  {`{"foo":bar}`, false},
  {`[{"foo":"bar"},]`, false},
  {`{}`, true},
  {`[]`, true},
  {`[{}]`, true},
  {`{"foo":"bar"}`, true},
  {`{"foo":"bar","bar":{"baz":["qux"]}}`, true},
  {`[{"a":"[\"c\":\"d\"]"}]`, true},
  {`[{"a":[]}]`, true},
  {` {"a":"b"}`, true},
  {` {"a":"b"} `, true},
  {`{"a":"b"} `, true},
  {`{"a": "b"} `, true},
  }
  func TestValid(t *testing.T) {
  for _, tt := range validTests {
  if ok := Valid([]byte(tt.data)); ok != tt.ok {
  t.Errorf("Valid(%#q) = %v, want %v", tt.data, ok, tt.ok)
  }
  }
  }

这个源代码相关来说比较复杂,因为测试的数据种类比较多,如果是只想简单测试一下,代码如下:

 package validator
  import "testing"
  func TestValid(t *testing.T) {
  str := `{"a": "b"}`
  if ok := Valid([]byte(str)); !ok {
  t.Errorf("Valid(%#q) = %v, want %v", str, ok, true)
  }
  }

运行单元测试用例

使用 go test 命令可以运行单元测试用例,使用方法如下:

# 执行当前目录下的全部测试用例,不递归子目录中的测试用例
  go test .
  # 执行当前目录下的全部测试用例,递归子目录中的测试用例
  go test ./...
  # 执行当前目录下的全部测试用例并显示测试过程中的日志内容,不递归子目录中的测试用例
  go test -v .
  # 执行当前目录下的全部测试用例并显示测试过程中的日志内容,递归子目录中的测试用例
  go test -v ./...
  # 执行指定的测试用例
  go test -v . -test.run '^TestValid$'

启动命令行,切换到 json-validator-go 项目的 validator 文件夹下,运行全部测试用例:

 $ go test -v .
  === RUN   TestValid
  --- PASS: TestValid (0.00s)
  PASS
  ok      github.com/luduoxin/json-validator-go/validator

运行指定测试用例 TestValid :

 $ go test -v . -test.run '^TestValid$'
  === RUN   TestValid
  --- PASS: TestValid (0.00s)
  PASS
  ok      github.com/luduoxin/json-validator-go/validator 

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能优化 - 前端性能监控和性能指标计算方式

性能优化 - 前端性能监控和性能指标计算方式 前言一. 性能指标介绍1.1 单一指标介绍1.2 指标计算① Redirect(重定向耗时)② AppCache(应用程序缓存的DNS解析)③ DNS(DNS解析耗时)④ TCP(TCP连接耗时)⑤ TTFB(请求响应耗时)⑥ Trans(内容传输耗时)⑦ DOM(DOM解析耗时) 1.3 FP(f…

项目接入星火认知大模型!!!

项目接入星火认知大模型demo 导言 随着国内的语言大模型不断兴起,科大讯飞的星火大模型,阿里的通义千问,百度的文心一言等。 这些大模型给我提供了很好的便利 同时星火大模型提供了 开放api功能 使得我们能够将大模型接入到我们自己的项目当…

又一“邪恶版”ChatGPT出现,专为网络犯罪而生

最近,Hackread 分享了一个恶意聊天机器人 WormGPT 的详细信息,该聊天机器人是为帮助网络犯罪分子进行非法活动而创建的。现在,暗网上又出现了一个名为 FraudGPT 的聊天机器人。这是一个基于订阅的人工智能聊天机器人,可以为网络犯…

【AI可视化---04】点亮数据之旅:发现Matplotlib的奇幻绘图世界!用Python挥洒数据音符的创意乐章——这四篇就够了!

晴川历历汉阳树,芳草萋萋鹦鹉洲。 日暮乡关何处是,烟波江上使人愁。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工…

2023Java 岗面试,进互联网大厂必备 Java 面试八股文真题解析

前言 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 很多时候,面试官问的问题会和自己准备的“题库”中的问题不太一样,即使做了复盘,下次面试还是不知道该从何处下手。 为此鄙人软磨硬泡才把阿里 P8 专门归纳…

合并两个有序链表——力扣21

题目描述 法一 递归 class Solution { public:ListNode* mergeTwoLists(ListNode *l1, ListNode*l2){if(l1 nullptr){return l2;} else if (l2nullptr){return l1;} else if (l1->val<l2->val){l1->next mergeTwoLists(l1->next, l2);return l1;} else {l2-&g…

常用的快捷键 -VTK快捷键

按键W --------------------- 网格显示模型 按键S --------------------- 曲面显示模型 按键P --------------------- 显示模型包围框 按键F --------------------- 放大到选取点 按键R --------------------- 重置相机视图 按键A ---------------------- 切换演员模式 按…

SSM框架 基础

1.数据库 2.工程 3.pom 4.web.xml 5.spring配置文件头部 6.实体类 7.StudentMapper接口 8. StudentMapper.xml 9.StudentService 10. StudentServiceImpl 11.StudentController 实战 查询所有 StudentMapper StudentService StudentServiceImpl StudentMapper.xml Stude…

使用jmeter进行接口测试

jmeter介绍 JMeter是Apache基金会Jakarta上的一个纯java开源项目&#xff0c;起初用于基于Web的压力测试&#xff08;pressure test&#xff09;&#xff0c;后来其应用范围逐渐扩展到对文件传输FTP&#xff0c;大型数据库&#xff08;JDBC方式&#xff09;&#xff0c;脚本程…

列表的sort方法和sorted的区别

问题&#xff1a;简述一下列表list的sort方法和sorted的区别 sort是应用在list列表上的方法&#xff0c;sorted可以对所有可迭代的对象进行排序操作 list.sort()不会返回对象&#xff0c;会改变原有的list&#xff0c;即直接在原来的list基础上修改(原列表就地排序)&#xff0…

(链表) 剑指 Offer 35. 复杂链表的复制 ——【Leetcode每日一题】

❓ 剑指 Offer 35. 复杂链表的复制 难度&#xff1a;中等 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 示例 1&#x…

从容应对,探索CAD辅助命令的优秀实践

在CAD设计中&#xff0c;辅助命令是提升效率和精确度的重要工具。熟练掌握并正确运用CAD中的各种辅助命令对于设计师们来说至关重要。本文将为你介绍一些常用的CAD辅助命令&#xff0c;并详细说明它们的功能和使用方法&#xff0c;帮助你更好地利用这些命令完成高质量的设计工作…

Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR

问题陈述 在信息过载的时代&#xff0c;根据上下文含义和用户意图而不是精确的关键字匹配来查找相关搜索结果已成为一项重大挑战。 传统的搜索引擎通常无法理解用户查询的语义上下文&#xff0c;从而导致相关性较低的结果。 解决方案&#xff1a;ELSER Elastic 通过其检索模型…

虚拟机(VMware)安装Linux(Ubuntu)安装教程

清华大学开源网站镜像站网址&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 进入之后在搜索框中搜索“ubuntu” 直接点击箭头所指的蓝色字体“ubuntu-20.04.1-desktop-amd64.iso”即可下载

Jmeter介绍以及脚本制作与调试

Jmeter介绍 Jmeter 是 Apache 基金会 Jakarta 上的一个纯 Java 开源项目&#xff0c;起初用于基于 Web 的压力测试&#xff08;pressure test&#xff09;&#xff0c;后来其应用范围逐渐扩展到对文件传输 FTP, 大型数据库&#xff08;JDBC 方式&#xff09;&#xff0c;脚本程…

7.27 作业

1.闹钟 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);tid1 startTimer(1);//显示时间计时器ui->pushButton_2->setEnabled(false);//设置停止为不可用…

陕西师范大学大学:融合传统与创新的学府之旅

前言 > &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 > &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 > &#x1f4d…

MUR2080CT/MUR2080CTR-ASEMI快恢复二极管对管

编辑&#xff1a;ll MUR2080CT/MUR2080CTR-ASEMI快恢复二极管对管 型号&#xff1a;MUR2080CT/MUR2080CTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 恢复时间&#xff1a;50ns 正向电流&#xff1a;20A 反向耐压&#xff1a;800V 芯片大小&#xff1a;102MIL*2 …

BGP劫持原理及如何防御

互联网跟人类社会一样&#xff0c;都通过特定的规则和法律来确保社会的正常运行。BGP协议就是互联网中的“规则”之一。BGP用于在不同的自治系统(AS)之间交换路由信息&#xff0c;当两个AS需要交换路由信息时&#xff0c;每个AS都必须指定一个运行BGP的节点&#xff0c;来代表A…

K8s使用Ceph作为后端存储

Ceph概述 部署Ceph集群 Ceph存储使用 Pod使用Ceph持久化数据 Ceph监控 Rook部署Ceph Ceph概述 Ceph介绍 Ceph架构 Ceph核心概念 Ceph介绍 Ceph是一个开源的分布式存储系统&#xff0c;具有高扩展性、高性能、高可靠性等特点&#xff0c;提 供良好的性能、可靠性和可扩展性。…