Golang学习——基于Gin框架进行httptest单元测试

Stella981
• 阅读 789

顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:

https://item.jd.com/34295655089.html

《基于Django的电子商务网站》网上购买地址:

https://item.jd.com/12082665.html

店铺二维码:

Golang学习——基于Gin框架进行httptest单元测试

来源:掘金

基于Gin框架进行httptest单元测试

  • 一.实例代码

  • 3.1 首页

  • 3.2 导入用户

  • 3.3 抽奖

  • 1.全局变量及main函数

  • 2.初始化路由

  • 3.三个主要功能

  • 二.测试工具函数

  • 2.1 ParseToStr将map中的键值对输出成querystring形式

  • 2.2 Get 根据特定请求uri,发起get请求返回响应

  • 2.3 ParseToStr 将map中的键值对输出成querystring形式

  • 2.4PostJson根据特定请求uri和参数param,以Json形式传递参数,发起post请求返回响应

  • 三.开始进行 httptest 测试

  • 四.运行单元测试,查看结果

  • 五.总结

昨天晚上在学习慕课网的课程时,写了个简单的抽奖demo,打算简单测试在并发场景下临界资源是否被修改的问题。

然后前后折腾了好久才测试成功,记录下自己在进行httptest单元测试时学到的知识。

一.实例代码

以下代码是要的测试内容,大致有三个功能:

  • index 首页,GET请求

  • 导入抽奖用户,POST请求

  • 抽奖,GET请求

1.全局变量及main函数

记得初始化锁,否则不起作用。

2.初始化路由

主要初始化了三个功能的路由

3.三个主要功能

请求成功后,每个页面都是返回一个字符串(包含各自的信息)

3.1 首页

3.2 导入用户

3.3 抽奖

二.测试工具函数

httptestUtil.go文件中主要封装了以下工具函数:

2.1 ParseToStr 将map中的键值对输出成querystring形式

2.2 Get 根据特定请求uri,发起get请求返回响应

2.3 ParseToStr 将map中的键值对输出成querystring形式

构造POST请求,表单数据以 querystring 的形式加在uri之后

注意:form表单的参数可以通过 querystring 的形式附在URI地址后面进行传递

这种方式,POST 请求获取参数是时要调用 c.Query("users"),而不是c.PostFprm("users"),更不是c.Param("users)

当然直接使用 c.ShouldBind() ,让gin自动判断是哪种方式的请求参数。
代码如下:

2.4 PostJson 根据特定请求uri和参数param,以Json形式传递参数,发起post请求返回响应

三.开始进行 httptest 测试

Golang规范是推荐一个方法写一个测试函数,并且以Test开头,后面跟方法名。

为了测试代码是否并发安全,就将三个功能的测试都写在同一个测试函数里,于是就命名为了TestMVC

四.运行单元测试,查看结果

运行结果如图:
Golang学习——基于Gin框架进行httptest单元测试
如图:
在我个人电脑上,测试运行耗时:9.21s;根据users字段的名字也说明了执行了 100000次,因为是并发执行的,所以顺序肯定不是从1到100000按序显示的(谁抢到CPU资源谁执行)

五.总结

从昨天晚上7点开始练习项目,进行单元测试,中间睡了6个小时吧。早上起来后,经过昨晚测试的磨练和学习,上午思路很清晰,不仅单元测试成功了,还将之前自己鼓捣的测试代码进行了重构和优化,直到今天上午11点多才正式完成。

第一次写Golang的httptest单元测试,整个过程就是边搜边学边实践,最后总算成功了。写一下 httptest 测试心得吧:

  1. 在测试之前,封装好 get put等请求的方法,封装到 httptestUtil,方便测试

  2. 灵活应用测试框架,比如 Testify ,能少写很多 if 判断,(主要用来判断响应码和响应实体)。刚开始我就是 if else 写了很多判断,后来学了这个测试框架

  3. 测试代码尽量简洁,保证可读性和可维护性。否则写一坨代码,容易逻辑混乱,而且看上去很烦,影响测试心智和测试准确性

  4. 如果遇到新的测试问题,尽量多搜多查多静下来想一想,不要一股脑埋进去死挖问题原因。很可能你所纠结的问题并不是真正的原因

  5. 如果测试顺利,那一切都好;如果测试不顺利,期间搜了很多资料,花费了大量时间进行测试,那么最后一定要写博客(或笔记),记录所学所想所得,否则以后还会遇到类似的问题

  6. 测试代码最好贴到博客(或笔记APP)上,方便以后查看

  7. 最重要的一点,思路要清晰。测试很容易让人头大,烦躁,不要死磕,不妨停下来缓一缓,休息一下,让大脑放松下来

参考资料:
1.Gin官方测试文档
2.基于golang gin框架的单元测试
3.用 Testify 来改善 GO 测试和模拟

作者:相守之路
链接:https://juejin.im/post/5ec2417df265da7beb50bb16
来源:掘金

————————————————————

顾老师课程欢迎报名

Golang学习——基于Gin框架进行httptest单元测试

软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

Golang学习——基于Gin框架进行httptest单元测试

本文分享自微信公众号 - 软件测试培训(iTestTrain)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
DevOps工具介绍连载(46)——OSSEC
顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:https://item.jd.com/34295655089.html《基于Django的电子商务网站》网上购买地址:https://item.jd.com/12082665.html店铺二维码:!(https://oscimg.oschina.net/os
Stella981 Stella981
2年前
Diffblue关于英国测试行业情况的研究
顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:https://item.jd.com/34295655089.html《基于Django的电子商务网站》网上购买地址:https://item.jd.com/12082665.html店铺二维码:!(https://oscimg.oschina.net/oscnet/f1d
Stella981 Stella981
2年前
DevOps工具介绍连载(5)——CFEngine
顾翔老师近期推出一对一入职面试辅导。有兴趣者可加微信xianggu19720625与我联系。先要提供简历初选,合适者进一步洽谈。顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:https://item.jd.com/34295655089.html《基于Django的电子商务网站》网上购买地址:https://item.j
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
2年前
DevOps工具介绍连载(14)——裸金属服务器
顾翔老师近期推出一对一入职面试辅导。有兴趣者可加微信xianggu19720625与我联系。先要提供简历初选,合适者进一步洽谈。顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:https://item.jd.com/34295655089.html《基于Django的电子商务网站》网上购买地址:https://item.j
Stella981 Stella981
2年前
DevOps工具介绍连载(6)——Capistrano
顾翔老师近期推出一对一入职面试辅导。有兴趣者可加微信xianggu19720625与我联系。先要提供简历初选,合适者进一步洽谈。顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:https://item.jd.com/34295655089.html《基于Django的电子商务网站》网上购买地址:https://item.j
Stella981 Stella981
2年前
DevOps工具介绍连载(12)——VMware&AMI(亚马逊云机器镜像)&Docker
顾翔老师近期推出一对一入职面试辅导。有兴趣者可加微信xianggu19720625与我联系。先要提供简历初选,合适者进一步洽谈。顾翔老师的《软件测试技术实战设计、工具及管理》网上购买地址:https://item.jd.com/34295655089.html《基于Django的电子商务网站》网上购买地址:https://item.j
Python进阶者 Python进阶者
1个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这