软件测试与质量保证概述.ppt
单元测试,马永征,Outline,软件测试概述单元测试单元测试工具Junit(Eclipse),软件测试概述,内容,软件测试定义、目的和作用衡量标准软件测试要素测试技术测试过程,软件测试,概况定义:为了发现程序的错误而执行程序的过程软件测试是SQA的重要手段,属于软件工程领域目前状况软件测试的实践性大于理论性软件测试理论体系尚不成熟软件测试工具尚不成熟软件测试效果对于个人的依赖性比较大,软件测试,目的为了寻找错误,并尽可能地为修正错误提供更多的信息为了证明软件有错误,而不证明软件没有错误作用发现并管理缺陷度量质量评价工作效率和效果预期项目风险,内容,软件测试定义、目的和作用衡量标准软件测试要素测试技术测试过程,软件测试,衡量标准多能够找到尽可能多的、以至于所有的BUG快能够尽可能早地发现最严重的BUG好找到的BUG是关键的、用户最关心的找到BUG后能够重现找到的BUG,并为修正BUG提供尽可能多的信息省能够用最少的时间、人力和资源发现BUG测试的过程和数据可以重用,内容,软件测试定义、目的和作用衡量标准软件测试要素测试技术测试过程,测试技术,不实际运行程序,而是通过检查和阅读等手段来发现错误并评估代码质量的软件测试技术。也称为静态分析技术。,实际运行程序,并通过观察程序运行的实际结果来发现错误的软件测试技术。,在不知道程序内部结构,只知道程序规格的情况下采用的测试技术或策略。,在知道程序内部结构的情况下采用的测试技术或策略。,开发组内部进行的,采用讲解、讨论和模拟运行的方式进行的查找错误的活动。,开发组内部进行的,采用讲解、提问并使用Checklist方式进行的查找错误的活动。一般有正式的计划、流程和结果报告。,开发组、测试组和相关人员(QA、产品经理等)联合进行的,采用讲解、提问并使用Checklist方式进行的查找错误的活动。一般有正式的计划、流程和结果报告。,针对要求的程序功能,按照规范的流程进行的测试。,针对要求的程序功能以外的其他要求,包括性能、安全、配置、负载等指标,按照规范的流程进行的测试。,针对要求的程序功能、性能、安全、配置、负载等指标,基于破坏目的、按照经验进行的随机测试。,程序修改或者版本更新以后,为了确保以前正确的功能和其他指标仍旧正确,而重新进行的测试。,在测试过程中,选择足够的测试用例,使得每一个可执行语句至少被执行一次。,在测试过程中,选择足够的测试用例,使得程序中的每一个分支判断的每一种可能结果都至少被执行一次。,在测试过程中,选择足够的测试用例,使得程序中的每一条可能执行的路径都至少执行一次。,内容,软件测试定义、目的和作用衡量标准软件测试要素测试技术测试过程,测试过程,规格定义,设计,编码,系统测试,集成测试,单元测试,用户需求,验收测试,回归测试,配置管理,缺陷跟踪,测试过程,单元测试:Unit Testing目标:检验程序最小单元有无错误接口、数据结构、边界、覆盖、逻辑检验单元编码与设计是否吻合时机:编码完成后,首先要实施的测试方法:静态测试白盒测试责任:开发工程师,测试过程,集成测试:Integration Testing目标:检验组成系统的模块接口有无错误代码实现的系统设计与需求定义是否吻合时机:主要的单元测试完成后,经常与单元测试同步进行方法:黑盒测试责任:开发工程师测试工程师,测试过程,系统测试:System Testing目标:检验组成整个系统的代码、以及系统的软硬件配合有无错误代码实现的系统与用户需求是否吻合检验系统的文档等各种是否完整、有效模拟验收测试的要求,检查系统是否符合用户的验收标准时机:多数集成测试完成后方法:黑盒测试责任:测试工程师,测试过程,系统测试:System Testing稳定期测试目标:度量是否可以结束测试时机:传统的系统测试完成后方法:黑盒测试责任:测试工程师,测试过程,验收测试:Acceptance Testing目标:使客户验收签字系统是否符合事先约定的验收标准时机:系统测试完成后,在项目组看来开发和测试工作已经全部完成,可以交付使用方法:黑盒测试责任:产品经理或其他高级经理开发工程师测试工程师用户,测试过程,回归测试:Regression Testing目标:验证程序修改或者版本更新以后,以前正确的功能和其他指标仍旧正确。时机:每次错误修改之后,或者版本更新之后方法:白盒测试/黑盒测试责任:开发工程师测试工程师,测试过程,缺陷跟踪:Defect Tracing目标:确保所有发现的错误被正确记录、分发、评估、关闭、统计时机:从错误发现开始到错误关闭为止,每次错误状态修改之后方法:缺陷跟踪系统责任:开发工程师测试工程师测试经理用户,单元测试,内容,单元测试目标任务单元测试技术静态分析测试设计单元测试流程管理流程测试文档,单元测试,概况定义:检验程序最小单位有无错误。一般在编码之后,由开发人员完成。单元:软件开发中的最小的独立部分C语言中的单元:函数或者是子过程C+语言中的单元:类目前状况:实施效果非常好,但是实施阻力比较大(主要是人员和管理因素),一般只在关键的程序单元中实施有比较系统的理论和方法,但也依赖于系统的特殊性和开发人员的经验有大量的辅助工具,开发人员也经常自己开发测试代码和测试工具主要使用白盒测试和静态分析,也使用黑盒测试,单元测试,目标1、检查代码实现是否符合设计不能检查设计是否正确2、尽早发现错误Microsoft applications10-20 defects/KLOC during unit testing0.5 defects/KLOC after release性价比最好,内容,单元测试目标任务单元测试技术静态分析测试设计单元测试流程管理流程测试文档,单元测试,任务1、模块接口测试检查进出模块的数据是否正确Checklist:模块的实际输入与定义的输入是否一致个数、类型、顺序模块中对于非内部/局部变量是否合理使用使用其他模块时,是否检查可用性和处理结果使用外部资源时,是否检查可用性并及时释放资源内存、文件、硬盘、端口等其他,单元测试,任务2、模块局部数据结构测试检查局部数据结构能否保持完整性Checklist:变量从来没有被使用可能别的地方使用了错误的变量名变量没有初始化错误的类型转换数组越界非法指针变量或函数名称拼写错误使用了外部变量或函数其他,单元测试,任务3、模块边界条件测试检查临界数据是否正确处理Checklist:普通合法数据是否正确处理普通非法数据是否正确处理边界内最接近边界的(合法)数据是否正确处理边界外最接近边界的(非法)数据是否正确处理其他,单元测试,任务4、模块独立执行通路(路径)测试检查由于计算错误、判定错误、控制流错误导致的程序错误Checklist:死代码错误的计算优先级精度错误比较运算错误赋值错误表达式的不正确符号、=;=、=、!=循环变量的使用错误错误赋值其他,单元测试,任务5、模块内部错误处理测试检查内部错误处理设施是否有效Checklist:是否检查错误出现资源使用前后其他模块使用前后出现错误,是否进行错误处理抛出错误通知用户进行记录错误处理是否有效在系统干预前处理报告和记录的错误真实详细其他,内容,单元测试目标任务单元测试技术静态分析测试设计单元测试流程管理流程测试文档,单元测试技术,静态分析定义:不实际运行程序,而是通过检查和阅读等手段来发现错误并评估代码质量的软件测试技术。也称为静态测试技术。方法:走查:WalkThrough审查:Inspection评审:Review,Michael Fagan IBM(1976),单元测试技术,静态分析-走查定义:开发组内部进行的,采用讲解、讨论和模拟运行的方式进行的查找错误的活动。经验:限时避免跑题参加人员经验丰富的开发人员和本模块相关的开发人员本项目组的新人由本模块的开发者进行讲解、回答问题并记录不要现场修改检查要点逻辑错误代码标准/规范/风格,单元测试技术,静态分析-审查定义:开发组内部进行的,采用讲解、提问并使用Checklist方式进行的查找错误的活动。一般有正式的计划、流程和结果报告。经验:以会议的形式,制定会议目标、流程和规则,结束后要编写报告参加人员经验丰富的开发人员和本模块相关的开发人员本项目组的新人由另外一名开发者进行讲解、其他开发者主要按照Checklist进行提问并填表、本模块开发者回答问题并记录不要现场修改检查要点设计需求代码标准/规范/风格,单元测试技术,静态分析-评审定义:开发组、测试组和相关人员(QA、产品经理等)联合进行的,采用讲解、提问并使用Checklist方式进行的查找错误的活动。一般有正式的计划、流程和结果报告。经验:以会议的形式,制定会议目标、流程和规则,结束后要编写报告。相关资料要在会议前下发并阅读。参加人员经验丰富的开发人员和本模块相关的开发人员测试组和相关人员由另外一名开发者进行讲解、其他开发者主要按照Checklist进行提问并填表、本模块开发者回答问题并记录不要现场修改检查要点设计需求代码标准/规范/风格文档的完整性和一致性,内容,单元测试目标任务单元测试技术静态分析测试设计单元测试流程管理流程测试文档,单元测试技术,测试设计定义:依据模块的内部结构,设计测试用例的过程。主要采用白盒测试技术,关注逻辑覆盖原则:1、保证没有死代码保证一个模块中的每个独立路径都可能被使用到2、保证对所有的逻辑值都测试true和false3、在上下边界和合法的范围内运行所有的循环4、确保内部数据结构的有效性和完整性,单元测试技术,测试设计逻辑覆盖测试方法:1、语句覆盖选择足够的测试用例,使得程序中每一条可执行语句至少被执行一次。2、判定覆盖选择足够的测试用例,使得程序中每一个分支判断的每一种可能结果(主要指switch-case情况)都至少被执行一次。判定覆盖也叫分支覆盖。3、条件覆盖选择足够的测试用例,使得程序中每一个分支判断中的每一个条件的可能结果都至少被执行一次。,单元测试技术,测试设计逻辑覆盖测试方法:1、语句覆盖2、判定覆盖3、条件覆盖4、判定/条件覆盖选择足够的测试用例,使得同时满足判定覆盖和条件覆盖。5、条件组合覆盖选择足够的测试用例,使得程序中每一个分支判断中的每一个条件的每一种可能组合结果都至少被执行一次。6、路径覆盖选择足够的测试用例,使得程序中所有的可能路径都至少被执行一次。,单元测试技术,测试设计逻辑覆盖测试方法:,内容,单元测试目标任务单元测试技术静态分析测试设计单元测试流程管理流程测试文档,单元测试流程,管理流程主要指动态测试应用流程,针对测试目标,规定测试任务、资源分配、人员角色、进度安排等。,根据测试计划,设计测试用例,包括:测试步骤、测试场景、测试代码、测试数据(包括预期结果)。,根据测试计划,配置测试环境,并手动或者自动执行测试设计。,根据测试计划,忠实地记录测试执行的过程和结果。,分析测试记录,如果发现与预期结果不同,确定并重现缺陷。,检查测试设计是否全部执行完毕,缺陷是否全部关闭。,记录、分发、评估、关闭缺陷报告。,分析测试过程和缺陷报告,评估测试质量和测试效果,给出是否通过测试的建议。,内容,单元测试目标任务单元测试技术静态分析测试设计单元测试流程管理流程测试文档,单元测试流程,测试文档主要指动态测试应用文档,测试计划文档,测试用例文档,测试记录文档,缺陷跟踪报告,测试总结报告,单元测试文档,测试计划编号如:ut-tp0016标题如:文字排版功能.字间距.MarchCalculator版本号如:V1.0执行状态如:未执行修改记录如:2003年7月1日;某某编制/修改;原因测试目标如:语句覆盖测试人员如:某某1负责执行测试用例xxx;某某2负责执行测试用例xxx测试用例编号(多个)如:ut-tc00021/ut-tc00031/ut-tc00035被测试单元代码位置如:$tag1/layout/marchCal.cpp,单元测试文档,测试用例编号如:ut-tc00016标题如:测试“文字排版功能.字间距.MarchCalculator”版本号如:V1.3执行状态如:已经执行修改记录如:2003年7月2日;某某编制/修改;原因测试步骤如:配置运行环境;输入测试数据;执行X功能/测试代码;观察/记录XX测试场景如:在联网的环境下测试代码如:ut-tcc00021(位置)/ut-tcc00035(位置)测试数据如:输入数据(输入文件、文字描述);预期结果(性能、图片、文字描述),单元测试文档,测试记录编号如:ut-tr00016标题如:记录测试“文字排版功能.字间距.MarchCalculator”结果填写记录如:2003年7月2日;某某填写;原因测试用例编号如:ut-tc0016输出结果如:图片、文字描述测试观察符合/不符合期望结果,单元测试文档,缺陷跟踪报告编号如:ut-dt00016标题如:文字排版功能.字间距.MarchCalculator计算错误版本号如:V1.3执行状态如:空白/草稿/提交/审批/分发/正在修改/修改完毕/正在确认/关闭修改记录如:2003年7月2日;某某编制/修改;原因测试环境和版本号码、程序编写人员错误严重程度和优先级别错误详细描述重现步骤和方式、对应的测试记录编码附件建议修改方式修改内容、结果及修改人员签字/日期确认内容、结果及确认人员签字/日期,单元测试文档,测试总结报告编号如:ut-tr00016标题如:文字排版功能.字间距.MarchCalculator单元测试总结报告版本号如:V1.5执行状态如:已经提交修改记录如:2003年7月3日;某某编制/修改;原因测试计划编号计划执行情况缺陷统计(缺陷总数/未解决数目)及为解决缺陷列表后续处理措施是否通过单元测试,单元测试工具Junit,What is JUnit,De facto Java unit testing frameworkIntegrated nicely with IDEs and AntEasy to learnSupport many IDEsJBuilder,VisualAge,Eclipse,实例,public class Car public int getWheels()return 4;,实例(cont.),public class TestCar public static void main(String args)Car car=new Car();if(4=car.getWheels()System.out.println(Ok!);elseSystem.out.println(Error!);,import;public class CarTest extends TestCase protected Car car;protected int expectedWheels;public static void main(String args)junit.swingui.TestRunner.run(CarTest.class);public CarTest(String arg0)super(arg0);,实例(cont.),protected void setUp()throws Exception car=new Car();expectedWheels=4;protected void tearDown()throws Exception super.tearDown();public void testGetWheels()assertEquals(expectedWheels,car.getWheels();,JUnit Rules and Conventions,Subclass TestCasePrior to v3.8,String-arg constructor requiredTest methodspublic void testXXX()throws Any number of assertions per methodImplement main to run from command-line,but not necessaryOptionally add setUp/tearDown methods.,TestCase lifecycle,setUptestXXX()tearDown()Repeats 1 through 3 for each testXXX method,Assert系列方法,assertEquals(primExpected,primActual)assertEquals(objExpected,objActual)assertSame(objExpected,objActual)assertNotSame(objExpected,objActual)assertNull(obj)assertNotNull(obj)assertTrue(boolean condition)assertFalse(boolean condition)e.g.assertEquals(0,epoch.getTime();,TestSuite,import junit.framework.*;public class AllTests public static void main(String args)(suite();public static Test suite()TestSuite suite=new TestSuite(All JUnit Tests);suite.addTest(VectorTest.suite();suite.addTest(new);return suite;,谢谢!,