😺
Golangのテストカバレッジを効率的に確認する
Golangのテストカバレッジを効率的に確認する
前回の記事でテストカバレッジをshellスクリプトにしてそれを実行することで確認していました。
今回これをDockerfileとMakefileにまとめてよりテストカバレッジを確認しやすいようにしたメモ。
流れ
- マルチステージビルドのstage1においてテストカバレッジを確認するためのcover.outなどを生成する
- stage2において、stage1のファイルをコピーする
- Dockerコンテナーないにあるファイル、cover.outをhtmlにコンバートしたファイルをローカルにコピーする
- Makefileで各種コマンドをまとめる
マルチステージビルドを実現しているDockerfileを記述し直す。
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 /go/src/ .
CMD ["./start.sh"]
ここで生成されるconvert.htmlはグラフィカルにテストカバレッジを確認することができます。
Makefileで各種コマンドをまとめる
Makefile
NAME := gotail
NAME-C := gotailcheck
.PHONY: all
all: docker-build docker-run
.PHONY: docker-build
docker-build:
docker build -t $(NAME) .
.PHONY: docker-run
docker-run:
docker run -t $(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/$(shell date +"%Y%m%d%I%M%S").html
.PHONY: open
open:
open convert.html
.PHONY: clean
clean:
sleep 10
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/$(shell date +"%Y%m%d%I%M%S").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
全ての設定が終わったら、次のコマンドでテストカバレッジを瞬時に確認でき、記録も残してくれます。
make check
これでテストカバレッジを意識した開発を手軽に行うことができそうです。
最後に
今回はdocker cpの使い方に詰まっておりました、dockerコマンドは結構覚えることが多いのでたまに混乱してしまうのですが、Makefileにまとめておくと安心です。
まだまだgolangは始めたばかりで分からないことばかりですが、golangにおけるMakefileの記述のベストプラクティスを追求していきたいと思います。
Discussion