我对软件故障注入的基本理解如下:
一个人不能运行所有可能的测试来测试一个软件。因此,我们需要对代码进行修改,并分析由此产生的错误程度。
但这有什么用呢?
就像我们说过:
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);
而测试失败了。他能从中得出什么结论?
发布于 2014-01-26 14:39:37
假设您已经聘请了一家公司向您提供一些软件,并且他们承诺以90%的覆盖率对代码进行单元测试,这似乎是一笔很大的费用。
因此,您决定在这些测试中插入错误,因此您希望看到传递测试的覆盖率要低得多,但是,在插入错误之后,您会发现它的覆盖率仍然是90%:)
这些测试有多有用?
例如,这个测试是对的吗?
@Test
public void testAdd() {
int result = 0;
Claszz c = new Claszz();
int result2 = c.add(-1, 1);
assertEquals(result,0);
}发布于 2014-02-02 19:15:51
软件错误注入基本上用于检查测试完成的代码覆盖率。如果在代码上运行了一组测试数据,并且所有测试数据都通过了,那么这肯定并不意味着代码是100%没有bug的。一个原因可能是,给定数据,代码的某些部分是不可触及的。在本例中,对代码进行了修改,以查看它是否仍按预期工作。
这主要用于测试异常或错误处理,这些异常或错误处理可能很少遇到。
例如,如果有一个字段只接受正数,并且要求输入负值时应显示错误。
在这种情况下,可以设置字段的属性,使用户无法输入该属性。因此,负值条件是不可检验的。
在这里,代码将被修改,以便用户可以输入-ve值并检查错误消息。
发布于 2016-04-11 15:53:15
嗯,这是一个老问题,但谷歌把我带到了这里,所以我只想补充我的观点。
软件错误注入和相关的估计与测试覆盖率有关,但我要说的不仅仅是作为代码的百分比。这是一个衡量你的测试在发现错误方面有多好。所以你注射了100个错误,你的测试发现了其中的60个。你漏掉了40%的错误。您的测试中可能有100%的代码覆盖率,但仍然漏掉了这些错误。如果您有一组测试,所有测试都是断言(1 == 1),那么您就会错过100%的错误。
当然,还有注射质量的问题(例如,它们是否触发可观察的故障,故障是否足够重要以进行测试,代码是否可达,等等)。但这是另一回事。
最后,另一个方面是健壮性测试,它使用像Chaos这样的工具从您的实际系统中杀死VM实例,目的是评估您的系统如何处理故障、恢复等。但是这是一个稍微不同的观点,因为您在系统级别注入了错误,我想这个问题是在代码/单元测试级别上提出的。
https://stackoverflow.com/questions/21364626
复制相似问题