【问题标题】:Understanding Mutant Failures了解突变失败
【发布时间】:2015-08-11 07:12:54
【问题描述】:

我有如下 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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    此类情况的小备忘单:

    1. 确保您的规格现在是绿色的。
    2. 根据差异显示更改代码
    3. 尝试观察不需要的行为变化。
      1. 不可能?
        1. (可能)将突变视为更好的代码。
        2. (不太可能)向突变体报告错误
      2. 发现行为更改:将其编码为测试,或更改测试以涵盖该行为。
    4. 重新运行突变体以验证突变体的死亡。
    5. 确保mutant 确实列出了您添加的用于该突变的测试。如果不重组测试以覆盖所选测试中的突变主题。

    现在来看你的情况:如果你将突变应用到你的代码中。该参数被忽略并且本质上是硬编码的(在您的查找器中使用的键 :shortlink 的值不会根据参数 shortlink 而改变)。因此,您在测试中唯一需要做的就是添加一个案例,其中参数 shortlink 对您在测试中的期望很重要。

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

    【讨论】:

    • 感谢您的详细解答!关于我的示例,我仍然不明白一些事情(实际上是一些事情,但我会保持简洁)。将参数更改为self 会导致ActiveRecord:;StatementInvalid 异常。这是因为你提到的强制问题,还是 Mutant 希望我的测试涵盖的极端情况?
    • 这意味着您的测试根本无法验证值是什么。值可以替换为 self(随机对象的方便替代)这一事实意味着该方法的那部分没有规范。
    • @dkubb 这是否意味着嘲笑find_by!,在我的测试中添加关于参数值或其他内容的断言?可以给我举一个这种规范的例子吗?
    • 如果你不想接触数据库,那么#find_by!(shortlink: your_argument) 的消息期望就可以完成这项工作。比您的规范只能保证您的方法 #find_by_shortlink 转换为查找器。这已经足够了,因为您应该已经信任 #find_by! 的实现了。
    猜你喜欢
    • 2023-02-11
    • 1970-01-01
    • 2015-10-23
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多