资讯专栏INFORMATION COLUMN

不扯淡,一个简化后的httptest库

godlong_X / 713人阅读

摘要:先不提本库,给个用库写通用测试的方法来源很简单,测试一个方法至少要那么多行代码,还只是简单的请求,至于请求是否加参数,加什么参数,就成了另一个更大的问题。操作要在后,初始化操作要在之前。

先不提本库,给个用net/http/httptest库写通用handler测试的方法(来源):

package handlers

import (
    "net/http"
    "net/http/httptest"
    "testing"
)

func TestHealthCheckHandler(t *testing.T) {
    // Create a request to pass to our handler. We don"t have any query parameters for now, so we"ll
    // pass "nil" as the third parameter.
    req, err := http.NewRequest("GET", "/health-check", nil)
    if err != nil {
        t.Fatal(err)
    }

    // We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response.
    rr := httptest.NewRecorder()
    handler := http.HandlerFunc(HealthCheckHandler)

    // Our handlers satisfy http.Handler, so we can call their ServeHTTP method 
    // directly and pass in our Request and ResponseRecorder.
    handler.ServeHTTP(rr, req)

    // Check the status code is what we expect.
    if status := rr.Code; status != http.StatusOK {
        t.Errorf("handler returned wrong status code: got %v want %v",
            status, http.StatusOK)
    }

    // Check the response body is what we expect.
    expected := `{"alive": true}`
    if rr.Body.String() != expected {
        t.Errorf("handler returned unexpected body: got %v want %v",
            rr.Body.String(), expected)
    }
}

很简单,测试一个方法至少要那么多行代码,还只是简单的get请求,至于请求是否加参数,加什么参数,就成了另一个更大的问题。

本库用法
//一个永远返回400的测试handler
func badHandler(w http.ResponseWriter, r *http.Request) {
    http.Error(w, "not a regular name or password", http.StatusBadRequest)
}

//测试这个handler是否返回400
New("/bad", badHandler, t).Do().CheckCode(http.StatusBadRequest)

//测试他是不是返回200(当然会测试失败)
New("/ok", badHandler, t).Do().CheckCode(http.StatusOK)

//带着header测试
New("/", badHandler, t).Post().AddParams("name", "value1").AddParams("nam22", "value3").Do()

//带着cookie测试,并且判断结果是否包含字符串。
New("/", cookieHandler, t).Get().AddCookies(cookie).Do().BodyContains("testcookievalue")

//获取 *http.ResponseRecorder, 然后自己测试
rr = New("/dump", headerHandler, t).Post().AddParams("name", "value1").Do().ResponseRecorder()

//给请求加参数,不写默认是GET请求
New("/ok", badHandler, t).AddParams("a", "aa").AddParams("b", "bb").Do().CheckCode(http.StatusOK)

//http basic auth:
New("/bad", badHandler, t).SetBasicAuth(username, password).Do().CheckCode(http.StatusBadRequest)

//自己定制 http.Request:
New("/bad", badHandler, t).SetRequest(req).Do().CheckCode(http.StatusBadRequest)

//And more in test file and source code.

必须有 .Do(),才能进行请求,不然不会请求。
Check操作要在.Do()后,初始化操作要在.Do()之前。

其他

库地址:https://github.com/qiuker521/...

后续会增加json测试功能。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/8767.html

相关文章

  • JavaScript Promise启示录

    摘要:近几年随着开发模式的逐渐成熟,规范顺势而生,其中就包括提出了规范,完全改变了异步编程的写法,让异步编程变得十分的易于理解。最后,是如此的优雅但也只是解决了回调的深层嵌套的问题,真正简化异步编程的还是,在端,建议考虑。 本篇,简单实现一个promise,主要普及promise的用法。 一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制...

    Juven 评论0 收藏0
  • [转载·JS] JavaScript Promise启示录

    摘要:近几年随着开发模式的逐渐成熟,规范顺势而生,其中就包括提出了规范,完全改变了异步编程的写法,让异步编程变得十分的易于理解。最后,是如此的优雅但也只是解决了回调的深层嵌套的问题,真正简化异步编程的还是,在端,建议考虑。 前段时间频频看到Promise这个词,今天发现腾讯AlloyTeam写得这篇很赞,遂转之。 原文链接 本篇,主要普及promise的用法。 一直以来,JavaScrip...

    Lyux 评论0 收藏0
  • Apache CVE-2017-7659 漏洞重现及利用分析

    摘要:有漏洞的服务器源码下载链接通过补丁的修改进行漏洞成因的逆向分析。我们编写了的程序,同时发起多个畸形请求,以不断触发后台崩溃,并让服务器不断陷入重新分配的处理之中。 一、实验原理介绍 apache在其网站发布的安全公告,针对CVE-2017-7659漏洞的介绍是这样的: A maliciously constructed HTTP/2 request could cause mod_ht...

    mzlogin 评论0 收藏0
  • vscode-eslint的踩坑实践--typescript无法格式化

    摘要:的踩坑实践无法格式化引言最近开发的前端项目随着开发的人员越来越多,代码规范已经是一个很难避免的问题了,虽然百度有这个规则检查,但是不论是或者是项目本地都没有配置或检查,完全靠自觉,这是件非常扯淡的事。 vscode-eslint的踩坑实践--typescript无法格式化 引言 最近开发的前端项目随着开发的人员越来越多,代码规范已经是一个很难避免的问题了,虽然百度有fecs这个规则检查...

    harryhappy 评论0 收藏0

发表评论

0条评论

godlong_X

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<