【问题标题】:What is software fault injection really used for?软件故障注入真正用于什么?
【发布时间】:2014-01-26 14:31:46
【问题描述】:

我对软件故障注入的基本理解如下:

无法运行所有可能的测试来测试软件。因此,人们不得不对代码进行修改并分析由此产生的错误程度。

但这有什么用呢?

就像说我们有:

function foo(a, b) {
   return a/b;
}

我们把它改成了

function foo(a, b) {
  return Math.floor(a/b);
}

那又怎样?

这到底有什么用处?

编辑

@Leo, 假设我编写了一个查找斐波那契数的软件。 我编写如下所示的测试: assert(fib(1) == 1);

assert(fib(0) == 0);

assert(fib(3) == 2);

我声称 100% 的覆盖率,因为所有代码行都在这里执行。

我的客户运行这些测试并且所有测试都通过了。 所以他想,“也许测试本身是错误的。让我介绍一下它们的一些变化”。

所以他将其中一个更改为 assert(fib(1) == 5);

测试失败。 他能从中得出什么结论?

【问题讨论】:

  • 他不会在断言中添加更改。他会将更改添加到 fib() 中。您同意如果他更改 fib(),那么您的测试预计会失败?
  • @Leo,是的,是的。那么他能从失败中得出什么结论呢?他一定是改变了一些逻辑,所以失败了。
  • 你知道,一些测试工厂是有偿提供测试代码的。想象一下有人离开公司,不喜欢他的老板并决定用 assertTrue(1==1) 结束每个测试 :-) 它可能一直发生 :-)
  • @Leo,我明白了。谢谢:)

标签: javascript debugging testing fault


【解决方案1】:

假设您聘请了一家公司向您提供一些软件,并且他们承诺会以 90% 的覆盖率对代码进行单元测试,这似乎很划算。

因此您决定在这些测试中插入错误,因此您希望看到通过测试的覆盖率要低得多,但是,在插入错误之后,您发现它仍然是 90% 的覆盖率 :-)

这些测试有多大用处?

例如,这个测试对吗?

@Test
public void testAdd() {
    int result = 0;
    Claszz c = new Claszz();
    int result2 = c.add(-1, 1);
    assertEquals(result,0);
}

【讨论】:

  • 我在这里有点困惑。 90% 的覆盖率是什么意思?不可能涵盖所有可能测试的任何百分比。
  • 真的。覆盖率通常用于衡量代码覆盖率,而不是某人可以尝试的可能测试范围
  • 当您向代码(或测试)添加错误时,您想知道的是代码的“误报”。也许您正在编写测试,但测试本身表明一切正常由于测试中的错误,而不是代码中的错误。
  • 很抱歉之前没有看到您的编辑。不,那个测试是不对的。因此,假设他对其进行了一些更改,但失败了。他不一定能断定这是因为测试是错误的。也许他改变了一些关键的东西(比如assertEquals(result, 1);)但它失败了。这不是测试的错,不是吗?
【解决方案2】:

软件故障注入主要用于检查测试完成的代码覆盖率。如果在代码上运行一组测试数据并且全部通过,那绝对不意味着代码 100% 没有错误。一个原因可能是给定数据,无法访问代码的某些部分。在这种情况下,将修改代码以查看它是否仍按预期工作。

这主要用于测试可能很少遇到的异常或错误处理。

例如,如果有一个字段只接受正数,并且要求输入负值时应显示错误。

在这种情况下,可以设置字段的属性,使用户无法在其中输入 -。所以负值的条件是不可测试的。

这里将修改代码,以便用户可以输入-ve值并检查错误消息。

【讨论】:

    【解决方案3】:

    嗯,这是一个老问题,但谷歌把我带到了这里,所以我只会添加我的观点。

    软件故障注入和相关估计与测试覆盖率有关,但我想说的不仅仅是代码的百分比。它衡量您的测试在发现故障方面的能力。所以你注入了 100 个错误,你的测试找到了其中的 60 个。你错过了 40% 的错误。您的测试中可能有 100% 的代码覆盖率,但仍然错过了这些错误。如果您有一组测试都说 assert(1 == 1),那么您将错过 100% 的错误。

    当然,还有注入质量的问题(即,它们是否触发了可观察到的故障,故障是否重要到足以测试,代码是否可访问等)。但那是另一回事了。

    最后,另一个方面是健壮性测试,使用诸如 Chaos Monkey 之类的工具从您的实时系统中杀死虚拟机实例,旨在评估您的系统如何处理故障、恢复等。但这是一个稍微不同的观点,因为您将故障注入到系统级别,我猜这个问题是在代码/单元测试级别。

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 2016-09-04
      • 2011-09-06
      • 1970-01-01
      相关资源
      最近更新 更多