2017年4月1日土曜日

go-swagger で作成したアプリにテストを付けてみた

概要

過去 に go-swagger をつかって TODO アプリを作成しました
今回は swagger client という機能を使ってアプリのテストコードを作成してみました

環境

  • Mac OS X 10.12.3
  • golang 1.8
  • go-swagger dev

クライアントコードの生成

  • cd /path/to/go/src/github.com/hawksnowlog/todo-list/client
  • swagger generate client -f swagger.yml
  • tree -a client
client/
├── a_to_do_list_application_client.go
└── todos
    ├── add_one_parameters.go
    ├── add_one_responses.go
    ├── destroy_one_parameters.go
    ├── destroy_one_responses.go
    ├── find_todos_parameters.go
    ├── find_todos_responses.go
    ├── todos_client.go
    ├── update_one_parameters.go
    └── update_one_responses.go

client というディレクトリ配下にクライアントコードが作成できます

テストコードの作成

では、生成したクライアントコードを使ってテストコードを作成します

  • cd /path/to/go/src/github.com/hawksnowlog/todo-list/
  • mkdir test
  • vim todo_list_test.go
package test

import (
    "log"
    "testing"
    "time"

    "github.com/go-openapi/swag"

    apiclient "github.com/kakakikikeke/todo-list/client"
    "github.com/kakakikikeke/todo-list/client/todos"
    "github.com/kakakikikeke/todo-list/models"
)

var tc = apiclient.TransportConfig{
    "localhost:8080",
    apiclient.DefaultBasePath,
    apiclient.DefaultSchemes,
}

func TestAddOne(t *testing.T) {
    d := "test1"
    i := models.Item{
        Completed:   false,
        Description: &d,
    }
    p := todos.NewAddOneParams().WithBody(&i)
    resp, err := apiclient.NewHTTPClientWithConfig(nil, &tc).Todos.AddOne(p.WithTimeout(10 * time.Second))
    if err != nil {
        log.Fatal(err)
    }
    log.Println(resp)
}

func TestFindTodos(t *testing.T) {
    p := todos.NewFindTodosParams()
    p.Since = swag.Int64(0)
    resp, err := apiclient.NewHTTPClientWithConfig(nil, &tc).Todos.FindTodos(p.WithTimeout(10 * time.Second))
    if err != nil {
        log.Fatal(err)
    }
    if len(resp.Payload) <= 0 {
        log.Fatal("No records")
    }
    for _, p := range resp.Payload {
        log.Println(p.ID)
        log.Println(*p.Description)
        log.Println(p.Completed)
    }
}

func TestUpdateOne(t *testing.T) {
    d := "test2"
    i := models.Item{
        Completed:   true,
        Description: &d,
    }
    p := todos.NewUpdateOneParams().WithBody(&i)
    p.ID = 1
    resp, err := apiclient.NewHTTPClientWithConfig(nil, &tc).Todos.UpdateOne(p.WithTimeout(10 * time.Second))
    if err != nil {
        log.Fatal(err)
    }
    log.Println(resp)
}

func TestDestroyOne(t *testing.T) {
    p := todos.NewDestroyOneParams()
    p.ID = 1
    resp, err := apiclient.NewHTTPClientWithConfig(nil, &tc).Todos.DestroyOne(p.WithTimeout(10 * time.Second))
    if err != nil {
        log.Fatal(err)
    }
    log.Println(resp)
}

各機能ごとにテスト用のメソッドを作成しています
流れとしてはパラメータを作成して apiclient を使って API をコールし、その結果を評価しています

デフォルトでアクセスするホストは localhost でポートは 80 番です
もしそれ以外にアクセスする場合は TransportConfig で設定できます

実行

  • go fmt github.com/hawksnowlog/todo-list/test
  • go test -v github.com/hawksnowlog/todo-list/test

で、テストを実行できます
fmt や log を使っている場合は「-v」オプションを付与することで出力することができます

このテストは実際に API をコールします
なのでテストを実行する前にはアプリも実行しておく必要があります

最後に

swagger client を使ってテストコードを作成してみました
ユニットテストというよりかはインテグレーションテストになるかと思います

swagger を使えばインテグレーションテストも簡単に書けるので便利です
あとは UI や CLI ツールを作成するときにも client のコードは使えるかなと思います

0 件のコメント:

コメントを投稿