octocovは私が開発しているコードメトリクス計測のためのツールキットです。
主となる用途であるCI(GitHub Actions)に組み込む使い方は会社のテックブログで紹介させてもらいましたのでそちらをご覧ください。
私自身もドックフーディングをしていて、自分の主だったリポジトリはすでに octocov に移行済みです。
Fix handling for bind runner by k1LoW · Pull Request #47 · k1LoW/runn · GitHub
実は octocov にはもうひとつ便利な使い方があるので、そちらを紹介したいと思います。
コードカバレッジを確認する
octocov は実は単体のCLIツールとしても使うことができます。.octocov.yml といった設定ファイルも一切必要ありません。ただ、インストールするだけでOKです。
macOSだとHomebrew経由でインストール可能です。
$ brew install k1LoW/tap/octocov
あとは octocov が対応しているフォーマットでカバレッジレポートを出力しているリポジトリでレポートファイルを指定して octocov コマンドを実行するだけです。
例えば、Goのプロジェクトだと以下のような感じです。
$ go test ./... -coverprofile=coverage.out -covermode=count
? github.com/k1LoW/octocov [no test files]
ok github.com/k1LoW/octocov/central 3.682s coverage: 73.1% of statements
? github.com/k1LoW/octocov/cmd [no test files]
ok github.com/k1LoW/octocov/config 1.264s coverage: 64.6% of statements
ok github.com/k1LoW/octocov/datastore 1.690s coverage: 43.0% of statements
? github.com/k1LoW/octocov/datastore/artifact [no test files]
? github.com/k1LoW/octocov/datastore/bq [no test files]
? github.com/k1LoW/octocov/datastore/gcs [no test files]
? github.com/k1LoW/octocov/datastore/github [no test files]
ok github.com/k1LoW/octocov/datastore/local 0.796s coverage: 80.0% of statements
? github.com/k1LoW/octocov/datastore/s3 [no test files]
ok github.com/k1LoW/octocov/gh 1.848s coverage: 16.1% of statements
ok github.com/k1LoW/octocov/internal 0.712s coverage: 84.8% of statements
ok github.com/k1LoW/octocov/pkg/badge 1.929s coverage: 72.1% of statements
ok github.com/k1LoW/octocov/pkg/coverage 2.606s coverage: 88.4% of statements
ok github.com/k1LoW/octocov/pkg/pplang 0.747s coverage: 77.3% of statements
ok github.com/k1LoW/octocov/pkg/ratio 1.062s coverage: 83.2% of statements
ok github.com/k1LoW/octocov/report 1.193s coverage: 68.7% of statements
? github.com/k1LoW/octocov/version [no test files]
$ octocov -r coverage.out
main (9244fb7)
--------------------------------------
Coverage 66.8%
うまく Coverage が取得できていることが確認できたら octocov ls-files でファイルごとのカバレッジを見てみましょう。
$ octocov -r coverage.out ls-files 73.1% [ 98/134] central/central.go 0.0% [ 0/29] config/build.go 56.7% [ 89/157] config/config.go 90.9% [ 10/11] config/generate.go 84.3% [ 91/108] config/ready.go 77.8% [ 42/54] config/yaml.go 45.4% [ 49/108] datastore/datastore.go 0.0% [ 0/6] datastore/hint.go 80.0% [ 16/20] datastore/local/local.go 16.1% [ 54/335] gh/gh.go 83.9% [ 52/62] internal/path.go 100.0% [ 4/4] internal/value.go 72.1% [ 31/43] pkg/badge/badge.go 91.5% [ 43/47] pkg/coverage/clover.go 91.7% [ 44/48] pkg/coverage/cobertura.go 84.7% [144/170] pkg/coverage/coverage.go 96.7% [ 29/30] pkg/coverage/diff.go 90.9% [ 40/44] pkg/coverage/gocover.go 90.6% [ 48/53] pkg/coverage/jacoco.go 84.1% [ 58/69] pkg/coverage/lcov.go 90.6% [ 29/32] pkg/coverage/merge.go 89.9% [ 62/69] pkg/coverage/printer.go 87.8% [ 65/74] pkg/coverage/simplecov.go 77.3% [ 34/44] pkg/pplang/pplang.go 60.4% [ 32/53] pkg/ratio/copy_from_gocloc.go 92.9% [ 26/28] pkg/ratio/merge.go 94.2% [ 81/86] pkg/ratio/ratio.go 66.7% [132/198] report/diff_report.go 70.2% [193/275] report/report.go
さらに octocov view でファイルを指定してテストがカバーしている行も確認できます。
$ octocov -r coverage.out view pkg/coverage/simplecov.go
[...]
112 3371 lcs := fcov.Blocks.ToLineCoverages()
113 3371 fcov.Total = lcs.Total()
114 3371 fcov.Covered = lcs.Covered()
115 3371 cov.Total += fcov.Total
116 3371 cov.Covered += fcov.Covered
117 }
118
119 11 return cov, rp, nil
120 }
121
122 16 func (s *Simplecov) detectReportPath(path string) (string, error) {
123 16 p, err := os.Stat(path)
124 16 if err != nil {
125 return "", err
126 }
127 18 if p.IsDir() {
128 2 // path/to/coverage/.resultset.json
129 2 np := filepath.Join(path, SimplecovDefaultPath[0], SimplecovDefaultPath[1])
130 4 if _, err := os.Stat(np); err != nil {
131 2 // path/to/.resultset.json
132 2 np = filepath.Join(path, SimplecovDefaultPath[1])
133 2 if _, err := os.Stat(np); err != nil {
134 return "", err
135 }
136 }
137 2 path = np
[...]
1列目が行数、2列目がテストにおいて通った回数、3列目が実際のコード行になります。
ターミナル上でカバレッジを確認できるのは意外に便利
私は今までファイル単位のコードカバレッジを見るためには、カバレッジレポートをHTMLで出力してブラウザで見たり、SaaSが提供している画面で見たりする方法しか持っていませんでした。
ターミナルでコードカバレッジをみるというのはターミナル内で開発をする自分のスタイルにもあっています。cat でファイルの中身をみるレベルでカバレッジもみることができるようになって便利です。
octocovは、Goのカバレッジフォーマットだけではなく、Rubyでよく使われるSimpleCovや、PHPUnitが出力可能なClover XMLや、Java/Kotlinでよく使われているらしいJaCoCoや、その他にもLCOVやCoverturaにも対応していますので、是非使ってみてください。