嵌入式软件测试基础概述

338 阅读4分钟

一、静态测试

大多数嵌入式软件工作在空间资源、时间资源受限的环境里,对软件的可靠性要求非常高,而静态测试时确保软件可靠性的重要手段。

静态测试是指不允许程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。静态测试方法包括静态分析、代码分析、代码审查、质量度量等,借助专用的软件工具对源程序进行各种分析,如编码规则检查、变量定义分析、数据留分析、圈复杂度分析、代码安全性分析等。

编码规则检查
1、数据类型相关的编码风格
2、数据转换
3、初始化规范
4、指针规范

指针的类型转换 指针和数组的运算 指针的有效性

5、表达式规范
6、程序流的控制规范
7、函数相关规范

函数的定义和声明 函数的调用和使用

安全性检查
1、数据流分析
2、控制流分析

可以进行结构化编程验证和不可达代码检查。 可以发现以下错误内容: 无条件跳转(goto)语句的使用 不适当的循环嵌套和分支嵌套 死循环 转向不存在的的子程序 未使用的变量、子程序定义 不可达语句

3、接口分析
4、 表达式分析

用于发现以下几种错误: 程序中括号的使用不正确 数组引用错误 除数可能为0 负数开平方 正切值的自变量可能为Π/2 浮点数进行相等比较

二、动态测试

使被测代码在真实环境或仿真环境下有控制地运行,针对代码在运行情况下能体现的功能、逻辑、行为、结构等,多角度观察程序运行时的行为,检查运行结果与预期结果的差异,以发现其中的错误,并分析运行效率和健壮性等性能。

动态测试又分为黑盒测试和白盒测试,黑盒测试与需求紧密相关,需求规格说明的质量回直接影响测试的结果,黑盒测试只能限制在需求的范围内进行,在进行嵌入式软件黑盒测试时,要把系统的预期用途作为重要依据,根据需求中对负载、定时、性能的要求,判断软件是否满足这些需求规范

常见运行时错误类型及基本原理:

1、缓冲区溢出

产生原因:当向已分配了确定储存空间的缓冲区内复制多于该缓冲区处理能力的数据时,就会发生缓冲区移除,移除包括堆溢出和堆栈溢出。

改善措施:A、编写正确的代码和代码分析 B、设置非执行的缓冲区 C、数组边界检查 D、改进C语言函数库 E、程序指针完整性检查

2、内存泄漏

产生原因:没有释放向系统申请的内存

A、常发性内存泄漏

发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。随着程序的运行,这些泄漏会不断的堆积。

B、偶发性内存泄漏

发生内存泄漏的代码直在某些特定的环境或操作过程中才会发生,而且随着程序的运行、用户的使用,这些泄漏可能会不断堆积。这类泄漏一般发生在程序的非主流运行路径上,但因为它们不常发生,所以给调试带来了很大困难。

C、一次性内存泄漏

发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块(或仅限于这一块)内存发生泄漏。

D、隐式内存泄漏

这些泄漏不是有与没有释放内存,而是由于没有及时释放内存造成的。程序在运行过程中不停的分配内存,但直到结束时才释放内存,会造成系统内存和资源的耗尽。这类泄漏是危害最大的,最难发现的,是最应该引起重视的。

3、引用未初始化变量

产生原因:变量在声明后,没有对其初始化赋值就进行引用,导致程序出错或死机。

4、指针与数组错误

计算机内存中的每个存储单元都有器存储地址,根据存储地址即可准确找到该内存单元。通常把这个地址称为指针。

1)指针错误使用

指针变量未赋初始值

指针指向的内存已经被释放

指针引起的内存泄漏

指针被重复释放

指针的使用超出其作用范围

2)指针与数组

3)数组访问越界

指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外。