この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
丹内です。Golang 1.6とEchoフレームワークを使ったアプリケーションに対して自動テストを書いてみます。
前提
MacでGo 1.6を使います。パッケージ管理はglideです。
ディレクトリ構成は以下のとおりです
$GOPATH/
├── .envrc
├── .git/(省略)
├── .gitignore
├── README.md
├── bin/(省略)
├── pkg/(省略)
├── src
│ ├── github.com
│ │ ├── alecthomas
│ │ │ ├── gocyclo
│ │ │ │ ├── LICENSE
(省略)
│ ├── myproject
│ │ ├── glide.lock
│ │ ├── glide.yaml
│ │ ├── handler
│ │ │ ├── handler.go
│ │ │ └── handler_test.go
│ │ ├── main.go
│ │ └── vendor
│ │ ├── github.com
│ │ │ ├── dgrijalva
│ │ │ │ └── jwt-go
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
(省略)
myprojectが今回のプロジェクト名です。
コードを書く
$GOPATH/src/myproject/main.go
package main
import (
"myproject/handler"
"github.com/labstack/echo"
"github.com/labstack/echo/engine/standard"
"github.com/labstack/echo/middleware"
)
var (
mockDB = map[string]string{
"1": "one",
"2": "two",
"3": "three",
}
)
func main() {
e := echo.New()
h := handler.Handler{mockDB}
e.Use(middleware.Logger())
e.Use(middleware.Recover())
e.GET("/", h.GetUser)
e.Run(standard.New(":1323"))
}
$GOPATH/src/myproject/handler/handler.go
package handler
import (
"net/http"
"github.com/labstack/echo"
)
type (
Handler struct {
Db map[string]string
}
migrationResultJSON struct {
Id string `json:"Id"`
}
)
func (h Handler) GetUser(c echo.Context) error {
user := h.Db["1"]
if user == "" {
return echo.NewHTTPError(http.StatusNotFound, "user not found")
}
return c.JSON(http.StatusOK, migrationResultJSON{Id: user})
}
$GOPATH/src/myproject/handler/handler_test.go
package handler
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/labstack/echo"
"github.com/labstack/echo/engine/standard"
)
var (
testMockDB = map[string]string{
"1": "one",
"2": "two",
"3": "three",
}
)
func TestGetUser(t *testing.T) {
e := echo.New()
req := new(http.Request)
rec := httptest.NewRecorder()
c := e.NewContext(standard.NewRequest(req, e.Logger()), standard.NewResponse(rec, e.Logger()))
c.SetPath("/")
h := Handler{testMockDB}
h.GetUser(c)
if rec.Body.String() != "{\"id\":\"one\"}" {
t.Errorf("expected response Id: one, got %s", rec.Body.String())
}
}
テストを実行する
handlerディレクトリに移動してテストコマンドを打つとテストが走ります。
$ cd $GOPATH/src/myproject/handler; go test
PASS
ok myproject/handler 0.011s
ブラウザでhttp://localhost:1323
にアクセスしても{"id": "one"}
のJSONが返ってきます。