當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Ruby Coverage模塊用法及代碼示例

本文簡要介紹ruby語言中 Coverage模塊 的用法。

Coverage 為 Ruby 提供覆蓋率測量函數。此函數是實驗性的,因此這些 API 將來可能會更改。

警告:目前,僅支持process-global 覆蓋測量。您無法測量per-thread 覆蓋。

用法

  1. 需要“coverage”

  2. Coverage.start

  3. 需要或加載 Ruby 源文件

  4. Coverage.result 將返回一個包含文件名作為鍵和覆蓋數組作為值的哈希。覆蓋數組為每一行提供解釋器執行的行數。 nil 值表示此行(如 elseend 之類的行)禁用覆蓋。

例子

[foo.rb]
s = 0
10.times do |x|
  s += x
end

if s == 45
  p :ok
else
  p :ng
end
[EOF]

require "coverage"
Coverage.start
require "foo.rb"
p Coverage.result  #=> {"foo.rb"=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}

Coverage

如果在開始覆蓋時未明確指定覆蓋模式,則將運行行覆蓋。它報告每行的行執行次數。

require "coverage"
Coverage.start(lines: true)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:lines=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil]}}

行覆蓋結果的值是一個數組,其中包含每行執行了多少次。這個數組中的順序很重要。例如,該數組中的第一項,位於索引 0 處,報告在運行覆蓋時該文件的第 1 行執行了多少次(在此示例中為一次)。

nil 值表示此行(如 elseend 之類的行)的覆蓋範圍已禁用。

Oneshot 線條 Coverage

Oneshot 行覆蓋在覆蓋運行時跟蹤並報告已執行的行。它不會報告一行被執行了多少次,隻會報告它被執行了多少次。

require "coverage"
Coverage.start(oneshot_lines: true)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:oneshot_lines=>[1, 2, 3, 6, 7]}}

oneshot 行覆蓋結果的值是一個包含已執行行號的數組。

分支 Coverage

分支覆蓋率報告每個條件中的每個分支執行了多少次。

require "coverage"
Coverage.start(branches: true)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:branches=>{[:if, 0, 6, 0, 10, 3]=>{[:then, 1, 7, 2, 7, 7]=>1, [:else, 2, 9, 2, 9, 7]=>0}}}}

分支散列中的每個條目都是一個條件,其值是另一個散列,其中每個條目是該條件中的一個分支。值是方法執行的次數,鍵是關於分支的標識信息。

構成識別分支或條件的每個鍵的信息如下,從左到右:

  1. 分支或條件類型的標簽。

  2. 唯一標識符。

  3. 它出現在文件中的起始行號。

  4. 它出現在文件中的起始列號。

  5. 它出現在文件中的結束行號。

  6. 它出現在文件中的結束列號。

方法 Coverage

方法覆蓋率報告每個方法執行了多少次。

[foo_method.rb]
class Greeter
  def greet
    "welcome!"
  end
end

def hello
  "Hi"
end

hello()
Greeter.new.greet()
[EOF]

require "coverage"
Coverage.start(methods: true)
require "foo_method.rb"
p Coverage.result #=> {"foo_method.rb"=>{:methods=>{[Object, :hello, 7, 0, 9, 3]=>1, [Greeter, :greet, 2, 2, 4, 5]=>1}}}

方法哈希中的每個條目代表一個方法。此散列中的值是方法執行的次數,鍵是有關方法的標識信息。

構成識別方法的每個鍵的信息如下,從左到右:

  1. 班上。

  2. 方法名稱。

  3. 方法出現在文件中的起始行號。

  4. 方法出現在文件中的起始列號。

  5. 方法出現在文件中的結束行號。

  6. 方法出現在文件中的結束列號。

所有 Coverage 模式

您還可以使用此快捷方式同時運行所有覆蓋模式。請注意,運行所有覆蓋模式不會同時運行行和 oneshot 行。這些模式不能同時運行。在這種情況下運行行覆蓋,因為您仍然可以使用它來確定是否執行了行。

require "coverage"
Coverage.start(:all)
require "foo.rb"
p Coverage.result #=> {"foo.rb"=>{:lines=>[1, 1, 10, nil, nil, 1, 1, nil, 0, nil], :branches=>{[:if, 0, 6, 0, 10, 3]=>{[:then, 1, 7, 2, 7, 7]=>1, [:else, 2, 9, 2, 9, 7]=>0}}, :methods=>{}}}

相關用法


注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 Coverage模塊。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。