-printfuncs
が便利
% go tool vet -all -printfuncs=Criticalf,Infof,Warningf,Debugf,Tracef .
-set_exit_status
が便利
% golint -set_exit_status ./...
複数パッケージのテストにはgotestcover、Coveralls投稿にはgoverallsが便利。
% gotestcover -covermode=count -coverprofile=.profile.cov ./...
% goveralls -coverprofile=.profile.cov
travis encrypt-file
で暗号化したdeploy keyをリポジトリにコミットgit remote set-url origin git@github.com:mackerelio/mackerel-agent-plugins.git
でリモート書き換えgoimports
が重い問題
goimports
をかける$ go get github.com/monochromegane/dragon-imports/...
$ dragon-imports
http://blog.monochromegane.com/blog/2015/12/23/dragon-imports/
lazy-goimports
を実行go test
実行前に bundle-goimports を実行UNIX Socketにも対応している。
package main
import (
"github.com/soh335/go-test-redisserver"
"github.com/garyburd/redigo/redis"
)
func main() {
s, err := redistest.NewRedisServer(nil)
if err != nil {
log.Fatal(err)
}
defer s.Stop()
conn, err := redis.Dial("unix", s.Config.UnixSocket)
if err != nil {
log.Fatal(err)
}
_, err = conn.Do("PING")
if err != nil {
log.Fatal(err)
}
}
func TestMain(m *testing.M) {
os.Exit(runTests(m))
}
func runTests(m *testing.M) int {
testMysqld, err := mysqltest.NewMysqld(nil)
if err != nil {
log.Fatal("runTests: failed launch mysql server:", err)
}
defer testMysqld.Stop()
setupTestDB(testMysqld)
return m.Run()
}
CREATE DATABASE
した後にスキーマ流し込み。可能ならfixture類も
func setupTestDB(testMysqld *mysqltest.TestMysqld) {
db, err := sql.Open("mysql", testMysqld.DSN(mysqltest.WithDbname("")))
if err != nil {
log.Fatalf("Failed to setup database for testing: %s", err)
}
const testdbname = "hoge_test"
_, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s", testdbname))
if err != nil {
log.Fatal("create db error:", err)
}
// close and re-open with created db.
db.Close()
// set to global variable for other tests.
testDB, err = sql.Open("mysql", testMysqld.DSN(mysqltest.WithDbname(testdbname)))
if err != nil {
log.Fatalf("Failed to setup database for testing: %s", err)
}
applySchema()
}
mycnf := mysqltest.NewConfig()
mycnf.CopyDataFrom = "/tmp/mysqltest_data"
testMysqld, err := mysqltest.NewMysqld(mycnf)
mysqld起動時にコピー元のdataディレクトリを指定できる機能。テスト開始時にDBに大量のデータを入れておきたい場合に、MySQLの起動時間を節約できる。(MySQL5.7だと遅いかも…)
これにも、 mysqltest
を利用する。
mycnf := mysqltest.NewConfig()
mycnf.DataDir = "/tmp/mysqltest_data"
testMysqld, err := mysqltest.NewMysqld(mycnf)
// 以降セットアップ
空いているポートを探して一時的にデーモンを立てる
p, err := tcputil.EmptyPort()
cmd := exec.Command("memcached", "-p", fmt.Sprintf("%d", p))
go cmd.Run()
...
cmd.Process.Kill()