
Issue #19715 has been updated by ngan (Ngan Pham). mame (Yusuke Endoh) wrote in #note-1:
`oneshot_lines` is a mode that reports execution at most once for each line. The record is not reset even by `clear: true`. Currently, we do not provide a way to reset the record.
The supposed use case for `oneshot_lines` is to get information for removing unnecessary codes. By periodically calling `Coverage.result(stop: false, clear: true)` on a long-running server, you can collect code line numbers that are executed. Conversely, this information will reveal the code that is most likely no longer being used. In this use case, if duplicate line executions are reported before and after `clear: true`, it will bring unneeded overhead.
Do you want such a reset feature? If so, please let me know the use case for that.
Ah yes, we were looking to use oneshot_lines to determine which tests run which production files. Using `lines` is slow so I figured oneshot_lines was usable for this. We do need to clear and reset the markers after each test though. I might switch to use TracePoint since the `lines` is really slow. ---------------------------------------- Bug #19715: Coverage oneshot_lines mode is not working after result clear https://bugs.ruby-lang.org/issues/19715#change-103549 * Author: ngan (Ngan Pham) * Status: Rejected * Priority: Normal * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- Given a simple Ruby file (`foo.rb`): ```ruby def hello puts "hello" end ``` If I do the following in `irb`, I get unexpected results: ``` irb(main):001:0> require 'coverage' irb(main):002:0> Coverage.setup(oneshot_lines: true) => nil irb(main):003:0> require_relative 'foo' => true irb(main):004:0> Coverage.resume => nil irb(main):005:0> hello hello => nil irb(main):006:0> Coverage.suspend => nil irb(main):007:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:oneshot_lines=>[2]}} irb(main):008:0> Coverage.resume => nil irb(main):009:0> Coverage.suspend => nil irb(main):010:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:oneshot_lines=>[]}} irb(main):011:0> Coverage.resume => nil irb(main):012:0> hello hello => nil irb(main):013:0> Coverage.suspend => nil irb(main):014:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:oneshot_lines=>[]}} ``` You can see that in the third `Coverage.result` call, oneshot_lines did not populate despite me executing `hello`. If I use `lines`, then it works the way I'd expect it to: ``` irb(main):001:0> require 'coverage' irb(main):002:0> Coverage.setup(lines: true) => nil irb(main):003:0> require_relative 'foo' => true irb(main):004:0> Coverage.resume => nil irb(main):005:0> hello hello => nil irb(main):006:0> Coverage.suspend irb(main):007:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:lines=>[0, 1, nil]}} irb(main):008:0> Coverage.resume => nil irb(main):009:0> Coverage.suspend irb(main):010:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:lines=>[0, 0, nil]}} irb(main):011:0> Coverage.resume => nil irb(main):012:0> hello hello => nil irb(main):013:0> Coverage.suspend irb(main):014:0> Coverage.result(stop: false, clear: true) => {"/project/foo.rb"=>{:lines=>[0, 1, nil]}} ``` I get that `oneshot_lines` is only suppose to count the line once, but I'd expect that upon a reset/clear, it should remark the line as executed. I wasn't sure if this is expected behavior or a bug. -- https://bugs.ruby-lang.org/