複数パッケージ構成のgolangのプロジェクトのカバレッジを測定しcoverallsに投稿する
前回もそうでしたが、golangの話と言いつつシェルスクリプトしか出てきません。このへんで出ているような話で同じようなことで大分ガイシュツネタです。
やったのは以下。
- go test -coverprofile=coverage.outが複数パッケージに対応しておらず動かないのでディレクトリを渡り歩いてそれぞれでcoverprofileを出力しながらひとつのファイルにマージする
- coverallsへの投稿はmattnさんのgoverallsを使う
coverprofileを出力するスクリプトは似たようなの既にたくさんあるけどこんな感じ。go list
使うのはmotemenに知見をもらった。
#/bin/sh
set -e
# 中断した時とかにゴミが残らないようにcleanupする
cleanup() {
retval=$?
if [ $tmpprof != "" ] && [ -f $tmpprof ]; then
rm -f $tmpprof
fi
exit $retval
}
trap cleanup INT QUIT TERM EXIT
# メインの処理
prof=${1:-".profile.cov"}
echo "mode: count" > $prof
gopath1=$(echo $GOPATH | cut -d: -f1)
for pkg in $(go list ./...); do
tmpprof=$gopath1/src/$pkg/profile.tmp
go test -covermode=count -coverprofile=$tmpprof $pkg
if [ -f $tmpprof ]; then
cat $tmpprof | tail -n +2 >> $prof
rm $tmpprof
fi
done
travisだと、これを動かして終わった後で、after_successに
goveralls -coverprofile=.profile.cov
とか書いてやると良い。前回同様このへんでやってることも全部golangで書けると再利用しやすくなっていいかなーとは思っている。