写点什么

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

评论

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

Best Practices for Node.js Security

Mahipal_Nehra

JavaScript node.js security Node Best Practice

小平台SEO服务崛起:有搜索习惯和需求就有SEO服务

石头IT视角

1024共码未来(一览中华风华,API First)

叶秋学长

程序员 API 1024 11月月更

第一篇文章 | 记录我的Java学习之路 | 一切从零开始

祖国滴花骨朵儿

学习笔记 Java学习 零基础 11月月更

深度测评FL Studio性能,多年Fl Studio使用感受分享

懒得勤快

Matplotlib基础教程之折线图

芯动大师

Python matplotlib 11月月更

如何免安装使用 Python?推荐 17 个在线的 Python 解释器!

Python猫

Python

快速创建软件安装包-ClickOnce

沙漠尽头的狼

dns-client占用cpu过高的问题解决方案

我是一个茶壶

win10 DNS 11月月更

峰会实录 | StarRocks PMC Chair 赵纯:数据分析的极速统一3.0 时代

StarRocks

数据库

聊聊香港优才(56/100)

hackstoic

从1024开始,我们漫谈编程的本质

闫同学

编程 编译原理 11月月更

【愚公系列】2022年11月 Go教学课程 039-文件操作

愚公搬代码

11月月更

一文搞懂Go读写Excel文件

闫同学

Go 后端 11月月更

Swagger-knife4j介绍

默默的成长

前端 swagger 11月月更

重磅| 信创之路再加码,九科信息与中国长城完成兼容性测试

九科Ninetech

网络地址转换(NAT)(一)

我叫于豆豆吖.

11月月更

python小知识-python序列化

AIWeker

Python 人工智能 python小知识 11月月更

互联网安全架构设计原则

阿泽🧸

互联网安全 11月月更

【Linux】调试器-gdb使用

过眼云烟

学习 记录 11月月更

🚀使用“release-it”一气呵成:version、tag、changelog 等

小鑫同学

前端 nodejs 11月月更

跟着卷卷龙一起学Camera--MIPI 02

卷卷龙

ISP camera 11月月更

从柯里化讲起,一网打尽 JavaScript 重要的高阶函数

掘金安东尼

前端 11月月更

Dubbo 可观测性实践之 Metrics 功能解析

阿里巴巴云原生

阿里云 开源 云原生 dubbo

重磅!哈啰 Quark Design 正式开源,下一代跨技术栈前端组件库

Allan sir

前端 前端开发 WebContents 11月月更

Apache Beam基本架构

穿过生命散发芬芳

11月月更 Apache Beam

技术使用点二

默默的成长

Vue 前端 11月月更

Java --- SpringMVC的@RequestMapping注解

鸭鸭yyds

springmvc 11月日更 11月月更

智能运维|AIRIOT智慧光伏管理解决方案

AIRIOT

物联网

铸剑记:2022国产手机自研技术演义

脑极体

2022-11-02:以下go语言代码输出什么?A:编译错误;B:apple;C:ant;D:panic。 package main import “fmt“ func main() {

福大大架构师每日一题

golang 福大大 选择题

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