1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 2523字,需瀏覽 6分鐘

         ·

        2021-10-21 10:54

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

        大家好,我是 polarisxu。

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

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

        01 如何測試

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

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

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

        02 VSCode 生成測試

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

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

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

        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)手寫單元測試

        動(dòng)手之前,需要先介紹下 Fiber 中專門針對測試提供的方法:

        //?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,通過這個(gè) Response 可以獲得 HTTP StatusCode。

        待測試的程序如下:

        //?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")
        }

        測試程序如下:

        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 庫,這是一個(gè)輔助測試的庫,assert 是它的子包,用于進(jìn)行斷言。

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

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

        04 總結(jié)

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




        往期推薦


        福利

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

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产精品久久久电影 | 国产又粗又猛又大爽又黄同志 | 美女被操的视频在线观看 | 国产一区二区三区中文字幕 | Aa黄片色黄 | 亚州成熟少妇视频在线观看 | 内射无码视频 | 久久精品视频免费 | 人人操人人摸在线 | 操逼AV最新地址大全 |