Golangプロジェクトでは、APIをどうやってテストしますか?
9778 ワード
この記事は私のブログから始まりました.
簡単に述べる
日常バックエンドの業務開発において、私たちはよくappiを書いて、それから
使用
httpexpectは端対端アプリテストツールです.
End-to-end HTTP and REST API testing for Go.
インストール を繰り返し使用することができる. 実際の応用
以下は、ginフレームアプリプロジェクトに依存してhttpexpectを使用した例です. ap.go engine/engine.go,ここでもう一つのengine.goがあるのは、私たちがhttpexpectに返してserverを作成して、node.jsプロジェクトappiテストを参照するからです. articales_test.go
このカバンを使って、私たちはレストfulのアプリごとにテストができます.コード品質をより大きく向上させました.以下は私の.trvis.yml配置です.足りないところを指摘してください.
簡単に述べる
日常バックエンドの業務開発において、私たちはよく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を使用した例です.
package main
import (
"./engine"
)
func main() {
engine.GetMainEngine().Run(":4000")
}
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
}
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/*