Goのcoverage profileをファイル単位で見れるようにする
生成されるアーティファクト(HTML)はファイルが多いと読むのが辛い
GitHubにこんな感じでカバレッジのURLが貼られるようになってほしい
貼られるファイルはPRの差分
code:_
...
Goのカバレッジの生成方法
code:sh
go test -race -coverprofile=cover.out ./...
go tool cover -html=cover.out -o coverage.html
PRで差分があったGoファイルの一覧を取得
coverage profile のHTMLは、各ファイルに対して file0,file1のようなリンクが生成されている
ファイルごとにこんな感じのURLになる
index.html#file0
index.html#file1
...
どのファイルがどのリンクなのか調べたい
HTMLをパースしてそれぞれカバレッジとリンクが取れるようなツールを作った
今のところやってることは optionタグの一覧を取得してるだけ
ファイルへのリンクを表示したかったが、リンクに使われているfile0みたいなやつは html 生成してるところで作っていたので、愚直にhtmlを解釈するくらいしか方法がなかった
code:sh
$ docker run \
-v $(pwd)/test/cover.html:/app/cover.html \
go-coverage-html-converter:v0.0.1 | jq
[
{
"filename": "app/main.go",
"urlFragment": "file0",
"coverage": 28.6
},
{
"filename": "app/sample.go",
"urlFragment": "file1",
"coverage": 0
}
]
code:sh
// 差分があったファイル一覧を取得
CHANGED_FILES=$(git --no-pager diff --name-only $CIRCLE_BRANCH origin/develop \
| grep '.*\.go$' | sed 's/_test\.go/.go/g' | sort -u \
| sed 's/^/github.com\/ebkn\/repo\//g' \
| sed ':a;N;$!ba;s/\n/","/g' | sed 's/^/"/g' | sed 's/$/"/g'
)
ARTIFACT_BASE_PATH="${CIRCLE_BUILD_URL}/artifacts/0/coverreport#"
cat cover.html | docker run -i go-coverage-html-converter:v0.0.1 \
| jq -r '.[] | select(.filename as $s | '"$CHANGED_FILES"' | index($s)) | .result = "+ (.coverage|tostring) + "% " + .filename + "('"$ARTIFACT_BASE_PATH"'" + .urlFragment + ")" | .result' \ | sed ':a;N;$!ba;s/\n/\\n/g'
アウトプット
code:_