概要
過去 に 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 件のコメント:
コメントを投稿