了解突变失败

时间:2015-05-28 16:34:28

标签: ruby-on-rails ruby tdd mutation-testing

我有以下ActiveRecord模型类方法:

def self.find_by_shortlink(shortlink)
  find_by!(shortlink: shortlink)
end

当我针对这种方法运行Mutant时,我被告知在测试运行后有17个突变,16个仍然“活着”。

这是“活”突变之一:

-----------------------
evil:Message.find_by_shortlink:/home/peter/projects/kaboom/app/models/message.rb:29:3f9f2
@@ -1,4 +1,4 @@
 def self.find_by_shortlink(shortlink)
-  find_by!(shortlink: shortlink)
+  find_by!(shortlink: self)
 end

如果我手动进行同样的更改,我的测试会失败 - 正如预期的那样。

所以我的问题是:如何编写“杀死”这种突变的单元测试?

1 个答案:

答案 0 :(得分:3)

免责声明,突变作者发言。

针对这种情况的迷你备忘单:

  1. 确保您的规格现在为绿色。
  2. 更改差异显示的代码
  3. 尝试观察不需要的行为更改。
    1. 不可能?
      1. (可能)将变异视为更好的代码。
      2. (不太可能)向突变体报告错误
    2. 发现行为更改:将其编码为测试,或更改测试以涵盖该行为。
  4. 重新运行突变体以验证突变的死亡。
  5. 确保突变体实际列出了您添加的用于该突变的测试。如果没有重组测试以覆盖所选测试中的突变主题。
  6. 现在对您的情况:如果您将变异应用于您的代码。参数被忽略并且基本上是硬编码的(查找器中使用的键:shortlink的值不会根据参数shortlink而改变)。因此,您在测试中唯一需要做的就是添加一个案例,其中参数shortlink对您在测试中的期望很重要。

    如果传递self作为:shortlink finder的值与传入您测试的当前参数具有相同的效果,请尝试使用其他参数。在AR中强制查找值可能很棘手,您的模型有可能强制转换为您作为参数测试的相同值。