我对软件故障注入的基本了解如下:
无法运行所有可能的测试来测试软件。因此,人们可以对代码进行修改并分析从中产生的错误程度。
但这有用吗?
就像说我们有:
function foo(a, b) {
return a/b;
}
我们将其更改为
function foo(a, b) {
return Math.floor(a/b);
}
那么它是什么?
这有什么用呢?
修改
@Leo,
说我写了一个找到Fibonacci数字的软件。
我写的测试看起来像这样:
assert(fib(1) == 1);
assert(fib(0) == 0);
assert(fib(3) == 2);
我声称100%覆盖率,因为所有代码行都在这里执行。
我的客户端运行这些测试,所有测试都通过。 所以他认为,“也许测试本身是错误的。让我介绍一下它们的一些变化。”
所以他改变其中一个
assert(fib(1) == 5);
并且测试失败。 他能从中得出什么结论?
答案 0 :(得分:4)
假设您聘请了一家公司为您提供一些软件,他们承诺他们会以90%的覆盖率对他们的代码进行单元测试,这似乎很不错。
所以你决定在这些测试中插入错误,所以你希望看到通过测试的覆盖率要低得多,但是,插入错误之后,你发现它仍然有90%的覆盖率: - )
这些测试有用吗?
例如,这个测试对吗?@Test
public void testAdd() {
int result = 0;
Claszz c = new Claszz();
int result2 = c.add(-1, 1);
assertEquals(result,0);
}
答案 1 :(得分:1)
软件故障注入主要用于检查测试完成的代码覆盖率。如果在代码上运行一组测试数据并且所有测试数据都通过它肯定不会意味着代码是100%无错误的。一个原因可能是,给定数据,代码的某些部分是不可访问的。在这种情况下,代码将被修改以查看它是否仍按预期工作。
这主要用于测试很少遇到的异常或错误处理。
例如,如果某个字段只接受正数,并且要求输入负值时应显示错误。
在这种情况下,可以设置字段的属性,以便用户无法输入。所以负值的条件是不可测试的。
此处将修改代码,以便用户可以输入-ve value并检查错误消息。
答案 2 :(得分:1)
这是一个老问题,但Google让我在这里,所以我只想添加我的观点。
软件故障注入和相关估计与测试覆盖率有关,但我不是简单地说代码的百分比。它衡量您的测试在发现故障方面有多好。所以你注入了100个故障,你的测试找到了60个。你错过了40%的错误。您的测试可能有100%的代码覆盖率,但仍然错过了这些错误。如果你有一组测试都说断言(1 == 1),你就会错过100%的错误。
当然,存在注射质量的问题(即,它们是否触发可观察到的故障,是否足够重要的故障进行测试,代码是否可达,等等)。但那是另一回事。
最后,另一个方面是健壮性测试,使用像Chaos Monkey这样的工具可以从你的实时系统中杀死虚拟机实例,旨在评估你的系统如何处理故障,恢复等等。但是这是一个略有不同的观点,因为你在系统级别,我想这个问题是在代码/单元测试级别上。