make_my_diffs_pretty!只有在出现错误时才减慢我的测试套件?

Does make_my_diffs_pretty! slow down my test suite only when there are errors?

我发现我可以在我的测试中添加 make_my_diffs_pretty!,对于复杂的结构有一个像样的差异是非常好的。

我读到它比正常的差异慢,但只有在输出未通过测试的结果时才慢吗? (所以,只有当测试没有通过时它才会变慢?)

它会减慢某些通过 失败的测试。但是这种性能损失的影响完全取决于您的 特定测试套件 - 因此您需要在自己的应用程序上对其进行基准测试以衡量差异!

Here is the source code 对于 make_my_diffs_prtty!:

def self.make_my_diffs_pretty!
  require "pp"

  define_method :mu_pp, &:pretty_inspect
end

因此忽略 require 'pp' 的微小潜在性能损失,让我们考虑重新定义 mu_pp 方法的影响。

例如,现在让我们看一下the source code for the diff assertion method:

def diff exp, act
  expect = mu_pp_for_diff exp
  butwas = mu_pp_for_diff act
  result = nil

  need_to_diff =
    (expect.include?("\n")    ||
     butwas.include?("\n")    ||
     expect.size > 30         ||
     butwas.size > 30         ||
     expect == butwas)        &&
    Minitest::Assertions.diff

  return "Expected: #{mu_pp exp}\n  Actual: #{mu_pp act}" unless
    need_to_diff

  Tempfile.open("expect") do |a|
    a.puts expect
    a.flush

    Tempfile.open("butwas") do |b|
      b.puts butwas
      b.flush

      result = `#{Minitest::Assertions.diff} #{a.path} #{b.path}`
      result.sub!(/^\-\-\- .+/, "--- expected")
      result.sub!(/^\+\+\+ .+/, "+++ actual")

    # ...
end

def mu_pp_for_diff obj
  mu_pp(obj).gsub(/\n/, "\n").gsub(/:0x[a-fA-F0-9]{4,}/m, ":0xXXXXXX")
end

mu_pp方法在之前被调用,输出测试失败的结果。它也用作实际检查的一部分。

此外,行:return "Expected: #{mu_pp exp}\n Actual: #{mu_pp act}" unless need_to_diff 正在充当 性能增强:通过走捷径,diff 将 "obviously" 失败。但是,通过使用 make_my_diffs_pretty! 方法,请注意 expect.sizeactual.size 现在将显着变大 - 因此 "full check" 将更频繁地执行。