web-dev-qa-db-ja.com

Goテストカバレッジから生成されたファイルを無視する方法

パッケージにDO NOT EDITが上に生成されたファイルがあります。 go test -coverprofile=cover.out <package>を使用してパッケージのテストを実行しています。これにより、カバレッジプロファイルが作成され、合計カバレッジ率が表示されます。ただし、カバレッジの計算中に生成されたファイルも含まれます。カバレッジ計算で生成されたファイルを無視する方法はありますか?

14
Rohanil

パッケージ自体がunitを形成するため、ほとんどのGoツールはパッケージで動作します。パッケージからファイルを除外すると、パッケージが簡単に「壊れる」可能性があります。除外されたファイルには、(重要な)パッケージ初期化コードが含まれている場合や、残りのパッケージファイルのコンパイルに失敗する場合があります。

go testも例外ではありません。パッケージに対しても機能します。パッケージからファイルを除外する直接的なサポートはありません。

生成されたファイルを使用せずにパッケージをコンパイルおよびテストできる場合、ファイルを別のパッケージに生成することを選択できます。そうすると、パッケージの(カバレッジ)テストに自然に含まれなくなります。

これを処理する別の方法は、同じパッケージ/フォルダーで生成し、生成されたファイルで特別なビルドタグを使用することです。これは、カバレッジテストの実行時に除外できます。ビルドタグの詳細については、こちらをご覧ください: ビルドの制約 、およびこちら: Goでプラットフォーム固有のコードをカプセル化する正しいアプローチは何ですか?

生成されたファイルがパッケージのコンパイル/テストに必要な場合、オプションがあります:生成されたファイルにinternalパッケージを使用します。内部パッケージは、internalフォルダーをルートとするパッケージツリーでのみ使用可能です。つまり、内部パッケージ内の任意の識別子をエクスポートでき、コンパイラーは「意図しない」関係者によって使用されないようにします。内部パッケージの詳細については、こちらをご覧ください。 複数のソースディレクトリでgoパッケージを開発できますか?

また、生成されたコードのテストを作成または生成するオプションを検討してください。これは、とにかく優れたプラクティスである可能性があるため、トリックを使用してカバレッジテストから除外する必要はありません。

5
icza

生成されたコードをカバープロファイルから取り除くことができます。

go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out

使用するツールに応じて、これはパイプライン/メイクで簡単に実装できます。

9
Christian

このニーズを解決できる方法に従ってください。

Dirs/pkgsを除外することにより

テストを実行してカバーを生成するため、go testコマンドがこのpkgからファイルを探す場所を自動的に無視するpkgを指定します。例に続いて

project
|_______/pkg/web/app 
|_______/pkg/web/mock -> It will be ignored.

# Command:   
$go test -failfast -tags=integration -coverprofile=coverage.out -covermode=count github.com/aerogear/mobile-security-service/pkg/web/apps

ただし、すべての場合に適用できるわけではありません。たとえば、ファイルがインターフェイスのモックルーチンである場合、サービス、テスト、およびモックに必要なインポートはおそらくサイクルになり、これは許可されないため、うまく動作しない可能性があります。

名前定義で「_test」を使用する

テストで使用されるファイルを無視する場合は、名前の最後に_testを使用するのが理にかなっています。たとえば、my_service_mock_test.go。名前の最後に_testが付いたファイルは、デフォルトでは無視されます。

次のようにカバーファイルから削除する

go test . -coverprofile cover.out.tmp
cat cover.out.tmp | grep -v "_generated.go" > cover.out
tool cover -func cover.out

PS .:それらを除外するコメントやタグが見つかりませんでした。

1
Camila Macedo