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


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

前回の記事でテストカバレッジをシェルスクリプトにしてそれを実行することで確認していました。
https://qiita.com/k_yuda/items/86f40bdf3e040560ade4

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