软件工程中的故障注入
故障注入是一种通过在软件中引入故意故障来提高测试质量的技术。故障注入经常出现在压力测试中,被认为是开发健壮软件的重要组成部分。
从故障广播到明显故障,遵循一个明确定义的周期。在执行期间,故障可能会导致在系统边界内不是有效状态的错误。相同的错误可能会在系统边界内导致更多错误,因此每个新错误都充当故障,并且可能传播到系统边界并可以观察到。当在系统边界观察到错误状态时,称为故障。
故障注入的分类:
根据软件实现的不同,故障注入可以分为两类:编译时故障注入和运行时故障注入。这些解释如下。
1.编译时错误注入:
编译时故障注入是一种故障注入技术,其中修改源代码以将模仿的故障注入系统。
编译时使用两种方法来实现错误:
- 代码修改:
突变测试用于更改现有的代码行,以便可能存在错误。代码变异产生的错误类似于程序员无意中造成的错误。例子:
Original Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a - 1; } return 0; } Modified Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a + 1; // '-' is changed to '+' } return 0; }
现在可以观察到 a 的值会增加,“while 循环”将永远不会终止,程序将进入无限循环。
- 代码插入:
代码变异的第二种方法是代码插入错误注入,它添加代码而不是修改现有代码。这基本上是通过使用焦虑函数来完成的,这些函数是简单的函数,它们采用现有值并通过某种逻辑将其更改为另一个值。例子:
Original Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a - 1; } return 0; } Modified Code: int main() { int a = 10; while ( a > 0 ) { cout << "GFG"; a = a - 1; a++; // Additional code } return 0; }
现在可以观察到 a 的值是固定的,“while 循环”将永远不会终止,程序将进入无限循环。
2.运行时故障注入:
运行时故障注入技术使用软件触发器将故障注入正在运行的软件系统中。可以通过多种物理方法注入故障,并且可以以不同的方式实现触发器。
运行时故障注入中使用的软件触发器:
1. Time Based Triggers
2. Interrupt Based Triggers
3种方法用于在运行时注入故障:
- 破坏内存空间:
此方法涉及破坏主存储器和处理器寄存器。 - 系统调用介入:
这种方法与从操作系统内核接口到执行系统软件的故障模拟有关。这是通过拦截用户级软件进行的操作系统调用并将故障注入其中来完成的。 - 网络级别:
此方法与网络接口处网络数据包的损坏、丢失或重新排序有关。
不同软件测试中的故障注入:
- (a)鲁棒性测试——在鲁棒性测试中使用故障注入。
- (b)压力测试——故障注入也用于压力测试。