iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golanghttptest包测试使用教程
  • 550
分享到

Golanghttptest包测试使用教程

Gohttptest请求Gohttptest包 2023-03-15 11:03:12 550人浏览 八月长安
摘要

目录测试Http服务端处理器httptest.ResponseRecorder测试HTTP客户端使用 httptest.Server总结当前首次学习到golang httptest包

当前首次学习golang httptest包时,着实打动了我。其他语言测试HTTP服务需要做很多工作或引用第三方工具,让人不可思议的是,Golang标准库就提供了非常容易理解的测试包。本文介绍httptest包的使用,为你Go http服务构建更好的端到端的测试。

httptest包的理念是,非常容易模拟http服务,也就是说模拟响应写(response writer),提供给http处理器(handle),让我们测试http服务端和客户端很容易。

本文主要介绍两个使用httptest的特定场景: 测试http server处理器,测试http客户端。

测试http服务端处理器

下面通过示例介绍http server的测试。首先看http服务程序,把请求字符串转为大写:

package main
import (
    "fmt"
    "log"
    "net/http"
    "net/url"
    "strings"
)
// Req: http://localhost:1234/upper?Word=abc
// Res: ABC
func upperCaseHandler(w http.ResponseWriter, r *http.Request) {
    query, err := url.ParseQuery(r.URL.RawQuery)
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintf(w, "invalid request")
        return
    }
    word := query.Get("word")
    if len(word) == 0 {
        w.WriteHeader(http.StatusBadRequest)
        fmt.Fprintf(w, "missing word")
        return
    }
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, strings.ToUpper(word))
}
func main() {
    http.HandleFunc("/upper", upperCaseHandler)
    log.Fatal(http.ListenAndServe(":1234", nil))
}

现在想测试http server使用的upperCaseHandler逻辑,我们需要准备两方面:

  • 使用httptest.NewRequest暴露的函数创建http.Request对象,NewRequest返回Request, 可以传给http.Handler进行测试.
  • 使用httptest.NewRecorder函数创建http.ResponseWriter,返回httptest.ResponseRecorder。ResponseRecorder是

http.ResponseWriter 的实现,它记录变化为了后面测试检查.

httptest.ResponseRecorder

httptest.ResponseRecorder是 http.ResponseWriter 的实现,可以传给http server handle,记录所有处理并写回响应的数据,下面测试程序可以看到其如何实现:

package main
import (
    "io/ioutil"
    "net/http"
    "net/http/httptest"
    "testing"
)
func TestUpperCaseHandler(t *testing.T) {
    req := httptest.NewRequest(http.MethodGet, "/upper?word=abc", nil)
    w := httptest.NewRecorder()
    upperCaseHandler(w, req)
    res := w.Result()
    defer res.Body.Close()
    data, err := ioutil.ReadAll(res.Body)
    if err != nil {
        t.Errorf("expected error to be nil got %v", err)
    }
    if string(data) != "ABC" {
        t.Errorf("expected ABC got %v", string(data))
    }
}

上面示例中首先定义请求和响应,然后传入处理器进行测试。然后检查ResponseRecorder的Result方法输出:

func (rw *ResponseRecorder) Result() *http.Response

Result返回处理器生成的响应。返回相应至少有StatusCode, Header, Body, 以及可选其他内容,未来可能会填充更多字段,所以调用者在测试中不应该深度比较相等。

测试HTTP客户端

测试服务端处理器相对容易,特别当测试处理器逻辑时,仅需要在测试中模拟http.ResponseWriter 和 http.Request对象。对于HTTP客户端测试,情况稍晚有点复杂。原因是有时不容易模拟或复制整个HTTP Server,请看下面示例:

package main
import (
    "io/ioutil"
    "net/http"
    "GitHub.com/pkg/errors"
)
type Client struct {
    url string
}
func NewClient(url string) Client {
    return Client{url}
}
func (c Client) UpperCase(word string) (string, error) {
    res, err := http.Get(c.url + "/upper?word=" + word)
    if err != nil {
        return "", errors.Wrap(err, "unable to complete Get request")
    }
    defer res.Body.Close()
    out, err := ioutil.ReadAll(res.Body)
    if err != nil {
        return "", errors.Wrap(err, "unable to read response data")
    }
    return string(out), nil
}

client需要url,表示远程服务端基地址。然后调用/upper,带上输入单词,最后返回结果字符串给调用者,如果调用不成功还返回错误对象。为了测试这段代码,需要模拟整个http服务端逻辑,或至少是响应请求路径:/upper。使用httptest包可以模拟整个http 服务,通过初始化本地服务,监听回环地址并返回你想要的任何内容。

使用 httptest.Server

通过调用httptest.NewServer函数生成我们想要的 httptest.Server。表示http服务,监听回环地址及可选的端口号,用于实现端到端HTTP测试。

func NewServer(handler http.Handler) *Server

NewServer 启动并返回新的HTTP服务,调用者使用完成后应该调用Close方法结束服务。下面通过示例进行解释:

package main
import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "strings"
    "testing"
)
func TestClientUpperCase(t *testing.T) {
    expected := "dummy data"
    svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, expected)
    }))
    defer svr.Close()
    c := NewClient(svr.URL)
    res, err := c.UpperCase("anything")
    if err != nil {
        t.Errorf("expected err to be nil got %v", err)
    }
    // res: expected\r\n
    // due to the http protocol cleanup response
    res = strings.TrimSpace(res)
    if res != expected {
        t.Errorf("expected res to be %s got %s", expected, res)
    }
}

上面示例中使用httptest.NewServer函数创建了模拟http服务器,给它传入自定义模拟处理器,总是返回相同的数据。并使用服务端url作为客户端请求url,从而模拟并让服务端返回任何我们想测试的内容。

当然我们可以修改处理器,让其返回我们期望的逻辑:

func TestClientUpperCase(t *testing.T) {
	svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		query, err := url.ParseQuery(r.URL.RawQuery)
		if err != nil {
			w.WriteHeader(http.StatusBadRequest)
			fmt.Fprintf(w, "invalid request")
			return
		}
		word := query.Get("word")
		if len(word) > 0 {
			fmt.Fprintf(w, strings.ToUpper(word))
		} else {
			fmt.Fprintf(w, "no input")
		}
	}))
	defer svr.Close()
	expected := "ANYTHING"
	c := NewClient(svr.URL)
	res, err := c.UpperCase("anything")
	if err != nil {
		t.Errorf("expected err to be nil got %v", err)
	}
	// res: expected\r\n
	// due to the http protocol cleanup response
	res = strings.TrimSpace(res)
	if res != expected {
		t.Errorf("expected res to be %s got %s", expected, res)
	}
}

总结

本文介绍httptest包,可以很方便测试http服务端处理逻辑,以及模拟http服务端测试客户端请求逻辑。由于很方面模拟,从而可以把一组参数和期望值进行组合,循环进行测试并对比结果,可以极大地提升测试效率。

到此这篇关于Golang httptest包测试使用教程的文章就介绍到这了,更多相关Go httptest内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Golanghttptest包测试使用教程

本文链接: https://www.lsjlt.com/news/199909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golanghttptest包测试使用教程
    目录测试http服务端处理器httptest.ResponseRecorder测试HTTP客户端使用 httptest.Server总结当前首次学习到Golang httptest包...
    99+
    2023-03-15
    Go httptest请求 Go httptest包
  • 使用mockito编写测试用例教程
    目录前言什么是TDD为什么要使用mockito如何使用mockito前期准备包装你要模拟的类什么插桩验证行为参数匹配验证调用次数模拟void方法验证调用顺序doReturn()|do...
    99+
    2022-11-13
  • ***测试实践教程3
    特别声明:本文仅供在校大学生个人学习信息安全知识,不可用于其他用途。转载本文须声明来源,并引述本声明。网络数据分析利器——Wireshark 1我们从Wireshark的安装开始讲起……1.0 安装WiresharkWireshark提供了...
    99+
    2023-01-31
    测试 教程
  • ChatGPT使用学习(二):ChatPaper安装到测试详细教程(一文包会)
    ChatPaper 1.简介及功能2.前置准备3.开始使用-命令行4.开始使用-网页 1.简介及功能        ChatPaper是一种基于文本生成技术的研究论文,可以根据用户的输入进...
    99+
    2023-09-21
    chatgpt 学习 python
  • Golang httptest包测试如何使用
    这篇“Golang httptest包测试如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang&nb...
    99+
    2023-07-05
  • ApacheJMeter压力测试工具使用安装教程
    目录JMeter的使用安装及设置下载启动切换语言环境简单使用1.新建线程组2.线程组配置3.新建HTTP请求4.配置HTTP请求5.配置监听器6.运行JMeter的使用 安装及设置 ...
    99+
    2022-11-12
  • Go语言自带测试库testing使用教程
    目录简介单元测试表格驱动测试分组和并行主测试函数其他性能测试其他选项示例测试总结简介 testing是 Go 语言标准库自带的测试库。在 Go 语言中编写测试很简单,只需要遵循 Go...
    99+
    2022-11-13
  • 前端单元测试之UI测试功能性代码测试教程
    目录前言UI测试:功能性代码测试:让人闻风丧胆的单元测试代码测试代码Jest介绍一、基础教程安装源码开发测试用例编写开始测试二、核心API全局方法匹配器异步代码测试回调Promise...
    99+
    2022-11-13
    前端单元测试 前端UI测试 前端功能性代码测试
  • oracle怎么测试包,用ORACLE自带包测试FUSIONIO的IOPS
    要测试Oracle自带包和FusionIO的IOPS,可以按照以下步骤进行操作:1. 确定测试环境:确保已经安装了Oracle数据库...
    99+
    2023-09-21
    oracle
  • google c++程序测试框架googletest使用教程详解
    目录什么是googletest?googletest简介谁在使用 GoogleTest?相关开源项目googletest的下载与编译cmake gui编译在vs2019中使用...
    99+
    2022-11-12
  • PostMan接口测试(很全面的接口测试教程)
    一:理论部分 1. 前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上,都无法及时完成功能模块的测试。 ​ 做...
    99+
    2023-09-16
    postman python 测试工具
  • SpringBoot使用@SpringBootTest注解开发单元测试教程
    目录概述1.添加依赖:2. 编写启动入口类3. 编写Controller类4. 编写service类5. 编写mapper类6. 编写测试类7.测试结果:概述 @SpringBoot...
    99+
    2022-11-12
  • 测试Windows10内存图文教程
    如何在Windows10上测试内存?近期有许多用户询问如何测试Windows10的内存。在这里,小编愿意与需要帮助的朋友分享关于如何测试Windows10内存的操作方法,希望能对他们有所帮助。许多Win10用户纠结于如何进行Windows1...
    99+
    2023-07-12
  • android手机的monkey测试教程
      Monkey是一个命令行工具 ,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流,实现对正在开发的应用程序进行压力测试。Monkey包括许多选项,它们大致...
    99+
    2022-06-06
    monkey测试 教程 Android
  • Python测试开源工具splinter安装与使用教程
    splinter介绍   Splinter是一个使用Python测试Web应用程序的开源工具,可以自动化浏览器操作,例如访问URL和与它们的项进行交互。例如,我们使用百度引擎搜索内容,需要再搜...
    99+
    2022-06-02
    python splinter安装与使用 python splinter安装
  • 详解Java单元测试之Junit框架使用教程
    目录单元测试Junit单元测试框架单元测试快速入门单元测试 单元测试就是针对最小的功能单元编写测试代码,Java程序最小的功能单元是方法,因此,单元测试就是针对Java方法的测试,进...
    99+
    2022-11-13
  • Jmeter压力测试简单教程(包括服务器状态监控)
    目录步骤一  安装Jmeter步骤二  使用Jmeter测试未登录页面步骤三  设置线程并发数步骤四  设置其他监听器步骤五  登录测试步骤六  会话保持步骤七  文件读取网址步骤八...
    99+
    2022-11-12
  • tpcc-mysql专用于MySQL基准测试教程
    下文我给大家简单讲讲关于tpcc-mysql专用于MySQL基准测试教程,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完tpcc-mysql专用于MySQL基准测试教程对大家多...
    99+
    2022-10-18
  • 全网最全最细的jmeter接口测试教程以及接口测试流程(入门教程)
    目录一、Jmeter简介二、Jmeter安装三、设置Jmeter语言为中文环境四、Jmeter主要元件五、Jmeter元件的作用域和执行顺序六、Jmeter进行接口测试流程七、Jme...
    99+
    2022-11-12
  • 软件测试要学什么(1)黑盒测试详解教程
      黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作