Ruby 2.6 の変更点 - Coverage

Ruby2.6アドベントカレンダーの24日目の記事です。

qiita.com

Coverage

https://bugs.ruby-lang.org/issues/15022

Coverage.start:oneshot_lines キーワード引数追加

Coverage はそれぞれの行を何回実行したかを数えていたんですが、たいていの場合は実行したかどうかが重要で何回実行したかはそんなに重要じゃないだろうってことで、oneshot_lines: true を指定すると実行した行番号だけを出力するようになります。

hoge.rb:

1: def hoge
2:   10.times do
3:     nil
4:   end
5:   true
6: end
require 'coverage'
Coverage.start
require '/tmp/hoge.rb'
hoge
Coverage.result #=> {"/tmp/hoge.rb"=>[1, 1, 10, nil, 1, nil]}

1, 2, 5行目が1回、3行目が10回実行されたことを示しています。

require 'coverage'
Coverage.start(oneshot_lines: true)
require '/tmp/hoge.rb'
hoge
Coverage.result #=> {"/tmp/hoge.rb"=>{:oneshot_lines=>[1, 2, 3, 5]}}

1, 2, 3, 5行目が実行されたことがわかります。

Coverage.result:stop, :clear キーワード引数追加

:stop が真の場合はカバレッジ測定を終了します(デフォルト)。偽の場合は測定を継続します。

:clear が真の場合は測定結果をリセットします。偽の場合は結果を保持します(デフォルト)。

Coverage.result(stop: false)                #=> {"/tmp/hoge.rb"=>{:oneshot_lines=>[1, 2, 3, 5]}}
Coverage.result(stop: false, clear: true)   #=> {"/tmp/hoge.rb"=>{:oneshot_lines=>[1, 2, 3, 5]}}
Coverage.result(stop: true)                 #=> {"/tmp/hoge.rb"=>{:oneshot_lines=>[]}}
Coverage.result                             #=> coverage measurement is not enabled (RuntimeError)

Coverage.line_stub 追加

指定したファイルの各行が有効な行(0)か無意味な行(nil)かを示す結果を返します。実行はされません。

hoge.rb:

1: # コメント
2: def hoge
3:   123
4: end
5:
6: hoge
require 'coverage'
Coverage.line_stub("hoge.rb") #=> [nil, 0, 0, 0, nil, 0]

コメント行(1行目)と空行(5行目)が無意味な行であることがわかります。