Go用テストツールGoConveyの紹介


GoConveyというGo用テストツールがあります。
特徴は下記7点だそうです。

  1. Brilliant Web UI
  2. Gracefully examine failing tests
  3. Resolve panics and build failures
  4. HTML5 desktop notifications
  5. Readable terminal output
  6. Responsive design for limited screen space
  7. Test code generator

個人的には、下記の点が気に入っています。

  1. ブラウザ上でテスト結果が表示される
  2. ソース保存時にテストが実行される
  3. テストが書きやすい

インストール方法は、いつものようにgo getでインストールすればOKです。

$ go get github.com/smartystreets/goconvey

実行方法は下記の通り。

$ $GOPATH/bin/goconvey

実行後、ブラウザを起動して下記URLにアクセスしてください。

http://localhost:8080

下記のような画面が表示されれば準備完了です。

レスポンシブな画面なので、細くして表示するのも良いです。

今はテストがないので、 0/0 assertions と表示されています。

早速テストを書くことにしますが、折角なのでテストコード生成機能を使ってみます。
画面上部の鉛筆アイコンをクリックすれば、テストコードの生成画面が出てきます。
インデントしない文字列はテスト関数名、インデントした部分はテストのスコープを意味するそうです。
とりあえず、うるう年計算プログラムのテストとなるスコープを書いてみました。

生成されたソースをコピペし、必要なimport文を書いて、テストコードのテンプレートが出来上がりです。

leap_year_test.go
package main

import (
    . "github.com/smartystreets/goconvey/convey"
    "testing"
)

func TestLeapYear(t *testing.T) {
    Convey("西暦が400で割り切れる年はうるう年である", t, nil)
    Convey("400で割り切れない場合、西暦が100で割り切れる年はうるう年ではない", t, nil)
    Convey("100で割り切れない場合、西暦が4で割り切れる年はうるう年である", t, nil)
    Convey("4で割り切れない場合、うるう年ではない", t, nil)
}

保存した直後にGoConveyの画面が勝手にテストを実行します。
Convey関数の第3引数にテストを書くことになるのですが、ここではnilが入っているのでスキップ扱いになります。

テストコードと実装を書いて保存した結果、仮実装に問題があってFAILと出ました(当たり前)

アサーションの書き方は、Assertions · smartystreets/goconvey Wikiをご参照ください。
よく使うものはGeneral Equalityに書かれている下記になるかと思います。
第1引数がactual, 第2引数がassertionの内容、あれば第3引数がexpectedになります。

  • So(thing1, ShouldEqual, thing2)
  • So(thing1, ShouldNotEqual, thing2)
  • So(thing1, ShouldResemble, thing2) // a deep equals for arrays and structs
  • So(thing1, ShouldNotResemble, thing2)
  • So(thing1, ShouldPointTo, thing2)
  • So(thing1, ShouldNotPointTo, thing2)
  • So(thing1, ShouldBeNil)
  • So(thing1, ShouldNotBeNil)
  • So(thing1, ShouldBeTrue)
  • So(thing1, ShouldBeFalse)
  • So(thing1, ShouldBeZeroValue)

また、 画面上部のベルをクリックして白から濃いグレーに変更すると、Chrome / SafariなどでDesktop Notificationが有効になります。ビルドの結果を、ブラウザを見ずに結果の通知を見ることができるわけです。

本テストは、いつものコマンドラインからのgo testでも実行することが出来ます。
結果も見やすいですし、アサーションも書きやすいですので、普段からGoConveyを使うのがオススメです。

本記事でGoConveyに興味が出ましたら、是非GoConveyをお試しください。