2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Golang 单元测试框架 gocheck 使用介绍

  • 2020-03-26
  • 本文字数:2072 字

    阅读完需:约 7 分钟

Golang 单元测试框架 gocheck 使用介绍

什么是好的单元测试框架?

单元测试应该在的功能和参数上验证程序的正确性;单元测试过后,机器状态应该保持不变;单元测试的运行、通过、失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性。

Gocheck 简介

gocheck 是 golang 语言比较健全且简单的单元测试框架,gocheck 在 golang 官方的 testing package 之上,丰富了很多功能,丰富了单元测试常用的 assert 断言,判断动词 deep multi-type 对比,字符串比较以及正则匹配。测试用例组织集合方面按 suite 组织测试用例,支持 suite 级别的 setup() 和 teardown()。对于临时文件支持创建、删除临时文件和目录。

Assert 断言的使用

Assert 根据预期 Checker 值检验接口返回值与预期值是否匹配,如果它们不匹配,则会记录错误,测试记录不通过,并且测试用例将停止。func (c *C) Assert(obtained interface{}, checker Checker, args …interface{}) 那么如上代码所示的 hecker 接口是怎么来实现验证的呢?hecker 接口是必须与 Assert 和 Check 验证方法一起使用的检查器。


首先需要定义好 Checker 接口,代码如下:



其中的 CheckerInfo 为一个结构体,用来定义我们基准校验的参数格式。


checker 中有比较多的检查器,一般可以满足我们正常情况下的各种检查需求,比如 ErrorMatches 检查器验证错误值是否为非零并与提供的正则表达式匹配。


检查器代码可以这么写:



Assert 校验代码:



以上就是一个接口的简单校验流程。同时 Checker 检查器提供了比较丰富的检查器方法,下面简单列几种:


DeepEquals 全等校验,类型必须相同,校验比较严格,一般很少使用,因为校验结果失败的概率比较高;


Equals 相当于 ==校验,比全等校验相对来说要宽松一点;


FitsTypeOf 校验类型是否一致;


HasLen 校验长度是否一致;


IsNil 校验返回值是否为空;


func Not(checker Checker) 反转提供的检查器的逻辑,生成的检查器将在原始检查器失败的情况下成功,反之亦然。

临时文件的使用

采用临时文件方法,满足单元测试要读写文件需求。


对于测试的过程中我们经常要用到前期的大批量的读写文件操作,但是大量的数据文件可能会导致测试完成后服务器状态改变,为了遵循”单元测试过后,机器状态保持不变”的原则,我们需要在单元测试结束后自动清理掉单元测试运行中用到和产生的大量临时文件存储的数据。gocheck 可以创建一个临时目录,在测试结束时自动删除它,省去了手动清理的步骤。


示例代码:


跳过测试的使用

用于对测试 suite 的过滤,当有些测试 suite 是特定情况才需要在报告中体现的时候,可以选择用这个方法,方便测试报告生成和测试过程中的特意过滤。


可以使用 SetUpSuite,SetUpTest 中的 skip 方法或测试方法本身跳过测试。这允许根据自定义因素选择性地忽略测试,例如正在运行的体系结构,提供给测试的标志或资源的可用性(网络等)。


例如,除非提供 -live 选项进行测试,否则以下测试套件将跳过套件中的所有测试


示例代码:


Mock server api 相关的测试使用

对于测试的过程中我们经常会遇到需要调用外部 api 的情况,这样的话外部 api 的响应成功与否直接影响我们当前单元测试的成功与否,与单元测试要求的独立性背道而驰,所以我们最后用 mock 数据的方法来保证单元测试的独立性。


利用 gocheck 的 SetUpSuite() 和 TearDownSuite() 方法,可以新建一个 http test server,结束时关闭它。


知乎提问代码测试实例

大家都知道知乎的提问和回答功能是整个知乎社区比较重要的一个功能,在知乎社区有疑问提出问题后,想要修改自己提出的问题的详细描述这部分功能代码要怎么进行测试呢?下面就来讲讲这个比较小的点要怎么去进行单元测试。

1. 需求分析

测试提问的详细内容更新这个功能函数,变量有详细内容具体信息,更新原因,更新时间,更新用户这个四个变化的参数,其中更新时间和更新用户部分可以直接获取,也不是我们单测的重点,那么重点就剩两个更新具体信息和更新原因,更新原因是一个给出的 list 去筛选,所以不是关注重点,更新具体详细内容是此次测试的重点。开始分析这个参数的限制条件,在提问中问题详情字数限制 3000 字,并且必填。

2. 测试代码编写

2.1 所用函数库分析


因为需求中要求 3000 字,所以为了保证服务器测试前后一致性,需要用到临时文件函数,对 3000 字文档进行临时存储,用完销毁操作。


2.2 具体单元测试函数编写


2.2.1 命名规范


单元测试文件命,根据需要测试的文件命名,比如被测试文件名为 question.go,那么测试文件名即为 question_test.go



2.2.2 代码编写


创建临时文件夹以及临时文件内容



参数传递时将临时文件内容当问题详细内容参数,这样在测试代码运行结束后问题详细内容的参数就会被销毁不会在服务器上产生多余的文件。


3. 结果分析

每次底层数据库变成,存储变更,外部以来接口服务变更,但是数据结构和调用结果不变更的情况下可以利用单元测试结果对现有业务逻辑进行快速检查。

最后

  • Gocheck 框架对 golang 代码进行单元测试比原生的单元测试框架写起来更方便和快速,函数库基本可以满足大部分的使用场景。

  • 整个框架本身在 github 开源可以添加自己需要的函数库。

  • 更详细的使用说明参见 gocheck 的 api 文档


2020-03-26 19:003124

评论

发布
暂无评论
发现更多内容

从 Multirepo 到 Monorepo 袋鼠云数栈前端研发效率提升探索之路

袋鼠云数栈

[极致用户体验] 教你个超牛逼的分割线CSS!

HullQin

CSS JavaScript html 前端 8月月更

高效率团队为啥都会选择Jenkins?一文带您了解Jenkins

wljslmz

持续集成 jenkins 8月月更

重学网络系列之(Ping与网关)

自然

网络 8月月更

每日一R「15」实践课之 kv-server(一)

Samson

学习笔记 8月月更 ​Rust

头脑风暴:二叉搜索树的最小绝对差

HelloWorld杰少

算法 LeetCode 8月月更

Java集合之map集合

楠羽

#开源

阿里云-建站小能手快速体验

凌云Cloud

阿里云 网站建设

重学网络系列之(UDP)

自然

网络 8月月更

蓝凌生态OA,重新定义中大型企业数字化办公

科技怪咖

从工程预算到项目管理,『蓝凌低代码』让房企管理更简单

科技怪咖

学习 Go 语言数据结构:实现双链表

宇宙之一粟

数据结构 双向链表 8月月更

如何给注册中心锦上添花?

捉虫大师

微服务 架构设计 注册中心 服务发现 8月月更

华为云构建“好用的化工数字化”

IT资讯搬运工

React在实际开发中Variables与Prop的实战运用

恒山其若陋兮

8月月更

重学网络系列之(TCP)

自然

网络 8月月更

负载均衡算法

源字节1号

程序员 软件开发

解析大型电商网站系统架构分层设计

穿过生命散发芬芳

网站架构 8月月更

规范代码命名,让你的代码阅读起来更愉悦!

岛上码农

flutter 前端 移动端开发 跨平台开发 8月月更

leetcode 242. Valid Anagram 有效的字母异位词(简单)

okokabcd

LeetCode 算法与数据结构

Zabbix 监控系统保姆及教程

CTO技术共享

Nexus 私服Prometheus+Grafana

CTO技术共享

Polkadot + DeFi | 透明公平、高效交易的去中心化金融未来可期

One Block Community

区块链 金融创新 defi 波卡生态

「美团 CodeM 资格赛」数码 详解

Five

c++ 算法题 8月月更

ISO文件怎么管?“筷子第一股”双枪科技教你1招!

科技怪咖

Docker 端口映射重大安全漏洞

CTO技术共享

干货|为什么说开源基金会的选择很关键?(上)

Orillusion

开源 WebGL 渲染引擎 webgpu web3d

Docker下Prometheus和Grafana三部曲之三:自定义监控项开发和配置

程序员欣宸

Grafana Prometheus 8月月更

C/C++size(),sizeof(),length(),strlen()对比分析详解

CtrlX

c c++ 进阶 热门活动 8月月更

【Python编程技巧】简单理解和使用Python中@property

迷彩

@PropertySource 8月月更 Python编程技巧

蓝凌“智慧云脑”,助力水务、燃气等集团服务民生

科技怪咖

Golang 单元测试框架 gocheck 使用介绍_文化 & 方法_icy001_InfoQ精选文章