😺

Golangのテストカバレッジを効率的に確認する

2021/05/08に公開

Golangのテストカバレッジを効率的に確認する

前回の記事でテストカバレッジをshellスクリプトにしてそれを実行することで確認していました。
https://zenn.dev/_kazuya/articles/f6e89eeab197d52067d7

今回これを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 --from=stage1-buildphase /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の記述のベストプラクティスを追求していきたいと思います。

GitHubで編集を提案

Discussion