Golangプロジェクトでは、APIをどうやってテストしますか?

9778 ワード

この記事は私のブログから始まりました.
簡単に述べる
日常バックエンドの業務開発において、私たちはよくappiを書いて、それからpostmanでテストして利用できるかどうか、直接にラインに落としてしまうかもしれません.ガチョウはこのようにすると非常に厳格ではないです.ほとんどの場合、アプリをテストして、利用性を保証します.プロジェクトで使ったのはhttpexpectです.nodejsのmochaと似ています.ここでは基本的なユニットテストについて紹介しません.golang入門ガイドなどのドキュメントをめくると見られます.
使用
httpexpectは端対端アプリテストツールです.
End-to-end HTTP and REST API testing for Go.
インストール
go get -u -v github.com/gavv/httpexpect
一例
package example

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

  "github.com/gavv/httpexpect"
)

func TestFruits(t *testing.T) {
  //    http.Handler
  handler := FruitsHandler()

  //    server
  server := httptest.NewServer(handler)
  defer server.Close()

  //    httpexpect   
  e := httpexpect.New(t, server.URL)

  //   api    
  e.GET("/test").
    Expect().
    Status(http.StatusOK).JSON().Array().Empty()
}
Jsonデータ検証をサポートします.
orange := map[string]interface{}{
  "weight": 100,
}

//  GET       
e.PUT("/fruits/orange").WithJSON(orange).
  Expect().
  Status(http.StatusNoContent).NoContent()

// GET     ,            weight: 100
e.GET("/fruits/orange").
  Expect().
  Status(http.StatusOK).
  JSON().Object().ContainsKey("weight").ValueEqual("weight", 100)

apple := map[string]interface{}{
  "colors": []interface{}{"green", "red"},
  "weight": 200,
}
//       
e.PUT("/fruits/apple").WithJSON(apple).
  Expect().
  Status(http.StatusNoContent).NoContent()
//       
obj := e.GET("/fruits/apple").
  Expect().
  Status(http.StatusOK).JSON().Object()

obj.Keys().ContainsOnly("colors", "weight")

//           
obj.Value("colors").Array().Elements("green", "red")
obj.Value("colors").Array().Element(0).String().Equal("green")
obj.Value("colors").Array().Element(1).String().Equal("red")
obj.Value("colors").Array().First().String().Equal("green")
obj.Value("colors").Array().Last().String().Equal("red")
チェーン式の呼び出し関数はとても使いやすくて、実は内蔵関数はまだたくさんあります.Objectデータの種類は下記のような関数があります.
ContainsKey
ContainsMap
Empty
Equal
Keys
NotContainsKey
もちろん他のシーンのテストもサポートします.
  • JSON Schema and JSON Path JSONモード
  • Formsフォーム
  • URL construction url構造
  • HTTP Headers header
  • Cookiesクッキー
  • Regular expressions正則
  • Subdomains and per-request URLサブル
  • Reusable buildersは、
  • を繰り返し使用することができる.
  • Custom configカスタム
  • Session supportセッションサポート
  • Use HTTP handler directlyリダイレクト
  • 実際の応用
    以下は、ginフレームアプリプロジェクトに依存してhttpexpectを使用した例です.
  • ap.go
  • package main
    
    import (
      "./engine"
    )
    
    func main() {
      engine.GetMainEngine().Run(":4000")
    }
    
  • engine/engine.go,ここでもう一つのengine.goがあるのは、私たちがhttpexpectに返してserverを作成して、node.jsプロジェクトappiテストを参照するからです.
  • package engine
    
    import (
      "github.com/gin-contrib/sessions"
      "github.com/gin-gonic/gin"
    )
    
    func GetMainEngine() *gin.Engine {
      r := gin.New()
      // db, store := database.Connect()
      // logdb := database.ConnectLog()
      // r.Use(sessions.Sessions("xxx", store))
      // r.Use(corsMiddleware())
      // r.Use(gin.Logger())
      // r.Use(gin.Recovery())
      // r.Use(requestLogger())
            //        handler
      routers.Init(r)
      return r
    }
    
  • articales_test.go
  • package test
    
    import (
      "net/http"
      "testing"
    )
    
    var eng *httpexpect.Expect
    
    func GetEngine(t *testing.T) *httpexpect.Expect {
      gin.SetMode(gin.TestMode)
      if eng == nil {
        server := httptest.NewServer(engine.GetMainEngine())
        eng = httpexpect.New(t, server.URL)
      }
      return eng
    }
    
    func TestArticles(t *testing.T) {
      e := GetEngine(t)
      e.GET("/api/v1/articles").
        Expect().
        Status(http.StatusOK).
        JSON().Object().ContainsKey("data").Keys().Length().Ge(0)
    }
    
    
    そして実行します
    go test -v -cover ...
    
    実行結果は同様です.
    このカバンを使って、私たちはレストfulのアプリごとにテストができます.コード品質をより大きく向上させました.以下は私の.trvis.yml配置です.足りないところを指摘してください.
    language: go
    
    services: mongodb
    
    go:
      - 1.9.2
      - master
    
    install: true
    
    matrix:
      allow_failures:
        - go: master
      fast_finish: true
    
    notifications:
      email: false
    
    script:
      - echo "script"
      - go get -u -v  github.com/gavv/httpexpect
      -      
      - echo "add config file"
      - cp config/config.example.yaml config/config.yaml
      - echo "test"
      - export GIN_MODE=test
      - go test -v -cover test/*