写点什么

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

评论

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

直击中小企业痛点!Flexus X实例让中小企业也可以上好云、用好云

YG科技

激发云服务效能,华为云Flexus X实例助力破除中小企上云痛点

YG科技

可观测产品剖析——日志统一管理

嘉为蓝鲸

日志监控 日志管理 日志采集

自动化业务状态码设计

三七互娱后端技术团队

效率 自动化 状态码

生成式 AI 时代数据库与大模型的融合探索

编程猫

双倍性能、跃级体验!华为云Flexus X实例助力企业轻松上云

轶天下事

华为云Flexus X实例创新柔性算力技术,助力企业提质、增效、降本

轶天下事

30% 代码由 AI 生成,单测准确率达到 90%,我在阿里巴巴国际站推广通义灵码

阿里云云效

阿里云 云原生 通义灵码

华为云Flexus X实例依托生态优势,破解中小企业数字化转型困局

YG科技

解锁携程美食与景点数据接口:打造个性化旅行体验的秘密武器

tbapi

携程API 携程景点列表接口 携程酒店API 携程美食列表API

数字转型得力伙伴:华为云Flexus X实例打造云计算应用新标杆

轶天下事

开发者生产力提升的API终极指南

幂简集成

API

SpringBoot项目中HTTP请求体只能读一次?试试这方案

小明同学的学长

springboot java

顺应数字化趋势!Flexus X实例助力中小企业开启数字转型“必修课”

轶天下事

华为云Flexus X实例:最高6倍算力提升,满足中小企业多元需求

轶天下事

顺应数字化浪潮,华为云Flexus X实例助力中小企业破局崛起

轶天下事

华为云Flexus X实例性能出众,降本显著,促进中小企业高质量发展

YG科技

华为云Flexus X实例全方位创新,开拓企业数字化发展新边界

YG科技

论如何利用仿真技术轻松攻克电子产品热流体仿真难题

Altair RapidMiner

设计 汽车 电子产品 仿真 altair

充分发挥数字经济赋能效应,Flexus X实例协助企业高效转型

轶天下事

中小企业数字化转型难点凸显,华为云Flexus X实例革新上云体验

YG科技

性能易用二合一!华为云Flexus X实例加快中小企数字转型

YG科技

掀起性能巨浪:华为云Flexus X实例定义业务负载多面手

YG科技

重塑云服务,华为云Flexus X实例破解云服务传统难题

YG科技

华为云Flexus X实例全方位为中小企业护航,加速迈进“专精特新”

YG科技

30% 代码由 AI 生成,单测准确率达到 90%,我在阿里巴巴国际站推广通义灵码

阿里巴巴云原生

阿里云 云原生 通义灵码

DARPA计划“消灭”C语言代码

我再BUG界嘎嘎乱杀

网络安全 编程语言 C语言 内存安全 DARPA

GitHub星标4000!清华大牛的CTF竞赛入门指南,真的太香了!

我再BUG界嘎嘎乱杀

黑客 网络安全 信息安全 PWN CTF竞赛

华为云Flexus X实例,以创新技术打造中小企业高质量发展新引擎

轶天下事

华为云Flexus X实例创新柔性算力!直击中小企业数字化转型痛点

轶天下事

数字化转型正当时!华为云Flexus X实例助力中小企业高效便捷上云

轶天下事

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