偽陽性のGOコードカバレッジ
6026 ワード
GOは、主なインストール・パッケージで直接コード範囲のためにツールを提供します.しかし、初期設定では、カバレッジ結果は実際の報道よりもはるかに高い可能性があります.
コードカバレッジがはるかに高くなる理由を理解するためには、カバレッジを測定する方法を理解する義務的です.GOはテストを実行する前にコードを変更し、その後、各パスに出現数をカウントする内部ツールを持っています.しかし、現在テストされているパッケージにのみ出現します.
あなたがパッケージを持っていると言いましょう
例
例えば、私がレポを作ったarxeiss/go-false-positive-coverage , 2つの完全に分離されたパッケージが含まれています
ステップ1 -私は100 %のカバレッジを持っている
上記のRepoをクローンし、次のコマンドを実行します.その結果、100 %の総カバレッジを見ることができます.テストがないからです
ステップ2 -より多くのテストを追加全体のカバレッジ
そこに準備テストがあります
ステップ3 -スイッチ
本当の全体的なスコアを取得するには、それを使用する義務的です はテストのないパッケージについてレコードを挿入します パッケージ間のカバレッジを測定します.それで、それが他のパッケージによって使われるならば、一つのテストのないパッケージは完全にカバーされることができます.
ステップ4 -生成されたコードの問題
の主な問題
🇨🇿 V češtině si lze článek přečíst na kutac.cz
コードカバレッジがはるかに高くなる理由を理解するためには、カバレッジを測定する方法を理解する義務的です.GOはテストを実行する前にコードを変更し、その後、各パスに出現数をカウントする内部ツールを持っています.しかし、現在テストされているパッケージにのみ出現します.
あなたがパッケージを持っていると言いましょう
A
and B
. パッケージA
が完全にテストされ、パッケージからいくつかの関数を使用していますB
, これはゼロテストです.結果は100 %のステートメントがカバーされます.しかし、パッケージにテストを追加する場合B
, 全体的なカバレッジをドロップすることができます.例
例えば、私がレポを作ったarxeiss/go-false-positive-coverage , 2つの完全に分離されたパッケージが含まれています
unary
and binary
.ステップ1 -私は100 %のカバレッジを持っている
上記のRepoをクローンし、次のコマンドを実行します.その結果、100 %の総カバレッジを見ることができます.テストがないからです
unary
パッケージ.それから、記録はありませんcoverage.out
他のパッケージに関するファイルgo tool cover
何も知らない.go test -covermode=count -coverprofile=coverage.out ./...
# ? github.com/arxeiss/go-false-positive-coverage [no test files]
# ok github.com/arxeiss/go-false-positive-coverage/binary 0.002s coverage: 100.0% of statements
# ? github.com/arxeiss/go-false-positive-coverage/unary [no test files]
# Count total coverage and coverage per function.
go tool cover -func coverage.out
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:3: Add 100.0%
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:7: Sub 100.0%
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:11: Mul 100.0%
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:15: Div 100.0%
# total: (statements) 100.0%
ステップ2 -より多くのテストを追加全体のカバレッジ
そこに準備テストがあります
unary
パッケージ.ファイル名変更operations_test.go.bak
削除.bak
サフィックス.今、上記と同じコマンドを実行し、総カバレッジは71.4 %になります!ステップ3 -スイッチ
-coverpkg
助けになる本当の全体的なスコアを取得するには、それを使用する義務的です
-coverpkg
テストするすべてのパッケージを切り替えて定義します.このスイッチには2つの効果があります.coverage.out
. go test -covermode=count -coverprofile=coverage.out -coverpkg=github.com/arxeiss/go-false-positive-coverage/... ./...
# ? github.com/arxeiss/go-false-positive-coverage [no test files]
# ok github.com/arxeiss/go-false-positive-coverage/binary 0.002s coverage: 44.4% of statements in github.com/arxeiss/go-false-positive-coverage/...
# ok github.com/arxeiss/go-false-positive-coverage/unary 0.002s coverage: 11.1% of statements in github.com/arxeiss/go-false-positive-coverage/...
go tool cover -func coverage.out
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:3: Add 100.0%
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:7: Sub 100.0%
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:11: Mul 100.0%
# github.com/arxeiss/go-false-positive-coverage/binary/operations.go:15: Div 100.0%
# github.com/arxeiss/go-false-positive-coverage/main.go:10: main 0.0%
# github.com/arxeiss/go-false-positive-coverage/unary/operations.go:5: Abs 100.0%
# github.com/arxeiss/go-false-positive-coverage/unary/operations.go:9: Sin 0.0%
# github.com/arxeiss/go-false-positive-coverage/unary/operations.go:13: Cos 0.0%
# total: (statements) 55.6%
ステップ4 -生成されたコードの問題
の主な問題
-coverpkg
スイッチは、プロトファイルなどの生成されたコードも含まれます.これらはほとんど生成されないため、明示的にテストされません.それらを無視するためには、coverage.out
シェル魔法のファイル.もっと見るStackOverflow .cat coverage.out | grep -v ".pb.go" > coverage.filtered.out
go tool cover -func coverage.filtered.out
Reference
この問題について(偽陽性のGOコードカバレッジ), 我々は、より多くの情報をここで見つけました https://dev.to/arxeiss/false-positive-go-code-coverage-3k7jテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol