Golang HTTP Handler测试

谢权 · · 3590 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

当你用Go写了一个Http的web服务之后,也许你想通过单元测试来测试你的handler函数。虽然你已经使用了Go的net/http 包。也许你不太确定从哪里开始测试,也不知道如何正确处理程序返回的数据比如:HTTP status codes,HTTP headers或者response bodies。

让我们看看Go语言是如何实现这些呢,比如:依赖注入和模拟REST。

一个简单的Handler

我们先开始写一个简单的测试示例:我们要确保我们的handler返回一个http 状态码为200的HTTP请求。

handler代码:

测试代码:

我们可以看到使用Go的testing and httptest 包来测试我们的handler非常的简单。我们构造一个  *http.Request,和一个*httptest.ResponseRecorder,然后检查我们handler返回的:status code, body

还可以通过httptest.NewServer:

如果我们的handler还需要一些特定的请求参数,或者特定的headers。我们可以通过下面方式测试:

如果我们想更进一步的测试我们handler特殊的请求或者中间件的话。你可以在内部定义一个匿名函数来捕捉外部声明的变量:

提示:要让字符串像application/json 或者 Content-Type一样的包常量,这样你就不会一遍一遍把它们输错。一个输入错误可能会造成意想不到的结果,因为你测试的东西和你想的东西不是一样的。

你应确保你的测试不仅仅是成功的,而且失败之后:你所测试的hanlder应该返回错误信息比如(HTTP 403, or a HTTP 500)

测试中使用context.Context

如果我们的handler通过context.Context传递数据会怎样?我们如何创建一个上下文呢?比如身份验证的token或者我们用User类型。

假设:提供自定义处理程序类型ServeHTTPC(context.Context, http.ResponseWriter, *http.Request). Go 1.7将会添加context.Context to http.Request

注意接下来的示例:我使用了Goji mux/router作为context.Context作为兼容处理方式。这种方法使用context.Context.可以用于任何路由/多路复用器/框架。

 模拟数据库调用

接下来的代码我们handlers通过datastore.ProjectStore(一个接口类型)的三种方法(Create, Get, Delete)来模拟测试handlers返回正确的状态码。

这个例子有点复杂,但是也告诉了我们:

  • 去掉我们的数据库实现: 我们不需要为单元测试准备测试数据库
  • 创建一个存根,故意抛出错误,这样我们可以测试我们的handlers正确的状态代码(如HTTP 500)和或写预期response
  • 我们如何创建一个正确的*datastore.Project和测试。

参考文献:

Testing Your (HTTP) Handlers in Go

 

 

 

Golang HTTP Handler测试

有疑问加站长微信联系(非本文作者)

本文来自:谢权SELF

感谢作者:谢权

查看原文:Golang HTTP Handler测试

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3590 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传