Go と Travis CI を連携したり Golint を実行してみたり

昨日に引き続き Togoo を少し開発している.昨日作ったプロトタイプを会社で使ってみたら普通に使えて良かった.

自分で作ってドッグフーディングができるのって良いことだなー!

Go でテストを書く

試しに Go でテストを書いてみた.JUnit や RSpec に慣れてるから GitHub - stretchr/testify: A toolkit with common assertions and mocks that plays nicely with the standard library を使ってみたかったけど,まずは Go の基本思想を感じ取りたいなと思って Assert に頼らず if で書いた.go test だとカレントディレクトリを参照するらしく,今回はディレクトリ直下のテストも実行したかったため go test -v ./... と書いた.

package command

import "testing"

func TestDoneLabel(t *testing.T) {
    if doneLabel(0) != "-" {
        t.Error("Failed doneLabel(0)")
    }
    if doneLabel(1) != "Done" {
        t.Error("Failed doneLabel(1)")
    }
}

Travis CI でテストを実行する

Wercker と悩んだけど Gem で慣れてる Travis CI にした..travis.yml は以下のように書いた.簡単だ.

language: go

script:
  - go test -v ./...

Golint でコードを整理する

Golint を流してみたら結構多く警告が出たので全て対応した.Go を教えてくれる家庭教師っていう感じで,ビギナーとしては Golint は最高に便利だった.実際に対応した警告を整理しておく.

1.

関数にコメントがなくて怒られた.適当に書いてしまうと2行目のように怒られてしまうので,ちゃんと関数名とコメントをスペースで区切って書く必要があった.

exported function CmdAdd should have comment or be unexported
comment on exported function CmdAdd should be of the form “CmdAdd …”

// CmdAdd add new task.
func CmdAdd(c *cli.Context) {
(中略)
}

2.

無意識に Ruby の感覚で is_done っていう変数名を書いてしまっていた.go fmt じゃ気付かないから非常に助かった.

don’t use underscores in Go names; var is_done should be isDone

3.

if-else のブロックを切り出せと怒られた.コードの見通しが良くなるし,こういう指摘までしてくれるのは嬉しい!

if block ends with a return statement, so drop this else and outdent its block

// NG
func doneLabel(isDone int) string {
    if isDone == 0 {
        return "-"
    } else {
        return "Done"
    }
}
// OK
func doneLabel(isDone int) string {
    if isDone == 0 {
        return "-"
    }
    return "Done"
}

4.

go-sqlite3 のように _ でインポートする場合,main パッケージに書く必要があると怒られた.main.go にインポートを移動させたら問題なく動いた.なるほどって感じだった.

a blank import should be only in a main or test package, or have a comment justifying it

まとめ

Golint が想像上に便利で驚いた.vim で保存するときに自動的に Golint をチェックするように .vimrc に以下のコードを追加した.

set rtp+=${GOPATH}/src/github.com/golang/lint/misc/vim
autocmd BufWritePost,FileWritePost *.go execute 'Lint' | cwindow

明日から

4日間ベトナムに行ってきます!(ブログの更新止まります!)

関連エントリー