我同意@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. 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)
我经常使用smartystreets goconvey和assertions包。虽然stdlib提供了大部分你需要的东西,但我认为它缺乏“生活质量”功能。
goconvey包将为您提供一个漂亮的Web浏览器界面,具有热重载功能。每次更新时,它都会重新运行。您还可以选择性地选择要运行的内容。因此,我通常在另一个控制台中打开它,同时编码时弹出一个浏览器选项卡。它还使查看代码覆盖率变得简单方便。
组织和嵌套测试用例也变得容易,并且在Web浏览器中呈现得很好。
当然,assertions包只是为您提供了一些快捷方式。
我发现这节省了很多样板和时间。否则,我将为每个项目编写完全相同的内容。
它还使您的测试更加一致。如果您拥有断言和工具库,则在构建另一个测试时,您将首先使用其中一个,而不是构建一个自定义模式,然后在另一个测试中偏离。很容易最终得到混乱、难以阅读的测试。
还有其他的包可以帮助测试API和HTTP请求。因此,就像其他人所说的那样,您可以从头开始编写,也可以使用一个处理样板的包。它可以使您的测试更短、更干净。
那么,“什么样的测试?” 在我的经验中,几乎所有的测试都是有益的。我总是从其他包中受益。但要记住的重要一点是,所有这些都是建立在已经强大的Golang测试基础之上的。我喜欢Golang胜过其他语言的一个原因是因为它已经包含了大部分东西。我不需要添加任何缺失的东西,我只是根据自己的工作流程和偏好进行增强。然后下一个运行我的包的人实际上可以自由地使用CLI而无需在浏览器中运行goconvey。所以偏好部分保持偏好。这在其他地方并不太常见。