大家好,我是polarisxu。在实际项目中,人们往往不会为WebAPI编写单元测试。Go标准库不仅有支持常见单元测试的testing包,还有支持HTTP测试的net/http/httptest包。虽然本文测试的是Fiber应用程序,但它也适用于其他框架。01如何测试WebAPI的单元测试?本节介绍的测试方法主要是验证请求返回的HTTP状态码是否符合预期。如果返回的状态码为200OK,则表示测试用例成功(Pass),如果返回的状态码为404NotFound,则表示测试用例失败(Fail)。因此,要求请求返回正确的状态码。02VSCode生成测试VSCode安装GoTeam的Go插件后,可以一键生成单元测试。右击某个函数,出现的菜单中会有GenerateUnitTestsForFunction:点击会自动创建main_test.go文件,生成类似如下代码:T){tests:=[]struct{namestring}{//TODO:Addtestcases.}for_,tt:=rangetests{t.Run(tt.name,func(t*testing.T){main()})}}03手写在开始单元测试之前,需要先介绍一下Fiber中提供的专门用于测试的方法://Testisusedforinternaldebuggingbypassinga*http.Request.//Timeoutisoptionalanddefaultsto1s,-1willdisableitcompletely.func(app*App)Test(req*http.Request,msTimeout...int)(resp*http.Response,errerror)该方法接收一个*http.Request并返回*http.Response,通过这个Response可以得到HTTPStatusCode。待测程序如下://main.gopackagemainimport("github.com/gofiber/fiber/v2")funcsetupRoutes(app*fiber.App){app.Get("/hello",func(ctx*fiber.ctx)error{returnctx.SendString("HelloWorld!")})}funcmain(){app:=fiber.New()setupRoutes(app)app.Listen(":3000")}测试过程如下:packagemainimport("net/http/httptest""testing""github.com/gofiber/fiber/v2""github.com/stretchr/testify/assert")funcTestHelloRoute(t*testing.T){tests:=[]struct{descriptionstringroutestring//routepathtotestexpectedCodeint//expectedHTTPstatuscode}{{description:"getHTTPstatus200",route:"/hello",expectedCode:200,},{description:"getHTTPstatus404,whenrouteisnotexists",route:"/notfound",expectedCode:404,},}app:=fiber.New()setupRoutes(app)for_,test:=rangetests{//使用httptest包生成requestreq:=httptest.NewRequest("GET",test.route,nil)resp,_:=app.Test(req,1)assert.Equalf(t,test.expectedCode,resp.StatusCode,test.description)}}我们还使用了github.com/stretchr/testify这个库,这是一个辅助测试的库,assert是它的子包,用来做断言,然后运行下面的命令test:$gotest-v.===RUNTestHelloRoute---PASS:TestHelloRoute(0.00s)PASSokgithub.com/polaris1119/fiber-example04总结本文从HTTP状态码的维度对WebAPI进行测试,确保逻辑正确API的部分是正确的,但不包括与业务逻辑相关的测试。本文转载自微信公众号「polarisxu」,可通过以下二维码关注。转载本文请联系polarisxu公众号。
