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

2016.06.11

この記事は公開されてから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が返ってきます。

参考URL