LoginSignup
0
0

More than 1 year has passed since last update.

GitLabのMR上に.NETアプリのカバー率を表示する

Last updated at Posted at 2022-09-27

ご挨拶

お世話になっております。
都内の某企業でエンジニアをやっている ひろしま という者です。

とあるお仕事で、GitLabを使って.NETアプリのパイプライン構築をしていたのですが、
MRにユニットテストのカバー率を表示する際に、WEB上に最新情報が落ちていなくてハマったので
記事にしてみようと思います。

参考サイト

参考にしたWEBサイトは、GitLab公式の1年前の記事です。
https://www.gitlab.jp/blog/2021/09/27/gitlab-coverage-dotnet/

本題

このサイトに書かれている内容が古く、ハマってしまいました。
主に古いのは、dotnet-reportgenerator-globaltoolが吐き出すHTMLレポートファイルの形式です。

参考サイトのサンプル画像を見て分かる通り、1年前の時点ではのっぺりとしたデザインのレポートでした。
しかし、どうも最近デザインがシャレオツになってしまった結果、面倒くさいHTMLファイルになってしまいました。
もちろん正規表現バリバリLinuxのコマンドサクサクみたいな人はつまづかないのでしょうけど……。

具体的にはこの部分です。

  after_script:
    - dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:Html
    - grep 'Line coverage:' coverage/index.html
  coverage: "/Line coverage:/"

1年前はたったこれだけでよかったのですが、どうもシャレオツになった結果、
1行分取れば良いわけではなく、2行目を取らないとカバー率が取得できなくなっています。
しかも、アクセシビリティに配慮してか、title属性まで付与されており、その中に123 of 123のように数字が入っています。

結論

こうしてください。

  after_script:
    - dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:Html
    - grep -A 1 'Line coverage:' coverage/index.html
  coverage: "/\\<td.*\\>(\\d+.\\d+)%/"

解説

まず、 grep -A 1 'Line coverage:' coverage/index.html-A 1についてです。
新デザインではカバー率の値の部分が改行されているので、マッチした1行分だけでは取れません。
なので、-A 1オプションを付けて、マッチした行+1行分下まで表示するようにします。

次に、coverage: "/\\<td.*\\>(\\d+.\\d+)%/"についてですが、
これはgrepでひっかけてきた2行分のうちの2行目のカバー率の値だけにマッチさせています。
どうやら coverage: は、その文字列中に最初に見つかった数字をカバー率として認識するらしく、
冒頭でも書いた通りこのtdタグにはtitle属性で123 of 123のような数字が含まれています。
なので、その部分を無視するようにマッチさせています。

最後に

簡単ではありますが、これからGitLabを使って同じことをしようと思っている方の助力になれば幸いです。

追記:2022/11/10

出力するレポートの種類をHTMLではなくTextSummaryにすれば、こんなことしなくても取れるみたいです。

  after_script:
    - dotnet reportgenerator -reports:./**/coverage.cobertura.xml -targetdir:coverage -reporttypes:TextSummary
    - grep 'Line coverage:' coverage/Summary.txt
  coverage: "/(\\d+.\\d+)%/"

勉強不足でした。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0