偽陽性のGOコードカバレッジ


GOは、主なインストール・パッケージで直接コード範囲のためにツールを提供します.しかし、初期設定では、カバレッジ結果は実際の報道よりもはるかに高い可能性があります.

🇨🇿 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