AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

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:002732

评论

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

【Flutter 专题】133 图解自定义 ACEWaterButton 水波纹按钮

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

Gas 机制是如何运作的

Rayjun

以太坊

微博评论高性能高可用计算架构设计

看,有只猪

人工智能解决方案 --- 智能运维(AIOps)

micklongen

人工智能 AIOPS 知识图谱 智能运维 数据工程

Prometheus 基础查询(四)修饰符

耳东@Erdong

Prometheus 10月月更

Go 扇入 / 扇出

baiyutang

golang 10月月更

区块链将规则写入代码 重构市场新制度

CECBC

CPU、指令集、微架构概念学习

轻口味

10月月更

【架构实战营作业】模块五——微博评论计算架构

聆息

分布式文件存储系统Minio实战

飞鸟

Minio 分布式文件存储

linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码

程序员架构进阶

架构 ffmpeg 视频流 10月月更

018云原生之基础架构

穿过生命散发芬芳

云原生 10月月更

初始化 Ubuntu 工作环境

看山

ubuntu 10月月更

5分钟搞懂Monorepo

俞凡

git 架构

趣说 Node.js 的事件循环

Regan Yue

node.js Regan Yue 10月月更

👊 【Spring技术特性】带你看看那些可能你还不知道的特性技巧哦!

洛神灬殇

Java spring Spring特性 10月月更

Minio环境搭建

飞鸟

Minio 分布式文件存储

Win11安装PyTorch

IT蜗壳-Tango

10月月更

API网关Kong实战

飞鸟

kong api 网关 API Gateway

Spring 框架学习

风翱

spring 10月月更

【设计模式】第四篇 - 简单工厂

Brave

设计模式 工厂模式 10月月更

WEB图像优化

devpoint

性能优化 image 图像格式 10月月更

在线字符串哈希/散列工

入门小站

工具

【产品】论增长黑客思维如何让B端产品爆发式增长

极光一号。

云原生 用户增长 b端产品经理 增长黑客

linux之awk使用技巧

入门小站

Linux

博鳌亚洲论坛国际科技与创新论坛第二届大会区块链分论坛紧密筹备中

时空云

区块链 博鳌 亚洲论坛

【LeetCode】环形链表Java题解

Albert

算法 LeetCode 10月月更

Kafka 生产环境部署指南

Se7en

Linux system hardening: adding hidepid to /proc mount point

卓丁

Linux linux security proc hidepid

官方线索|科大讯飞全球1024开发者节

xcbeyond

1024我在现场

未来已来,运营商如何驱动区块链应用创新提速?

CECBC

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