1、第7章 编码与测试,2,编码,编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。,(1)源程序风格,标识符的命名安排注释程序的视觉组织,构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂;也不要刻意追求技巧性,使程序编写得过于紧凑。例如:AI = AIAT; AT = AIAT; AI = AIAT;,WORK = AT; AT = AI; AI = WORK;,(2)语句构造,对所有的输入数据都要进行检验,识别错误的输入,以保证每个数据的有效性;,(3)输入输出,为什么要对软件进行测试(生命损失的事故),2005年年初,巴拿马国家癌症研究中心,
2、自2001年3月起,有27个病人接受了超量伽马射线的照射。在之后的个月里,有个病人相继去世,而其中有人的死因与接受了超量伽马射线的照射有直接的关系;另外人因受到伽马射线的照射而引发了严重的并发症。,这台放射仪器是由软件来控制的;经研究,这起医疗事故是由控制软件的缺陷引起的。放射量的计算有的误差。,2004年,媒体报道过北美银行由于一个新安装的软件的缺陷,使得数以万计的客户受到影响,该缺陷的修复花费了整整两个星期的时间,造成数亿元损失; 2003年10月,美国的一个主要零售企业被政府重罚,原因是其网站软件的缺陷使得客户相互间可以查看他人在该网站的订单; 2003年4月,美国一个专门为学生提供贷款
3、的公司由于软件出错,错误计算80万名学生贷款利率,导致了800万美元的利率损失;,为什么要对软件进行测试(经济损失的事故),1963年, 美国飞往火星的火箭爆炸损失$ 10 million。 原因: FORTRAN循环: DO 5 I = 1, 3 误写为 DO 5 I = 1.3软件测试的工作量约占整个项目工作量的40左右,对于要求极高的系统测试工作量还要成倍增加。,软件测试基础,E.W.Dijkstra 指出: “程序测试能证明错误的存在,但不能证明错误不存在.”测试的目的是发现程序中的错误,是为了证明程序有错,而不是证明程序无错.,测试的“成功”与“失败”,软件测试的目标,难以说清的软件
4、缺陷,古谚: “一片树叶飘落在森林中没有人听见,谁能说它发出了声音?”,由于不能报告没有看见的问题,因此, 没有看见就不能说存在软件缺陷,如果软件中的问题没有人发现,那么它算不算软件缺陷?”,只有看到了,才能断言软件缺陷,尚未 发现的软件缺陷只能说是未知软件缺陷。,眼 见 为 实,11,软件测试的问题,测试什么? 谁执行测试? 怎样达到测试目的? 什么时候测试? 怎样测试? 测试应进行到什么程度?,测试什么,功能和性能是否存在错误、偏差和缺少,软件测试人员,谁执行测试,怎样达到测试目的-软件测试准则,(1) 所有测试都应该能追溯到用户需求。软件中的问题根源可能在开发前期的各阶段,解决、纠正错误
5、也必须追 溯到前期工作。,16,软件测试准则,(2) 应当把“尽早地和不断地进行软件测试” 作为软件开发者的座右铭。软件测试不等于程序测试。 据美国一家公司统计,查出的软件错误中,属于需求分析和软件设计的错误约占 64%,属于程序编写的错误仅占 36%。程序编写的许多错误是“先天的”。,17,测试与开发前期工作的关系,需求分析,概要设计,详细设计,编 码,单元测试,集成测试,确认测试,系统测试,18,软件测试准则,(3) pareto原则:测试发现的错误中的80%很可能是由程序中20%的模块造成的。(4) 应该从“小规模”测试开始,并逐步进行“大规模”测试。,19,软件测试准则,(5)测试用例
6、应由输入数据和预期的输出结果两部分组成,并且输入要包括合理的输入和不合理的输入数据(6)穷举测试是不可能的。所谓穷举测试就是把程序所有可能的执行路径都检查一遍的测试。,设程序含5个分支,循环次数 20,从A到B的可能路径执行时间: 设测试一次需2ms穷举测试需5亿年.,A,B,穷举测试实例,软件测试准则,(7)为了达到最佳的测试效果,应该由独立的第三方从事测试工作。(8)程序修改后要回归测试。(9)应长期保留测试用例,直至系统废弃。,测试步骤,大型软件系统的测试过程基本上由下述几个步骤组成: 1. 模块测试 - 单元 2. 子系统测试 - 局部 3. 系统测试 - 集成 4. 验收测试 - 用
7、户参与 5. 平行运行 - 新旧共存,23,测试方法,软件测试的策略和方法,静态测试方法,动态测试方法,人工测试方法,计算机辅助静 态分析方法,白盒测试方法,黑盒测试方法,24,静态测试:基本特征是在对软件进行分析、检查和审阅,不实际运行被测试的软件。静态测试约可找出3070%的逻辑设计错误.,通过运行软件来检验软件的动态行为和运行结果的正确性。动态测试的两个基本要素: 被测试程序 测试数据(测试用例),测试用例ID 目的 输入 预期输出 日期 版本 执行人,动态测试,26,白盒测试:如果知道产品的内部工作过程,可以通过测试来检验产品内部动作是否按照规格说明书的规定正常进行黑盒测试:如果已经知
8、道了产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用,动态测试,逻辑覆盖测试,逻辑覆盖是对一系列测试过程的总称,它测的是程序的逻辑路径,1: start input(A,B,x) 2: if(A1) 3: and (B=0) 4: then X=X/A 5: end 6: if(A=2) 7: or(X1) 8: then X=X+1 9: end,例,(A1) and (B=0),(A=2) or (X1),X=X/A,X=X+1,T,T,F,F,a,b,d,c,e,1.语句覆盖,语句覆盖就是设计若干个测试用例,运行被测程序,使得每一条语句至少执行一次。,语句覆盖的缺点,语句覆
9、盖是很弱的逻辑覆盖标准。,判定覆盖就是设计若干个测试用例,在满足语句覆盖的基础上,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历测试一次。,2. 判定覆盖(分支覆盖),判定覆盖缺点,没有对每一个条件进行检查,只关注结果,没关注条件本身,较弱。,3.条件覆盖,条件覆盖就是设计若干个测试用例,在满足语句覆盖的基础上,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。 在图例中,事先可对所有条件的取值加以标记。 对于第一个判断:条件 A1 取真,取假 条件 B0 取真,取假 对于第二个判断:条件A2 取真,取假 条件X1 取真,取假,满足条件覆盖,却不一定满足判定覆盖。
10、,条件覆盖,判定条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,每个判断中的每个分支至少执行一次。,4、判定/条件覆盖,5、条件组合覆盖,条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。 记 A1, B0 作 A1, B0 作 A1, B0 作 A1, B0 作 A2, X1 作 A2, X1 作 A2, X1 作 A2, X1 作,是前述几种覆盖标准中最强的。 满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。,5、条件组合覆盖,控制结构测试,1. 基本路径测试 基本思想: 在程序控制流图的基
11、础上,首先计算程序的环形复杂度,并用该复杂度为指南定义基本可执行路径集合,从该集合导出的测试用例可以保证程序中的每条语句至少执行一次,且每个条件在执行时都将分别取真、假两种值。,基本路径测试的步骤,设计测试用例的步骤如下:第一步,根据过程设计结果画出相应的流图。第二步,计算流图的环形复杂度。第三步,确定线性独立路径的基本集合。第四步,设计可强制执行基本集合中每条路径的测试用例。,独立路径是指至少包含一条在定义该路径之前不曾用过的边,举例讲解,使用基本路径法,设计测试下面列出的伪码程序的测试用例: 1: start input(a,b,c,d) 2: if(a0) 3: and (b0) 4:
12、then x=a+b 5: else x=a-b 6: end 7: if(ca) 8: or(db) 9: then y=c-d 10: else y=c+d 11: end 12: print(x,y) stop,黑盒测试技术,黑盒测试着重测试软件功能。 白盒测试在测试过程的早期进行,而黑盒测试主要用于测试过程的后期。二者是互补的测试方法。 力图发现下述类型的错误:功能不正确或遗漏了功能; 界面错误;数据结构错误或外部数据库访问错误;性能错误; 初始化和终止错误。,黑盒测试常见方法,等价类划分 边界值分析 错误推测,如何划分等价类? 有效等价类(合理等价类) 无效等价类(不合理等价类),等
13、价划分,划分等价类的规则,(1)如果输入条件规定了一个范围,可定义一个有效等价类和两个无效等价类。,例 输入值是学生成绩,范围是0100,划分等价类的规则,(2) 如果输入条件规定了输入数据值的集合或必须遵循的规则,则可以确定出一个有效的等价类和若干个无效的等价类; 例如:Pascal语言规定 “一个语句必须以分号;结束”。这时,可以确定一个有效等价类 “以;结束”,若干个无效等价类 “以:结束”、“以,结束”、“以 结束”、“以LF结束”等。(3) 如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。,划分等价类的规则,(4) 如果规定了输入数据的一组值,而且程序要对每个输入
14、值分别进行处理。这时可为 每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教;一个无效等价类,它是所有不符合以上身分的人员的输入值的集合,如工程师、技术员、科长等。,确立测试用例的原则,建立等价类表,列出所有划分出的等价类。再从划分出的等价类中按以下原则选择测试用例: (1) 设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止; (2) 设计一个新的测试用例,使
15、其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。,例:某一PASCAL语言版本中规定:“在同一说明语句中,标识符至少必须有一个” 。“有效字符数为8个,最大字符数为80个。标识符是由字母开头,后跟字母或数字的任意组合构成。”并且规定:“标识符必须先说明,再使用。,等价类划分法实例,建立输入等价类表,下面选取了9个测试用例,它们覆盖了所有的等价类。 VAR x,T1234567:REAL;BEGIN x := 3.414;T1234567 := 2.732;.(1), (2), (4), (8), (9), (12), (14) VAR :REAL; (3) V
16、AR x,:REAL; (5) VAR T12345678:REAL; (6) VAR T12345:REAL; (7) 多于80个字符 VAR T$:CHAR; (10) VAR GOTO:INTEGER; (11) VAR 2T:REAL; (13) VAR PAR:REAL; (15) BEGIN PAP := SIN (3.14 * 0.8) / 6;,等价类划分法实例,例如:某一报表处理系统,要求用户输入处理报表的日期。 假设日期限制在1990年1月至1999年12月,即系统只能对该段时期内的报表进行处理。如果用户输入的日期不在此范围内,则显示输入错误信息。 该系统规定日期由年、月的
17、 6 位数字字符组成,前 4 位代表年,后两位代表月。 现用等价类划分法设计测试用例,来测试程序的“日期检查功能”。,等价类划分法实例, 划分等价类并编号: 划分成 3 个有效等价类,7 个无效等价类 为合理等价类设计测试用例,对于表中编号为1, 5, 8对应的 3 个合理等价类, 用一个测试用例覆盖。,等价类划分法实例, 为每一个不合理等价类至少设计一个测试用例:测试数据 期望结果 覆盖范围99MAY 输入无效 219995 输入无效 31999005 输入无效 4198912 输入无效 6200001 输入无效 7199900 输入无效 9199913 输入无效 10,等价类划分法实例,边
18、界值分析,人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。如:下标、循环的边界 设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些。,边界值分析法测试方案,选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据。,例如 若输入值的范围是1,100,可取0,1,100,101等值作为测试数据。 若一个输入文件可包括1255个记录,则分别设计有1个记录、255个记录,以及0个记录和256个记录的输入文件的测试用例。 若只能查询0509级大学生的各科成绩,测试用例应查询范围内的某一届或五届学生的学生成绩,还需设计查询04级、10
19、级学生成绩的测试用例(不合理输出等价类)。,边界值分析法测试方案,比较,黑盒测试 白盒测试,优 点,缺 点,性 质,适用于各阶段测试 从产品功能角度测试 容易入手生成测试数 据,可构成测试数据使特定程序部分得到测试,某些代码得不到测试 如果规格说明有误,则无法发现 不易进行充分性测试,不易生成测试数据(通常) 无法对未实现规格说明的部分进行测试 工作量大,通常只用于单元测试,有应用局限,是一种确认技术,回答 “我们在构造一个正确的系统吗?”,是一种验证技术,回答 “我们在正确地构造一个系统吗?”,调试(纠错),调试是在测试发现错误之后排除错误的过程。 调试过程有两种结果:找到了问题的原因并改正和排除了问题; 没找出问题的原因。猜想原因,设计测试用例来验证假设,重复此过程直至找到原因并改正了错误。 是把软件错误的症状和内在原因联系起来的智力过程,很大程度上依赖于软件工程师的经验和技巧。,到底测试到什么程度就测试完了呢? 软件可靠性 软件可用性 估算平均无故障时间,总结,测试的目的 测试什么? 谁执行测试? 什么时候测试? 测试原则 白盒测试法 黑盒测试法,