1TM嵌入式软件测试技术与策略AnIntroductiontoEmbeddedSoftwareTesting2020年5月20日2内容提要关于软件测试软件测试技术嵌入式软件测试方法嵌入式软件测试策略嵌入式软件测试解决方案2020年5月20日3对软件测试的几种认识测试与调试类似,是对调试的一种补充测试是为了证明软件正确测试是为了发现软件错误测试是检验软件是否满足规定的需求测试是为了减小软件不工作的风险测试是不需要更多的测试工作即可以产生低风险软件的一种认识上的训练关于软件测试(1)2020年5月20日4关于软件测试(2)什么是软件测试专家说法:测试是为了发现错误而执行程序的过程软件测试是对软件建立信心的过程……IEEE1983:使用人工或自动手段来运行某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清结果与实际结果之间的差别总结软件测试要解决的问题是:软件的行为是否符合“规定的”要求,它有两个方面的含义:Doesitdoeverythingitisspecifiedtodo?Doesitdoanythingitisnotspecifiedtodo?2020年5月20日5软件测试的重要性海湾战争期间,由于跟踪软件在运行100小时后出现0.36秒的舍入误差,导致未能成功拦截一枚飞毛腿导弹,致使28名联军士兵丧生。1963年美国宇航局事例(Fortran程序):DO5I=1,3误写成DO5I=1.3;一点之差导致火箭发射失败1996年6月4日,阿利亚娜5型火箭首次发射失败关于软件测试(3)doubled_bh;shorts_bh;sense_horizontal_velocity(&d_bh);s_bh=d_bh;//OPERANDERROR2020年5月20日6软件测试的重要性当前的软件开发方法——免疫力低软件是一种特殊的产品开发方法学因素人不能避免犯错误软件开发工具不完备维护费用昂贵软件测试——保证软件产品质量的重要手段软件测试能最大限度的发现软件中的错误,减少软件中残留的错误,提高软件产品的可靠性通过软件测试可以验证软件功能、性能、可用性、可移植性、约束、限制等指标满足规定的需求软件可靠性测试可得到软件可靠性指标软件测试为软件质量的定量评定提供依据关于软件测试(4)2020年5月20日8关于软件测试(5)软件测试的发展历程软件测试并不是一开始就有的轻视——重视简单——复杂被迫——主动如何开展软件测试测试是一个非常复杂的过程,不仅要掌握相应的技术和方法,而且还要懂得在什么时候、什么情况下使用什么方法,这就是软件测试的策略问题。另外,软件测试的实施需要有效的管理,仅靠简单地组建测试队伍或购买一两件测试工具是不够的。因此,技术、策略和管理构成了软件测试工程的三大要素。2020年5月20日9测试与调试的关系测试是检查软件发现问题,调试是分析软件解决问题测试贯穿于整个软件生存期,调试主要是在软件开发过程中调试具有随意性、不明确性,而测试是明确的、可重复的测试是全方位的,而调试是代码级的测试与调试不能相互替代,但相互支持,相辅相成关于软件测试(6)2020年5月20日10软件测试的基本原则Good-enough原则:权衡投入/产出比,既不要不充分,也不要过分。Pareto法则:在分析、设计、试验、复审等阶段能够发现和避免80%的bug而系统的软件测试能够找出其余bug中的80%。应尽早地开展软件测试。问题发现得越早,解决问题的代价就越小。严格执行测试计划,排除测试的随意性测试是需要维护的妥善保存测试计划、测试用例、出错统计和测试分析报告,为维护提供方便完全彻底的测试是不可能的。关于软件测试(7)2020年5月20日1118timesStatisticalPaths=1018假设每次测试用时1ns,全年不间断地测试:T=31.7Years关于软件测试(8)T=3600x24x365101810-9x2020年5月20日12什么是“错误”我们通常用“错误”这一术语来描述测试过程中发现的各种问题在没有特别加以说明的情况下,这是一个泛用的、模糊的概念,它指的可能是:defect:缺陷。bug:差错。error:出错。failure:失效。关于软件测试(9)2020年5月20日13测试设计测试是需要设计的。因此测试是一项具有很大创造性的工作,其工作量一点也不比软件设计小。软件测试与软件开发相比,并不低人一等。软件测试的创造性主要表现在:测试方案选择测试计划制定测试用例设计测试结果的分析测试过程的管理...关于软件测试(10)2020年5月20日14测试用例所谓测试用例,是一份关于具体测试步骤的文档,用于指导测试的实际操作。测试用例可以是纯文本的说明文档,也可以是用脚本语言或高级语言编写的一段代码。测试用例应当包括:测试用例名称及标识测试目的测试条件及设置输入数据要求预期的输出结果操作步骤测试用例的典型设计方法黑盒法(Blackboxtesting)白盒法(Whiteboxtesting)关于软件测试(11)2020年5月20日15软件测试技术——黑盒测试(1)黑盒测试的概念若被测程序与特定的功能相联系,我们可以针对功能设计测试,以证实各功能完全可执行,同时在功能中寻找错误把测试对象看做一个黑盒子,完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否正确。黑盒测试又叫做功能测试或数据驱动测试。黑盒测试类似于中医:使用望、闻、问、切黑盒测试的目的是否有错误的或遗漏了的功能?在接口上,输入能否正确地接受?能否输出正确的结果?是否有数据结构错误或外部信息访问错误?是否考虑了软件的出错情况?2020年5月20日16软件测试技术——黑盒测试(2)黑盒测试的一个常用技巧——打桩(Stub)用在隔离测试中,用以消除其他程序对被测程序的影响当被测程序调用其子模块时,可以使用模拟法,此时被测程序并没有真正调用其他模块,而是从桩模块处得到一个所需的值。这种技术叫做打桩。黑盒测试常用方法等价分割边界值分析2020年5月20日17常用黑盒测试方法——等价分割等价分割是一种典型的黑盒测试方法等价分割将输入输出范围分割成多个等价的区域,然后从每个等价区中选取少数有代表性的数据做为测试用例。所谓等价,是指:在同一分割区内程序的行为是等价的等价区之间的依赖性可以忽略输入和输出并非只是程序参数:外部数据时间执行顺序/记录状态软件测试技术——黑盒测试(3)2020年5月20日18常用黑盒测试方法——边界值分析边界值分析也是一种黑盒测试方法,是对等价分割方法的补充经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误使用边界值分析方法设计测试用例,首先应确定边界情况。应当选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据,而不是选取等价类中的典型值或任意值做为测试数据软件测试技术——黑盒测试(4)错误聚集在边界上,缺陷隐藏在角落里!2020年5月20日19软件测试技术——白盒测试(1)什么是白盒测试若被测程序与特定的结构相联系,我们可以针对结构设计测试,以确保内部的“所有齿轮相吻合”,即软件的内部过程是合理的,是遵照规定执行的白盒测试又称玻璃盒测试。把测试对象看作一个透明的盒子,充分利用其逻辑结构和有关信息,设计和选择测试用例。白盒测试又称为结构测试或逻辑驱动测试白盒测试类似于西医看病,通过X光、CT扫描等手段白盒测试主要用于结构测试覆盖测试静态分析也可以算作白盒测试的一种手段2020年5月20日20软件测试技术——白盒测试(2)插装(Instrumentation)插装又称软件探针,由测试工具自动加入,用于反馈软件的执行信息。插装不影被测程序的运行SoftwareProbe语句覆盖判定覆盖条件覆盖判定条件覆盖路径覆盖2020年5月20日21软件测试技术——白盒测试(3)典型的白盒测试——基本路径测试ThomasMcCabe首先提出从程序的结构入手,分析、计算模块的复杂程度——McCabe圈复杂度(=基本路径数)确认模块的一组基本路径,再根据这些基本路径设计测试用例,做到基本路径覆盖。圈复杂度可以通过程序流图得出基本路径测试是结构化测试的理论基础2020年5月20日22代码覆盖流程‘A’流程‘B’哪个函数更复杂?代码覆盖与复杂度不成比例软件测试技术——白盒测试(4)2个测试2个测试基本路径测试的意义如果代码覆盖率=100%各需多少测试?2020年5月20日23分支覆盖需要多少个测试可以做到100%覆盖?分支测试#1分支测试#2分支测试#3分支测试#4软件测试技术——白盒测试(5)基本路径测试的意义2020年5月20日24基本路径覆盖(TRUEandFALSE)(FALSEandTRUE)(TRUEandTRUE)任何其他路径(如FALSEandFALSE)可由基本路径组合得到+-=(FALSEandFALSE)软件测试技术——白盒测试(6)基本路径测试的意义基本路径数等于模块的McCabe圈复杂度v(G)2020年5月20日25回归测试软件更动后重新进行的测试既要测试变更部分,也要测试受影响部分关键在决定哪些测试必须被重复保证测试工作的可重现性尽量利用工具,提供回归测试的自动化水平编程测试发现错误更改回归测试软件测试技术——回归测试2020年5月20日26软件测试技术——静态分析(1)静态分析又称静态测试静态测试是不动态执行程序代码而寻找程序代码中可能存在的错误或评估程序代码质量的过程。静态测试可以由人工进行,充分发挥人的逻辑思维优势。可以借助软件工具自动进行2020年5月20日27软件测试技术——静态分析(2)静态分析的主要方法和内容:代码审查,这是软件质量保证(SQA)的重要内容代码统计分析软件工程度量McCabe复杂度Halstead复杂度...2020年5月20日28嵌入式软件测式的基本方法拿来主义——充分借用PC软件的测试方法静态/动态白盒/黑盒单元测试/集成测试/系统测试……全数字模拟测试交叉测试(Host/Target测试)真实环境验证嵌入式软件测试方法(1)2020年5月20日29嵌入式软件测试方法(2)全数字模拟测试采用数学平台的方法,将嵌入式软件从系统中剥离出来,通过开发CPU指令、常用芯片、I/O、中断、时钟等模拟器在HOST上实现嵌入式软件的测试主要特点与嵌入式硬件平台脱钩操作简单,可以借鉴常规的软件测试方法适用于功能测试有局限性2020年5月20日30嵌入式软件测试方法(3)全数字模拟测试的局限性通用性差,使用不同语言编写的嵌入式软件,需要不同的仿真程序来执行实时性与准确性难以反映出嵌入式软件的真实情况,测试出与时序有关的故障价值不大。维护统一、精确的系统时钟,理顺时序关系相当困难,特别是当并发的事件要求一定的同步关系时。开发成本高。设计出一个能进行系统测试的的环境代价太大只能作为嵌入式软件测试的辅助手段2020年5月20日31嵌入式软件测试方法(4)交叉测试(Host/Target测试)与目标环境无关的部分在PC机上完成充分利用高级语言的可移植性借鉴常规的软件测试方法与模拟测试不同与硬件密切相关的部分在Target上完成需要调试环境支持测试工具需要支持目标环境最后在目标环境中确认主机平台嵌入式系统调试环境2020年5月20日32嵌入式软件测试方法(5)交叉测试的特点将大部分工作转移到PC平台上,在硬件环境未建好或调试工具缺乏时就可以开展可以充分地“拿来主义”适用于高级语言,如C,C++操作方便,测试成本较低。实时性受调试环境的制约目标环境中测试时要占用一定的目标资源注意目标环境和主机环境的差异: