三、结构化系统实现(续)
2、软件测试(续)
(4)测试策略(测试步骤)
单元测试->集成测试->系统测试->验收测试
1、单元测试测试内容
模块接口: 数据是否正确进出模块。
局部数据结构:局部数据的说明、初始化、默认值是否有问题。
重要执行路径(白盒):重要执行路径是否有错误计算、不正确比较或不适当控制流。
出错处理通路:错误描述是否难于理解;记下错误是否与实际遇到错误不同;错误处理之前,错误条件已引起系统干预;错误处理不正确;描述错误信息不足以帮助确定错误位置;等错误处理是否恰当合适。
边界条件(黑盒): 最重要,软件容易在边界上失效。
2、单元测试测试方法
- 代码审查(人工):先由编写人非正式进行,再由审查小组正式进行,可查30%到70%设计错误和编码错误。程序编写者讲解,审查小组审查。一般由经验丰富的开发人员执行。
- 计算机测试:由于需要单独测试某一个模块所以我们需要设计一些辅助的程序来测试模块,主要有两种.
- 驱动模块──相当被测模块主程序。接收测试数据,传送给被测模块,再输出测试结果。
- 桩模块 ──存根模块。代替被测模块调用的子模块。
3、集成测试测试内容
穿越接口数据是否丢失;
一模块功能是否对另一模块功能产生不利影响;
各子功能组合起来,能否达到预期的父功能;
全局数据结构是否有问题;
单个模块误差累积起来,是否会放大等。(尤其是浮点等误差是否会放大。)
4、集成测试测试方法
- ①非渐增式集成:把所有模块一次组装进行测试。
- ②渐增集成:将模块逐步组装成较大系统
- 自顶向下集成
- 深度优先
- 广度优先
- 自底向上集成
- 自顶向下集成
非渐增式集成对于大型系统很难适用,因为太过复杂,直接合并甚至能否运行都位置。对于小型团体或个人软件开发来说,它就具有简单易行的特点
完全使用自顶向下:不能直接使用调用的模块,而桩模块需要设计,由于自顶向下所以桩模块很麻烦
完全使用自顶向上:设计控制模块即可,但是新增模块后是否会对已有模块造成影响很难判断,需要极高的耦合或者大量回归测试
- ③混合策略
- 改进的自顶向下测试方法:基本用自顶向下方法,早期用自底向上测试关键模块。
- 混合法: 软件结构上层模块用自顶向下,下层用自底向上。
5、回归测试
重新执行已作过测试的某子集,保证变化没带来非预期副作用。
回归测试集:
(1)检测软件全部功能的代表性测试用例;
(2)专门针对可能受修改影响的软件功能附加测试;
(3)针对被修改过软件功能测试
6、系统测试
用于系统测试的测试类型:
恢复测试:以不同方式强制软件出现故障,检测软件能否恰当完成恢复
- 自动恢复:检测重新初始化、数据恢复、重新启动等是否正确。
- 人工干预恢复:检测平均恢复时间是否在允许范围内。
安全性测试:测试者扮演试图攻击系统角色:通过外部手段获取密码;通过客户软件攻击系统;控制系统使其他人无法访问;引发系统错误,期望在系统恢复中侵入系统等。
只要有足够的资源和时间,一定能够侵入系统!设计目标:攻破系统付出代价大于攻破系统后得到信息价值。
强度测试:检验系统能力最高达到实际限度, 让系统处于资源异常数量、异常频率、异常批量条件下测试系统承受能力。一般比平常限度高5-10倍的限度做测试用例。
性能测试:软件运行性能与性能要求比较,检验是否达到性能要求规格。
7、确认测试(验收测试)
*确认测试以需求规格说明书为测试基础;采用黑盒法。主要就是测试不同用户不同环境下的软件表现。 *
(5)调试
软件调试是在进行了成功的测试之后才开始的工作。它与软件测试不同,调试的任务是进一步诊断和改正程序中潜在的错误。
调试方法
①强行排错
- (1)将内存内容打印出来分析。
- (2)程序特定部位设置打印语句。若找不到范围,可利用二分法。
- (3)自动调试工具。
②回溯法排错(小程序常用):确定最先发现“症状”位置。人工沿程序控制流程向回追踪源代码,直到找到错误根源或确定错误产生范围。
③原因排除法
- 对分查找法:如已知每个变量在程序内若干关键点正确值,用赋值或输入语句在程序中点附近“注入”正确值,运行程序检查输出。正确,错误原因在程序上半部分;反之,在程序后半部分。反复使用,将程序出错范围缩小到容易诊断的程度。
- 归纳法:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误。
- 演绎法:演绎法是从一般原理或前提出发,经过排除和精化的过程来推导出结论的逻辑方法。
- 根据已有测试用例,设想所有可能出错原因;
- 逐个排除不正确的;
- 验证余下假设确是出错原因。
(6)软件可靠性
可靠性:程序在给定时间间隔及环境条件下,按规格说明书的规定,成功运行的概率。
可用性:给定的时间点,按规格说明书规定,成功运行概率。
注意区别:可用性强调的是时间点,是否可用。可靠性是时间段:在该时间段内能否成功运行,其中可有系统自行修复漏洞、人工修复等时间,判断的是时间段内能否成功运行的可靠性。
可靠性Ass=成功运行时间/成功运行时间+错误时间
引入系统平均无故障时间MTTF和平均维修时间MTTR的概念,则:
估算平均无故障时间:
1000条指令5~20错误,是由大量数据得来的。
只有Et我们无法获知,因为就连测试都是尽可能的发现错误。我们需要一些方法获取。
(1)植入错误法:测试之前由专人在程序中随机植入错误,测试后,根据发现错误中原有的和植入的两种错误的比例,估计程序中错误总数。
- 缺点:人为植入的错误,发生概率和自然有很大偏差。
(2)分别测试法:如果能对程序中原有的错误加上标记,然后再通过进一步的测试,就可以对潜在故障进行估计。由甲乙两测试员分别测试,一测试员测出错误作为有标记错误。