使用Golang进行API测试

16

我知道 Golang 有一个测试包,它可以运行单元测试。这对于在单元测试中内部调用 Golang 函数似乎很有效,但是一些人试图将其改装为API 测试也是如此。

鉴于像 Node.js 的 Mocha 和 Chai 断言库这样的自动化测试框架具有很大的灵活性,那么使用 Golang 的测试包进行哪种类型的测试,在什么情况下更加合理呢?

谢谢。


继续阅读有关GoLang的stdlib测试的内容:https://golang.org/pkg/net/http/httptest/ - eduncan911
4个回答

5

我同意@eduncan911的评论。更具体地说,您可以通过确保处理程序接受一个来设计具有测试功能的API

http.ResponseWriter

作为参数,除了适当的请求外。此时您将准备好声明一个新请求:
req, err := http.NewRequest("GET", "http://example.com", nil)

除此之外,还有一个新的httptest录制器:

recorder := httptest.NewRecorder()

然后向您的处理程序发出新的测试请求:

yourHandler(recorder, req)

这样你就可以最终检查记录器中的错误或其他问题了:

if recorder.Code != 200 {
  //do something
}

1
Niko - 你的意思是说,Golang内置的测试包足够强大、稳健且易于使用,适用于所有类型的测试,因此我不需要考虑其他解决方案? - Spikey
是的 - 就 API 测试而言,它对我来说一直表现良好。 - daplho
2
测试处理程序是可以的,但这并不能测试处理程序是否被最终应用程序实际使用,也不能测试路由是否正常工作。 - Renra
1
虽然我觉得这个答案很有趣,但我认为通过构建 API 调用代码的结构,可以方便地绕过测试处理程序。实际的代码将按照通常的方式进行单元测试,而处理程序本身只是一个非常小的集成层。 - Marcello Romani

2

要进行虚拟请求,您首先需要初始化路由器,然后设置服务器,之后再进行请求。步骤如下:

1. router := mux.NewRouter() //initialise the router
2. testServer := httptest.NewServer(router) //setup the testing server
3. request,error := http.NewRequest("METHOD","URL",Body)
4. // We create a ResponseRecorder (which satisfies http.ResponseWriter) to record the response.
        resp := httptest.NewRecorder()
5. handler := http.HandlerFunc(functionname)
// Our handlers satisfy http.Handler, so we can call their ServeHTTP method
// directly and pass in our Request and ResponseRecorder.
        handler.ServeHTTP(resp, req)

0

我经常使用smartystreets goconvey和assertions包。虽然stdlib提供了大部分你需要的东西,但我认为它缺乏“生活质量”功能。

goconvey包将为您提供一个漂亮的Web浏览器界面,具有热重载功能。每次更新时,它都会重新运行。您还可以选择性地选择要运行的内容。因此,我通常在另一个控制台中打开它,同时编码时弹出一个浏览器选项卡。它还使查看代码覆盖率变得简单方便。

组织和嵌套测试用例也变得容易,并且在Web浏览器中呈现得很好。

当然,assertions包只是为您提供了一些快捷方式。

我发现这节省了很多样板和时间。否则,我将为每个项目编写完全相同的内容。

它还使您的测试更加一致。如果您拥有断言和工具库,则在构建另一个测试时,您将首先使用其中一个,而不是构建一个自定义模式,然后在另一个测试中偏离。很容易最终得到混乱、难以阅读的测试。

还有其他的包可以帮助测试API和HTTP请求。因此,就像其他人所说的那样,您可以从头开始编写,也可以使用一个处理样板的包。它可以使您的测试更短、更干净。

那么,“什么样的测试?” 在我的经验中,几乎所有的测试都是有益的。我总是从其他包中受益。但要记住的重要一点是,所有这些都是建立在已经强大的Golang测试基础之上的。我喜欢Golang胜过其他语言的一个原因是因为它已经包含了大部分东西。我不需要添加任何缺失的东西,我只是根据自己的工作流程和偏好进行增强。然后下一个运行我的包的人实际上可以自由地使用CLI而无需在浏览器中运行goconvey。所以偏好部分保持偏好。这在其他地方并不太常见。


0

链接无效。 - NlaakALD
1
链接已修复。您现在可以访问了。 - Cyro Dubeux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接