首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写HTTP中间件单元测试的最佳方法

编写HTTP中间件单元测试的最佳方法
EN

Software Engineering用户
提问于 2015-12-04 06:20:20
回答 1查看 776关注 0票数 2

我正在使用这个围棋库(https://github.com/abourget/goproxy)来创建一个定制的代理服务器应用程序。该应用程序使用了以下几种中间件:

代码语言:javascript
复制
MyMiddlewarFunc(ctx *goproxy.ProxyCtx) goproxy.Next {
    if ctx.Req.Header.Get("If-None-Match") == "test"{
       //do something
    }
}

现在,我正在尝试为这些中间件函数编写单元测试。以下是我可以想到的两种可能的不同方法:

  1. 编写测试函数,使用定制的“goproxy.ProxyCtx”实例调用这些中间件,并在该结构中插入所需的虚拟数据。这看起来类似于:func TestMyMiddlewarFunc() { ctx = &goproxy.ProxyCtx{} ctx.Req.Header.Set("If-None-Match", "test") ctx.Req.Header.Set("If-Modified-Since", "test") MyMiddlewarFunc(ctx) //verify if changes are done according to logic } Pros:这种方法似乎适用于大多数情况,编写起来很简单。缺点:有一个问题:由于ctx数据结构来自第三方,有时很难知道需要在其中设置什么样的数据才能正确地触发/执行某件事情。例如,在中间件中,我调用'ctx.DispatchResponseHandlers‘方法,但它会引发运行时错误,最可能的原因是在传递实例时设置不正确。
  2. 创建一个测试http服务器,处理中间件,并发送一个自定义请求,该请求将触发中间件内部的机制,然后验证响应/内部,以查看是否存在更改。func TestMyMiddlewarFunc() { proxyServer := goproxy.NewProxyHttpServer() proxyServer.HandleFunc(MyMiddlewarFunc) S := httptest.NewServer(proxyServer) client := &http.Client{} req,_ := http.NewRequest("GET",s.URL+"/foo",nil) req.Header.Set(“原产地”,"foo") resp,err := client.Do(req) //verify resp } Pros:第二种方法似乎处理了以前方法所面临的问题。缺点:
    • 有更多的设置管理费用。
    • 由于它们之间有几种不同的中间件和依赖项,因此需要使用几种不同的模拟方法来处理这些依赖项,这使得它们的结构更加复杂。
    • 而且,它具有集成测试的味道,但实际上它应该是单元测试。

所以,我很想知道你会选择哪种方法,为什么?一些细节来支持你的选择将是很好的。

EN

回答 1

Software Engineering用户

发布于 2015-12-04 10:31:22

在我看来,1号和2号都不会给你单元测试。虽然单元测试和集成测试之间没有客观的区别,但是一个包含一些您自己的代码和一些您不拥有的代码的测试可能更多地被认为是集成。

由于Go支持一流的函数,将示例转换为支持实际单元测试的最简单方法是更改以下内容:

代码语言:javascript
复制
MyMiddlewarFunc(ctx *goproxy.ProxyCtx) goproxy.Next {
    if ctx.Req.Header.Get("If-None-Match") == "test"{
       //do something
    }
}

更像是这样的:

代码语言:javascript
复制
MyMiddlewarFunc(ctx *goproxy.ProxyCtx, doSomething func()) goproxy.Next {
    if ctx.Req.Header.Get("If-None-Match") == "test"{
       doSomething();
    }
}

现在,您可以轻松地为doSomething传入的任何函数编写一个测试,它不需要知道任何关于goproxy的信息。这可能是一个真正的单元测试(假设doSomething()相当简单)。

这并不是说您所描述的两种类型的集成测试是不可取的。事实上,你应该有一些。但是,您的目标应该是拥有更多的单元测试,而不是集成测试,因为单元测试的规模往往要好得多,并且不那么脆弱。至于您的集成测试应该是类型1还是类型2,我同意Robert的意见:1工作时使用1,2工作时使用2。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/304238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档