文档章节

go test常见套路(2)

guonaihong
 guonaihong
发布于 09/20 09:14
字数 679
阅读 39
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

上回聊到,golang 里面写一个简单的测试函数,和 benchmark 函数,如何检测测试代码覆盖度。 这回聊下如何编写 http server 测试代码。如果写过 API 服务的童鞋都知道。 测试服务端代码要先起个服务,再运行客户端代码。有没有办法和 go test 方法结合再一起,可以很快乐的编写服务端测试代码呢?

标准库服务端测试代码

先使用httptest.NewServer声明一个mock服务ts,再使用ts.URL给客户端用就行

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httptest"
)

func main() {
    // 启动一个测试服务
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello, client")
	}))
	defer ts.Close()

    // 关键一步, 客户端完全使用标准套路url 使用ts.URL就行
	res, err := http.Get(ts.URL)
	if err != nil {
		log.Fatal(err)
	}
	greeting, err := ioutil.ReadAll(res.Body)
	res.Body.Close()
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("%s", greeting)
}

gin 框架测试代码

使用gin和标准库相比多了一步,需要把gin.Engine。转成 http.Handle func(w http.ResponseWriter, r *http.Request)类型 其实这个类型就藏在gin.Engine.ServeHTTP 成员里面

func TestShouldBindXML(t *testing.T) {
	var d, d2 data
	router := func() *gin.Engine {
		router := gin.Default()

		router.POST("/test.xml", func(c *gin.Context) {
			var d3 data
			err := c.ShouldBindXML(&d3)
			assert.NoError(t, err)
			c.XML(200, d3)
		})
		return router
	}()

    // 这里是gin和http标准库的区别,需要拿到gin.Engine的ServeHTTP函数
	ts := httptest.NewServer(http.HandlerFunc(router.ServeHTTP))
	defer ts.Close()

	g := New(nil)

	d.Id = 3
	d.Data = "test data"

	code := 200

	err := g.POST(ts.URL + "/test.xml").SetXML(&d).BindXML(&d2).Code(&code).Do()

	assert.NoError(t, err)
	assert.Equal(t, code, 200)
	assert.Equal(t, d, d2)
}

基于 func(w http.ResponseWriter, r *http.Request) 编写测试代码

这个方法应用场景在编写一些库的时候会用到,只想模拟一个服务端跑 http handle 函数,里面可以设置 http header 等返回属性。然后客户端直接获得*http.Response 对象操作。可以理解为这是一个很薄薄的服务端测试写法

func TestHeaderDecode(t *testing.T) {
	h := headerDecode{}

	type tHeader struct {
		Limit      int           `header:"limit"`
		F64        float64       `header:"f64"`
		F32        float32       `header:"f32"`
		CreateTime time.Time     `header:"createTime" time_format:"unixNano"`
		UnixTime   time.Time     `header:"unixTime" time_format:"unix"`
		Duration   time.Duration `header:"duration"`
	}

	var theader tHeader

    // 和正常的服务端回调函数一样
	okFunc := func(w http.ResponseWriter, r *http.Request) {
		w.Header().Add("limit", "1000")
		w.Header().Add("f64", "64")
		w.Header().Add("f32", "32.1")
		w.Header().Add("createTime", "1562400033000000123")
		w.Header().Add("unixTime", "1562400033")
		w.Header().Add("duration", "1h1s")
	}

    // 主要构造出http.Request对象
	req := httptest.NewRequest("GET", "http://example.com/foo", nil)
    // 构造出http.ResponseWriter对象
	w := httptest.NewRecorder()
    //执行回调函数
	okFunc(w, req)
    //构造出*http.Response对象
	resp := w.Result()

	// todo array slice
	assert.NoError(t, h.Decode(resp, &theader))

}

我的github

https://github.com/guonaihong/gout

© 著作权归作者所有

guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
spring boot多环境配置文件管理

这个网上内容比较多,套路就是使用 spring.profiles.active=dev 目前网上说的比较少的是,不同环境下多个配置文件管理 套路是 spring.profiles.active=dev,test-dev spring boot启动的时候,...

名字要响亮
2018/09/27
114
2
Codechef:Count on a Treap(线段树)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35649707/article/details/83024247 传送门 题解: Treap的中序遍历是按照键值来排序后的序列,两点的lca...

DZYO
2018/10/12
0
0
哈,扯淡下人力,招人

要换我招人,我先看人品,情商,再看文化基础,智商,最后才看技术和经验。 不抗压的,出现矛盾意见时,3分钟就甩脸走人的见多了。哈。我自己也是,逐步适应的,谈论时,不上火,不较真,安心...

中山野鬼
2013/12/07
2.4K
27
微信运营:公众号文章能盈利吗?盘点变现模式

  前言:公众号文章肯定能盈利。   1、文章有哪些形式   先科普介绍都存在哪些形式,   基础的分类:情感/搞笑/资讯/汽车/数码/房产   常见的商业文章:软文/硬广   其他:活动稿...

公众开发运营官网
2018/11/14
0
0
物联网卡的常见套路,你中招了吗?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40798435/article/details/85126635 随着社会的不断进步和科技的发展,物联网技术的运用也变的越来越广泛,...

智宇物联
2018/12/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效

今天我们要说的 AV1 可不是我们平时说的 .AVI 文件格式,它是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源、免版权费的视频编码格式,可以解决H.265昂贵的专利费用和复杂的...

一肥仔
20分钟前
8
0
软件缺陷静态分析 CodeSonar 5.2 新版发布

对于使用C和C++构建安全关键软件的开发团队而言,CodeSonar一直是首选的静态分析解决方案。在近期发行的版本中,CodeSonar通过使用开放标准来扩展其语言覆盖范围,并增加了对Java、C#、Obj...

旋极科技
21分钟前
5
0
数据迁移

1. insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,但要注意insert into select的加锁问题。 2. replace into与insert into on duplicate key update都可...

qiang123
28分钟前
6
0
Linux装Windows系统后还不会激活?3招教你搞定

     相信大家已经发现荣耀MagicBook科技尝鲜版有多“香”了,不但可以轻松的将Linux系统装回Windows系统,还足足省下了300大洋!但是装回系统就万事大吉了吗?NoNoNo,我们还需要去激活...

梅丽莎好
30分钟前
6
0
Tomcat8源码分析-请求处理过程

上一篇:Tomcat8源码分析-启动流程-start方法 此篇主要讲Tomcat8从接收请求到处理请求的时序图画出来,并用文字描述一下主要流程 时序图 说明 文字描述流程之前先提示如下两点: 1.Acceptor...

特拉仔
32分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部