<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go Fiber 框架系列教程 04:測(cè)試應(yīng)用

          共 2523字,需瀏覽 6分鐘

           ·

          2021-10-21 10:54

          閱讀本文大概需要 5 分鐘。

          大家好,我是 polarisxu。

          實(shí)際項(xiàng)目中,大家經(jīng)常不會(huì)對(duì) Web API 寫(xiě)單元測(cè)試。Go 標(biāo)準(zhǔn)庫(kù)不僅有 testing 包支持普通單元測(cè)試,還有 net/http/httptest 包支持 HTTP 的測(cè)試。

          本文雖然是測(cè)試 Fiber 應(yīng)用程序,但對(duì)其他的框架也適用。

          01 如何測(cè)試

          Web API 的單元測(cè)試如何進(jìn)行?

          本節(jié)介紹的測(cè)試方法主要是驗(yàn)證請(qǐng)求返回的 HTTP 狀態(tài)碼是否符合預(yù)期。

          如果返回的狀態(tài)碼是 200 OK,那么表示這個(gè)測(cè)試用例成功(Pass),如果返回的狀態(tài)碼是 404 Not Found,那么表示這個(gè)測(cè)試用例失?。‵ail)。所以,要求請(qǐng)求返回正確的狀態(tài)碼。

          02 VSCode 生成測(cè)試

          VSCode 安裝了 Go Team 的 Go 插件后,可以一鍵生成單元測(cè)試。

          在某個(gè)函數(shù)上右鍵,出現(xiàn)的菜單中會(huì)有 Generate Unit Tests For Function

          點(diǎn)擊它會(huì)自動(dòng)創(chuàng)建 main_test.go 文件,并生成類(lèi)似下面的代碼:

          package?main

          import?"testing"

          func?Test_main(t?*testing.T)?{
          ?tests?:=?[]struct?{
          ??name?string
          ?}{
          ??//?TODO:?Add?test?cases.
          ?}
          ?for?_,?tt?:=?range?tests?{
          ??t.Run(tt.name,?func(t?*testing.T)?{
          ???main()
          ??})
          ?}
          }

          03 動(dòng)手寫(xiě)單元測(cè)試

          動(dòng)手之前,需要先介紹下 Fiber 中專(zhuān)門(mén)針對(duì)測(cè)試提供的方法:

          //?Test?is?used?for?internal?debugging?by?passing?a?*http.Request.
          //?Timeout?is?optional?and?defaults?to?1s,?-1?will?disable?it?completely.
          func?(app?*App)?Test(req?*http.Request,?msTimeout?...int)?(resp?*http.Response,?err?error)

          該方法接收一個(gè) *http.Request,返回 *http.Response,通過(guò)這個(gè) Response 可以獲得 HTTP StatusCode。

          待測(cè)試的程序如下:

          //?main.go
          package?main

          import?(
          ?"github.com/gofiber/fiber/v2"
          )

          func?setupRoutes(app?*fiber.App)?{
          ?app.Get("/hello",?func(ctx?*fiber.Ctx)?error?{
          ??return?ctx.SendString("Hello?World!")
          ?})
          }

          func?main()?{
          ?app?:=?fiber.New()
          ?setupRoutes(app)
          ?app.Listen(":3000")
          }

          測(cè)試程序如下:

          package?main

          import?(
          ?"net/http/httptest"
          ?"testing"

          ?"github.com/gofiber/fiber/v2"
          ?"github.com/stretchr/testify/assert"
          )

          func?TestHelloRoute(t?*testing.T)?{
          ?tests?:=?[]struct?{
          ??description??string
          ??route????????string?//?route?path?to?test
          ??expectedCode?int????//?expected?HTTP?status?code
          ?}{
          ??{
          ???description:??"get?HTTP?status?200",
          ???route:????????"/hello",
          ???expectedCode:?200,
          ??},
          ??{
          ???description:??"get?HTTP?status?404,?when?route?is?not?exists",
          ???route:????????"/notfound",
          ???expectedCode:?404,
          ??},
          ?}

          ?app?:=?fiber.New()

          ?setupRoutes(app)

          ?for?_,?test?:=?range?tests?{
          ??//?利用?httptest?包生成?request
          ??req?:=?httptest.NewRequest("GET",?test.route,?nil)
          ??resp,?_?:=?app.Test(req,?1)
          ??assert.Equalf(t,?test.expectedCode,?resp.StatusCode,?test.description)
          ?}
          }

          我們還用了 github.com/stretchr/testify 庫(kù),這是一個(gè)輔助測(cè)試的庫(kù),assert 是它的子包,用于進(jìn)行斷言。

          然后運(yùn)行如下命令測(cè)試:

          $?go?test?-v?.
          ===?RUN???TestHelloRoute
          ---?PASS:?TestHelloRoute?(0.00s)
          PASS
          ok???github.com/polaris1119/fiber-example

          04 總結(jié)

          本文從 HTTP 狀態(tài)碼的維度測(cè)試 Web API,保證 API 大的邏輯正確,但不包括業(yè)務(wù)邏輯相關(guān)的測(cè)試。




          往期推薦


          福利

          我為大家整理了一份從入門(mén)到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門(mén)看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲??;還可以回復(fù)「進(jìn)群」,和數(shù)萬(wàn) Gopher 交流學(xué)習(xí)。

          瀏覽 100
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  99久久精品国产一区色 | 初尝人妻滑进去了 | 国产女主播桃花视频 | 福利十八禁免费网站 | 91高潮视频 |