最近要看的文章
2022-11-15
| 2023-11-16
0  |  阅读时长 0 分钟
Created time
Jan 9, 2023 08:49 AM
date
status
category
Origin
summary
tags
type
URL
icon
password
slug
GoMock快速上手教程
GoMock是Go语言官方出品的一款mock框架,不仅可以同Go语言内置的testing包很好的集成,而且提供了非常灵活的EXPECT接口。本文翻译自 codecentric上的一篇博文,是编者目前读过的最好的一篇关于GoMock的入门教程,原文链接为 Testing with GoMock: A Tutorial 。 首先,我们需要安装gomock包 和代码生成工具mockgen 。准确来说,即使不安装mockgen我们依然可以使用GoMock,但是那样的话就需要我们自己来写mock代码,这样做不仅麻烦而且很容易出错。 gomock和mockgen均可以使用go get来安装,具体命令如下: go get github.com/golang/mock/gomock go get github.com/golang/mock/mockgen 我们可以通过执行如下命令来验证mockgen是否已经成功安装: 该命令会输出mockgen的使用说明和支持的参数列表。到此为止GoMock就安装完成了,我们已经可以开始测试一些代码了! GoMock的使用通常遵循如下四个基本步骤: 使用mockgen为你想要mock的接口生成一个mock。 在你的测试代码中,创建一个gomock.Controller实例并把它作为参数传递给mock对象的构造函数来创建一个mock对象。 调用EXPECT()为你的mock对象设置各种期望和返回值。 调用mock控制器的Finish()以验证mock的期望行为。 让我们通过一个简单的例子来演示GoMock的整个使用流程,为简单起见我们只看两个文件,一个是文件 doer/doer.go中我们希望mock的接口 Doer,另一个是文件 user/user.go中使用了 Doer接口的结构 User 。 doer/doer.go 下面是我们想mock掉 Doer 接口进行测试的代码: user/user.go 我们当前的项目代码结构如下: -- doer -- doer.go -- user -- user.go -- doer --
GoMock快速上手教程
GoConvey框架使用指南
在软件开发中,产品代码的正确性通过测试代码来保证,而测试代码的正确性谁来保证?答案是毫无争议的,肯定是程序员自己。这就要求测试代码必须足够简单且表达力强,让错误无处藏身。我们要有一个好鼻子,能够嗅出测试的坏味道,及时的进行测试重构,从而让测试代码易于维护。笔者从大量的编码实践中感悟道:虽然能写出好的产品代码的程序员很牛,但能写出好的测试代码的程序员更牛,尤其对于TDD实践。 要写出好的测试代码,必须精通相关的框架。对于Golang程序员来说,至少需要掌握下面两个框架: 本文将主要介绍GoConvey框架的基本使用方法,从而指导读者更好的进行测试实践,最终写出简单优雅的测试代码。 GoConvey是一款针对Golang的测试框架,可以管理和运行测试用例,同时提供了丰富的断言函数,并支持很多 Web 界面特性。 Golang虽然自带了单元测试功能,并且在GoConvey框架诞生之前也出现了许多第三方测试框架,但没有一个测试框架像GoConvey一样能够让程序员如此简洁优雅的编写测试代码。 在命令行运行下面的命令: go get github.com/smartystreets/goconvey 运行时间较长,运行完后你会发现: 在$GOPATH/src目录下新增了github.com子目录,该子目录里包含了GoConvey框架的库代码 在$GOPATH/bin目录下新增了GoConvey框架的可执行程序goconvey 注:上面是在gopath时代使用GoConvey的API前的安装方法,而在gomod时代一般不需要先显式安装(gomod机制会自动从goproxy拉取依赖到本地cache),除非要使用GoConvey的web界面,这时需要提前安装GoConvey的二进制,命令为go install github.com/smartystreets/goconvey@latest 。 我们通过一个案例来介绍GoConvey框架的基本使用方法,并对要点进行归纳。 我们实现一个判断两个字符串切片是否相等的函数StringSliceEqual,主要逻辑包括: 两个字符串切片长度不相等时,返回false 两个字符串切片一个是nil,另一个不是nil时,返回false 遍历两个切片,比较对应索引的两个切片元素值,如果不相等,返回false 否则,返回true 根据上面的逻辑,代码实现如下所示: func StringSliceEqual(a, b []string) bool { if len(a) != len(b) { return false } if (a == nil) != (b == nil) { return false } for i, v := range a { if v != b[i] { return false } } return true } 对于逻辑"两个字符串切片一个是nil,另一个不是nil时,返回false"的实现代码有点不好理解: if (a == nil) != (b == nil) { return false } 我们实例化一下a和b,即[]string{}和[]string(nil),这时两个字符串切片的长度都是0,但肯定不相等。 先写一个正常情况的测试用例,如下所示: import ( "testing" .
GoConvey框架使用指南
 
GO大厂面经NotionNext修改记录及配置文件
Loading...
目录