Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go测试框架-Mock http请求

Go测试框架-Mock http请求

原创
作者头像
Johns
修改于 2022-06-30 02:26:06
修改于 2022-06-30 02:26:06
3K0
举报
文章被收录于专栏:代码工具代码工具

一. 使用httptest来mock一些http的服务

1.1 背景说明

最近做了一个营销活动,开发礼包领取功能时依赖了外部的系统发放点券,已知点券发放接口是非常稳定ok的了,目前这个接口仅可以在生产被调用。为了测试礼包领取功能,需要mock掉依赖的外部点券发放接口。

1.2 操作实践

代码语言:txt
AI代码解释
复制
// 这是配置文件里面的,为了演示这里写死
// RemoteGamePointsApi 点券api地址
var RemoteGamePointsApi = "/gift_pack"

// RemoteGamePointsServiceAddress 点券服务地址
var RemoteGamePointsServiceAddress = ""

// GiftPackResp 外部点券发放接口响应
type GiftPackResp struct {
	QQ         string
	GamePoints int64
}

// GiftPackGet 礼包领取功能
func GiftPackGet(qq string) error {
	// step1. 参数校验

	// step2. 检查用户是否在本次活动黑名单 ...

	// step3.检查用户是否已经领取过了 ...

	// step4. 锁定当前账号, 防止同一个时刻同一个账号同时发放  ...

	// step5. 调用点券发放接口
	return sendGamePoints(qq)
}

// SendGamePoints 调用外部接口发送游戏点券
func sendGamePoints(qq string) error {
	if !qqValidator(qq) {
		return errors.New("qq is invalid")
	}

	// 发送点券
	resp, err := http.Get(fmt.Sprintf("%s/%s?qq=%s", RemoteGamePointsServiceAddress, RemoteGamePointsApi, qq))
	defer resp.Body.Close()

	// 解析响应结果
	bs, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}

	ret := GiftPackResp{}
	err = json.Unmarshal(bs, &ret)
	if err != nil {
		return err
	}
	fmt.Println(ret)
	return err

}

// qq 合法性校验
func qqValidator(qq string) bool {
	reg := regexp.MustCompile(`^[1-9]\d{3,10}$`)
	return reg.MatchString(qq)
}

// Test_GiftPackGet 测试礼包发放接口
func Test_GiftPackGet(t *testing.T) {
	Convey("test utils GiftPackGet", t, func() {
		Convey("When request use httptest mock remote api", func() {
			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
				if r.Method != http.MethodGet {
					w.WriteHeader(http.StatusNotFound)
				}
				if r.URL.EscapedPath() != RemoteGamePointsApi {
					w.WriteHeader(http.StatusNotFound)
				}
				qq := r.URL.Query().Get("qq")
				w.WriteHeader(http.StatusOK)
				g := GiftPackResp{qq, 100}
				bs, _ := json.Marshal(g)
				w.Write(bs)
			}))

			defer ts.Close()
			RemoteGamePointsServiceAddress = ts.URL
			err := GiftPackGet("3095764312")
			So(err, ShouldBeNil)
		})
	})
}

代码解释:

  • GiftPackGet 是对外的礼包发放接口,在调用前需要做一些活动规则的检查
  • sendGamePoints 是调用的外部的点券发送接口api,调用会返回点券发送的回执
  • 通过mock掉点券发送接口api, 我们可以将测试聚焦在具体的活动规则检查上,这部分才是我们自己的业务逻辑,是我们需要重点测试的部分。

二. 关于mock的思考

关于mock一直都是一个讨论比较激烈的点:

一方的人主张不要滥用mock,能不mock就不mock。被测单元也不一定是具体的一个函数,可能是多个函数本来就应该串起来,必要的时候再mock。

一方则主张将被测函数所有调用的外面函数全部mock掉,只关注被测函数自己的一行行代码,只要调用其他函数,全都mock掉,用假数据来测试。

个人感觉用不用mock就是一个选择问题,需要具体问题具体看待。如果依赖的模块自己可控, 那么我宁愿用测试数据保证上下依赖ok,专注到被测试的模块。

三. 什么时候适合mock?

  • 该对象提供非确定的结果(比如当前的时间或者当前的温度)。
  • 对象的某些状态难以创建或者重现(比如网络错误或者文件读写错误)。
  • 对象方法上的执行太慢(比如在测试开始之前初始化数据库)。
  • 该对象还不存在或者其行为可能发生变化(比如测试驱动开发中驱动创建新的类)。
  • 该对象必须包含一些专门为测试准备的数据或者方法。
  • 外部的一些调用代价较高的接口(例如调用一次100元的接口)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang语言情怀-第15期 Go 语言设计模式 创建模式-生成器
3.有时我们希望生成器能够自动的退出,这时可以使用golang channel的
李海彬
2021/01/21
3870
Go 单元测试之HTTP请求与API测试
假设我们的业务逻辑是搭建一个http server端,对外提供HTTP服务。用来处理用户登录请求,用户需要输入邮箱,密码。
贾维斯Echo
2024/04/18
4970
Go 单元测试之HTTP请求与API测试
Go 每日一库之 testify
testify可以说是最流行的(从 GitHub star 数来看)Go 语言测试库了。testify提供了很多方便的函数帮助我们做assert和错误信息输出。使用标准库testing,我们需要自己编写各种条件判断,根据判断结果决定输出对应的信息。
用户7731323
2021/08/20
1.9K0
Golang 单元测试详尽指引
文末有彩蛋。 作者:yukkizhang,腾讯 CSIG 专项技术测试工程师 本篇文章站在测试的角度,旨在给行业平台乃至其他团队的开发同学,进行一定程度的单元测试指引,让其能够快速的明确单元测试的方式方法。 本文主要从单元测试出发,对Golang的单元测试框架、Stub/Mock框架进行简单的介绍和选型推荐,列举出几种针对于Mock场景的最佳实践,并以具体代码示例进行说明。 一、单元测试 1. 单元测试是什么 单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向
腾讯技术工程官方号
2020/10/26
4.7K0
一文了解一线互联网大厂的 Golang 单测最佳实战经验
Go 单测里面,最常见的就是通过 gomonkey(stub) 打桩或者 mocker(mock) 的模拟来替换掉我们原本的执行逻辑,因此首先我们要对这两种方式有一个比较深入的理解,要理解为何 Go 单测的时候能够替换掉原来的方法!!!
Allen.Wu
2023/03/01
2.7K0
一文了解一线互联网大厂的 Golang 单测最佳实战经验
Golang 单元测试合集整理,(我最常用 gomonkey)欢迎收藏
无论写什么样的语言,单元测试都是必不可少的,它可以极大的提高我们的代码质量,减少各种低级错误和 bug
阿兵云原生
2023/09/14
2.1K0
Golang 单元测试合集整理,(我最常用 gomonkey)欢迎收藏
go test 测试用例那些事
    go test命令,相信大家都不陌生,常见的情况会使用这个命令做单测试、基准测试和http测试。go test还是有很多flag 可以帮助我们做更多的分析,比如测试覆盖率,cpu分析,内存分析,也有很多第三方的库支持test,cpu和内存分析输出结果要配合pprof和go-torch来进行可视化显示,可以看一下之前的这篇帖子 golang 使用pprof和go-torch做性能分析,这篇帖子总结一下go test的一些常用方式和推荐一些很棒的第三方库。
lpxxn
2018/12/24
1.5K0
Go语言的测试:编写单元测试和性能测试
在实际开发中,测试是保证代码质量和稳定性的重要手段。Go语言的testing包提供了一种简单而强大的方法来编写单元测试和性能测试。通过编写单元测试,可以验证每个函数和方法的正确性;通过编写性能测试评估代码的运行效率并进行优化。
二一年冬末
2024/06/22
2560
【实践】Golang的单元测试入门go test
go test命令,相信大家都不陌生,常见的情况会使用这个命令做单测试、基准测试和http测试。go test还是有很多flag 可以帮助我们做更多的分析,比如测试覆盖率,cpu分析,内存分析,也有很多第三方的库支持test,cpu和内存分析输出结果要配合pprof和go-torch来进行可视化显示。
辉哥
2019/08/18
3.6K0
Go单测系列2—网络测试
这是Go语言单元测试从零到溜系列教程的第1篇,介绍了如何使用httptest和gock工具进行网络测试。
luckpunk
2023/09/10
5050
从零开始写一个web服务到底有多难?
服务想必大家都有很多开发经验,但是从零开始搭建一个项目的经验,就少的多了。更不要说不使用任何框架的情况下从零开始搭建一个服务。那么这次就看看从零开始搭建一个好用好写web服务到底有多难?
4cos90
2023/12/21
2400
一文说尽Golang单元测试实战的那些事儿
导语 | 单元测试,通常是单独测试一个方法、类或函数,让开发者确信自己的代码在按预期运行,为确保代码可以测试且测试易于维护。腾讯后台开发工程师张力结合了公司级漏洞扫描系统洞犀在DevOps上探索的经验,以Golang为例,列举了编写单元测试需要的工具和方法,然后针对写单测遇到的各种依赖问题,详细介绍了通过Mock的方式解决各种常用依赖,方便读者在写go语言UT的时候,遇到依赖问题,能够快速找到解决方案。最后再和大家探讨一下关于单元测试上的一些思考。 一、前言 单元测试,通常是单独测试一个方法、类或函数
腾讯云开发者
2021/07/28
1.5K0
Go 单元测试之mock接口测试
gomock 是一个 Go 语言的测试框架,在实际项目中,需要进行单元测试的时候。却往往发现有一大堆依赖项。这时候就是 Gomock 大显身手的时候了,用于编写单元测试时模拟和测试依赖于外部服务的代码。它允许你创建模拟对象(Mock Objects),这些对象可以预设期望的行为,以便在测试时模拟外部依赖,通常使用它对代码中的那些接口类型进行mock。
贾维斯Echo
2024/04/19
2740
Go 单元测试之mock接口测试
go测试框架gomock的使用
gomock是golang官方开发维护的接口级别的mock方案,包含了GoMock包和mockgen工具两部分,其中GoMock包完成对桩对象生命周期的管理,mockgen工具用来生成interface对应的Mock类源文件。要使用gomock的一个前提是模块之间务必通过接口进行依赖,而不是依赖具体实现,否则mock会非常困难。这个工具目前业界用的并不多,主要是局限性太大,所以我们只需要简单了解一下如何使用就行。
Johns
2021/09/01
4.9K0
Go-RESTful-设计API接口示例
在这个示例中,我们定义了一个名为 Book 的结构体,表示书籍的属性。然后,我们定义了五个处理程序,分别用于获取所有书籍、获取指定 ID 的书籍、创建新的书籍、更新指定 ID 的书籍和删除指定 ID 的书籍。最后,我们将这些处理程序添加到 restful.WebService 中,并在端口 8080 上启动 HTTP服务器。
堕落飞鸟
2023/04/25
4510
http server测试
在对http服务测试时,我们可以通过两种方式来完成,一种基于http服务,一种基于自带的测试包来完成。
暮雨
2019/08/19
1.8K0
Go项目实战-学会对代码逻辑层进行BDD测试
前面两节我们的单元测试主要集中在对项目基础设施层的代码进行单元测试,针对Dao数据操作层我们讲解了如何在不实际对项目数据库进行CURD的情况下使用了sqlmock的方式进行单元测试。而对于外部API对接层则是教会大家用gock实现无侵入的HTTP Mock,对有API请求的代码进行单元测试。
KevinYan
2025/05/15
1030
Go项目实战-学会对代码逻辑层进行BDD测试
Go通关21:RESTful API 服务,急速入门!
EST即表述性状态传递(英文:Representational State Transfer,简称REST),它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。(引用自百度百科)。
微客鸟窝
2021/08/18
1.7K0
Golang:使用 httprouter 构建 API 服务器
我 10 个月前开始成为一名 Gopher,没有回头。像许多其他 gopher 一样,我很快发现简单的语言特性对于快速构建快速、可扩展的软件非常有用。当我刚开始学习 Go 时,我正在玩不同的多路复用器(multiplexer),它可以作为 API 服务器使用。如果您像我一样有 Rails 背景,你可能也会在构建 Web 框架提供的所有功能方面遇到困难。回到多路复用器,我发现了 3 个是非常有用的好东西,即 Gorilla mux、httprouter 和 bone(按性能从低到高排列)。即使 bone 有最
李海彬
2018/03/19
2.3K0
利用go+vue快速开发一个web系统
IT不难
2024/06/01
5170
利用go+vue快速开发一个web系统
相关推荐
Golang语言情怀-第15期 Go 语言设计模式 创建模式-生成器
更多 >
LV.1
这个人很懒,什么都没有留下~
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档