Golang のテストカバレッジを効率的に確認する
前回の記事でテストカバレッジをシェルスクリプトにしてそれを実行することで確認していました。
https://qiita.com/k_yuda/items/86f40bdf3e040560ade4
今回これをDockerfileとMakefileにまとめてよりテストカバレッジを確認しやすいようにしたメモ。
流れ
- マルチステージビルドのstage1においてテストカバレッジを確認するためのcover.outなどを生成する
- stage2において、stage1のファイルをコピーする
- Dockerコンテナーないにあるファイル、cover.outをhtmlにコンバートしたファイルをローカルにコピーする
- Makefileで各種コマンドをまとめる
マルチステージビルドを実現しているDockerfileを記述し直す。
FROM golang:latest AS stage1-buildphase
WORKDIR /go/src
COPY . .
RUN go test main_test.go main.go -v
RUN go build -o tail main.go
RUN go test main_test.go main.go -coverprofile=cover.out
RUN go tool cover -html=cover.out -o convert.html
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root
COPY --from=stage1-buildphase /go/src/ .
CMD ["./start.sh"]
ここで生成されるconvert.htmlはグラフィカルにテストカバレッジを確認することができます。
Makefileで各種コマンドをまとめる
NAME := gotail
NAME-C := gotailcheck
DATE := $(shell date +"%Y%m%d%I%M%S")
.PHONY: all
all: docker-build docker-run
.PHONY: test
test:
go test main_test.go main.go -v
.PHONY: docker-build
docker-build:
docker build -t $(NAME) .
.PHONY: docker-run
docker-run:
docker run --rm $(NAME)
check: docker-build docker-run-covercheck open clean
docker-run-covercheck:
docker run --rm --name $(NAME-C) -itd $(NAME) /bin/sh
docker cp $(NAME-C):/root/convert.html $(shell pwd)
docker stop $(NAME-C)
cp convert.html $(shell pwd)/coverchecklog/$(DATE).html
.PHONY: open
open:
open $(shell pwd)/coverchecklog/$(DATE).html
.PHONY: clean
clean:
rm -f cover.out convert.html
このように記述すると/coverchecklog
にテストカバレッジを確認できるhtmlファイルを保存し、自動でブラウザを立ち上げて確認できます。
docker-run-covercheck:
docker run --rm --name $(NAME-C) -itd $(NAME) /bin/sh
docker cp $(NAME-C):/root/convert.html $(shell pwd)
docker stop $(NAME-C)
cp convert.html $(shell pwd)/coverchecklog/$(DATE).html
docker run --rm
でdockerイメージを処理が終わった後に自動で削除してくれます。
また、--name
オプションを使用することで、IDではなくてnameでdocker cp
を実行することができます。
dockerのcp
が終わったらイメージを停止します。
最後に現在の時間をファイル名として、coverchecklog
にコンバートされたhtmlを記録します。
cp convert.html $(shell pwd)/coverchecklog/$(shell date +"%Y%m%d%I%M%S").html
$(DATE)
の中身を表記している。
全ての設定が終わったら、次のコマンドでテストカバレッジを瞬時に確認でき、記録も残してくれます。
make check
これでテストカバレッジを意識した開発を手軽に行うことができそうです。
最後に
今回はdocker cpの使い方に詰まっておりました、dockerコマンドは結構覚えることが多いのでたまに混乱してしまうのですが、Makefileにまとめておくと安心です。
まだまだgolangは始めたばかりで分からないことばかりですが、golangにおけるMakefileの記述のベストプラクティスを追求していきたいと思います。