golang echoアプリの自動テストを書く

go lang

丹内です。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が返ってきます。

参考URL