写点什么

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

评论

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

1688商品详情API返回值:商家数字化转型的助推器

技术冰糖葫芦

API Explorer API 接口 API 测试 API 策略

第64期 | GPTSecurity周报

云起无垠

为什么要使用TikTok云手机

Ogcloud

云手机 海外云手机 tiktok云手机 云手机海外版 tiktok运营

豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!

我再BUG界嘎嘎乱杀

Python 编程 数据分析 后端 pandas

讯飞星火极速超拟人交互技术:语音端到端,8 月底开放;昆仑万维发布 AI 短剧平台 SkyReels丨RTE 开发者日报

RTE开发者社区

iPaaS丨API低代码平台适用的业务场景

谷云科技RestCloud

API 低代码平台 ipaas

从原理聊JVM(一):染色标记和垃圾回收算法

京东科技开发者

一段鸿蒙旅程

草原上的奔跑

鸿蒙Next 纯血鸿蒙

MySQL主从同步如何保证数据一致性?

王磊

Java

【AI 冰封挑战】搭档函数计算,“冰”封你的夏日记忆

阿里巴巴云原生

阿里云 Serverless 云原生

华为云构建边缘云平台,畅享AI数字时代新体验

最新动态

编程“奥斯卡”落幕,百度之星决赛中学生疯狂收割大奖!

herosunly

使用对比!SLS 数据加工 SPL 与旧版 DSL 场景对照

阿里巴巴云原生

阿里云 云原生 sls

通义灵码代码搜索功能的前沿性研究论文被软件工程国际顶会 FSE 录用

阿里云云效

阿里云 云原生 通义灵码

如何在 KubeBlocks 中配置实例模板?

小猿姐

数据库 Kubernetes 云原生

深入浅出python的lambda表达式

我再BUG界嘎嘎乱杀

Python 编程 后端 开发语言 Lambda表达式

百度智能云计算系列产品通过电子标准院算力服务成熟度增强级评估

Baidu AICLOUD

1688商品评论数据接口实战指南:挖掘电商洞察

tbapi

1688商品评论接口 1688API 1688评论API

Bonree ONE 3.0:全域可观测 运维新境界

博睿数据

如何通过观测云实现AIOps突破?

观测云

AIOPS 智能运维

机器人测试自动化智能化交流沙龙 —— 免费参与,线上线下同步进行,探索未来科技新篇章!

测吧(北京)科技有限公司

测试

利用多Lora节省大模型部署成本|得物技术

得物技术

LoRa 大模型 企业号2024年8月PK榜

云上集成时序数据库 IoTDB,海量储能数据实现高效处理与实时分析

Apache IoTDB

真去送了外卖的程序员,来聊聊他眼中的《逆行人生》丨编码人声

RTE开发者社区

AI作文导师、一键搜索答疑、1秒生成手抄报,百度搜索推出开学季AI大礼包

极客天地

如何解决跨国视频会议卡顿问题

Ogcloud

网络加速 海外网络加速 网络加速服务 视频会议加速

在孩子成长路上,爱与智慧的陪伴是送给孩子最好的礼物

心大陆多智能体

AI大模型 心理健康 数字心理

四旋翼无人机到底是如何平稳飞行的?巧用空气动力学仿真

Altair RapidMiner

人工智能 无人机 仿真 altair 设计仿真

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