| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 使用 Mock 和 Interface 进行 Golang 单测 -> 正文阅读 |
|
[开发测试]使用 Mock 和 Interface 进行 Golang 单测 |
本文将介绍 Golang 中如何正确的做单测。 什么是单元测试?单元测试的特点单元测试是质量保证十分重要的一环,好的单元测试不仅能及时地发现问题,更能够方便地调试,提高生产效率,所以很多人认为写单元测试是需要额外的时间,会降低生产效率,是对单元测试最大的偏见和误解。 单测会将对应测试的模块隔离出来进行测试,所以我们要尽可能把所有相关的外部依赖都移除,只对相关的模块进行单测。 所以大家看到的在业务代码仓库中的一些在 client 模块中调用 HTTP 的单测其实是不规范的,因为 HTTP 是外部依赖,你的目标服务器如果有故障,那么你的单测就会失败。
上面这个例子中 并且上面这个例子中,对于 从上面的例子中我们可以总结出两个单测特点:
此外我还想提及的一点就是对于单测的编写难度其实是有排序的: UI > Service > Utils 所以对于单测的编写,我们会优先考虑对 Utils 的单测, 因为 Utils 不会有太多的依赖。其次是对于 Service 的单测,因为 Service 的单测主要是对上游服务和数据库的依赖,只需要分离出依赖就可以进行逻辑的测试。 那该如何分离出依赖呢?我们走到下一节,我们将会介绍如何分离出依赖。 什么是 Mock?对于 IO 的依赖,我们可以使用 Mock 来模拟数据,这样我们就可以不用担心数据源不稳定的问题了。 那么什么是 Mock 呢?我们又该如何 Mock 呢? 可以想想一个场景,就是你和你的同事正在进行合作的项目开发,你这边的进展比较快,已经快完成你的开发了,但是你的同事进展稍慢,并且你还依赖他的服务。你要怎么不 block 你的进展继续开发呢? 这里就可以使用到 Mock 了,就是你可以和你的同事先制定好需要交互的数据格式,在你的测试代码中,你可以编写一个可以产生对应数据格式的客户端,并且这些数据都是虚假的,然后你就可以继续编写你的代码,等到你的同事完成了他那部分的代码,你就只需要将 Mock Clients替换为真实的 Clients 就可以了。这就是 Mock 的作用。 同样的,我们也可以使用 Mock 来对需要测试模块所依赖的数据进行模拟。下面就是一个例子:
我们会有一个 同样可以发现一个很有趣的地方,就是我们将 此时你会发现另外一个问题,就是如果想要将 所以我们可以使用接口类型来替换。 什么是 Interface?在 Golang 中接口可能和你接触的其他语言的接口不同,在 Golang 中接口是一个函数的集合。并且 Golang 的接口是隐式的,不需要显式的定义。 我个人也非常同意这种设计,因为经过多次的实践,我发现事先定义好的抽象往往都是无法很准确的描述具体实现的行为的。所以需要事后做抽象, 与其写类型来满足
我个人的推荐是对于几个相似的流程,我们可以先通过写几个结构体来组织代码,然后发现这些结构体有相似的行为之后,就可以抽象出一个接口来描述这些行为,这样才是最准确的。 同时对于 Golang 中的接口所包含的方法数目也需要加以限制,不能太多,1-3 个方法就可以了。其中的原因是这样的,如果你的接口中包含太多方法,你新增一个实现类型的代码就会很麻烦,而且这样的代码也不好维护。同样如果你的接口有很多种实现,并且方法有很多,那么你再多添加一个函数加入接口也会很困难,你需要在每个结构体中都实现这些方法。 回到主题,对于 这样就可以达成我们的目的了。
其他的一些例子此外我还提供了一个例子供参考,主要是从正式生产的代码中找到的,屏蔽了敏感信息的例子。 这个例子是对 etcd 这个外部依赖的 mock。
一个单测的例子:
other tips关于测试我这边还有一些你可能不知道的小技巧 Golang 的 internal 与 external 测试对于一个包的导出方法以及变量你可以在同一个包下建立 test 文件来测试,只需要将包名后缀改为
另外你也可以对未导出的方法和变量进行测试,可以创建一个尾缀为 总结
有趣的链接推荐最后最后和大家分享一下参考的链接,以及一些最近在看的好文,因为看的比较零散,一并写给大家,希望大家能够收获。
|
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/18 5:34:32- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |