Goエンジニアリングユニット試験カバー率
2522 ワード
go testコマンドの後に-coverパラメータを追加してテストオーバーライド率統計を開きます.その結果、
-coverprofileは、統計的なテストオーバーライド率情報の出力パスを指定します.その内容は次のとおりです.
最初の行はテストオーバーライドのmodeで、値はset,count,atomicです.残りの行は、name.go:line.column,line.column numberOfStatements countですので、pkgごとにユニットテストを完了した後、以下のコマンドでマージできます.
それからgoが持っているツールでHTMLに出力します:
ok models 0.012s coverage: 71.4% of statements in models
-coverpkgタグで統計するコードパケットを指定した後、指定されていないコードは統計されません.直接テストされたコードパケットでも.go test -coverpkg=./... pkg2
は、pkg 2のすべてのユニットテストおよびpkg 2に使用される他のパケットのカバー率を走ることができる.しかし、goはgo test -coverpkg=./... ./...
をサポートしていないため、pkgが複数ある場合、すべてのテストカバー率と完全部ユニットテストを一度に統計することはできません.そのため、ユニットを1つずつテストして、カバー率の結果を統合する必要があります.1
2
3
4
5
6
7
8
9
10
src
├── pkg1
│ ├── pkg11
│ └── pkg12
└── pkg2
├── pkg21
└── pkg22
go test -coverprofile=pkg1.cover.out -coverpkg=./... pkg1
go test -coverprofile=pkg1.cover.out -coverpkg=./... pkg2
-coverprofileは、統計的なテストオーバーライド率情報の出力パスを指定します.その内容は次のとおりです.
mode: set
models/bot.go:32.40,46.18 12 1
models/bot.go:49.2,57.35 5 1
...
最初の行はテストオーバーライドのmodeで、値はset,count,atomicです.残りの行は、name.go:line.column,line.column numberOfStatements countですので、pkgごとにユニットテストを完了した後、以下のコマンドでマージできます.
echo "mode: set" > coverage.out && cat *.cover.out | grep -v mode: | sort -r | \
awk '{if($1 != last) {print $0;last=$1}}' >> coverage.out
それからgoが持っているツールでHTMLに出力します:
go tool cover -html=coverage.out -o cover.html
流れ全体をスクリプトにして次のように書きます.#!/bin/bash
set -e
profile="cover.out"
htmlfile="cover.html"
mergecover="merge_cover"
mode="set"
for package in $(go list ./...|grep -v src); do
coverfile="$(echo $package | tr / -).cover"
go test -covermode="$mode" -coverprofile="$coverfile" -coverpkg="$package" "$package"
done
# merge all profiles
grep -h -v "^mode:" *.cover | sort > $mergecover
# aggregate duplicated code-block data
echo "mode: $mode" > $profile
current=""
count=0
while read line; do
block=$(echo $line | cut -d ' ' -f1-2)
num=$(echo $line | cut -d ' ' -f3)
if [ "$current" == "" ]; then
current=$block
count=$num
elif [ "$block" == "$current" ]; then
count=$(($count + $num))
else
echo $current $count >> $profile
current=$block
count=$num
fi
done < $mergecover
if [ "$current" != "" ]; then
echo $current $count >> $profile
fi
# save result
go tool cover -html=$profile -o $htmlfile
go tool cover -func=$profile