软件测试流程软件测试流程软件测试流程1软件测试的复杂性与经济性分析2软件测试的流程3单元测试4集成测试5确认测试6系统测试7验收测试1软件测试的复杂性与经济性分析软件测试流程人们在对软件工程开发的常规认识中,认为开发程序是一个复杂而困难的过程,需要花费大量的人力、物力和时间,而测试一个程序则比较容易,不需要花费太多的精力。这其实是人们对软件工程开发过程理解上的一个误区。在实际的软件开发过程中,作为现代软件开发工业一个非常重要的组成部分,软件测试正扮演着越来越重要的角色。随着软件规模的不断扩大,如何在有限的条件下对被开发软件进行有效的测试正成为软件工程中一个非常关键的课题。1.1软件测试的复杂性软件测试流程设计测试用例是一项细致并且需要具备高度技巧的工作,稍有不慎就会顾此失彼,发生不应有的疏漏。下面分析了容易出现问题的根源。(1)完全测试是不现实的在实际的软件测试工作中,不论采用什么方法,由于软件测试情况数量极其巨大,都不可能进行完全彻底的测试。所谓彻底测试,就是让被测程序在一切可能的输入情况下全部执行一遍。通常也称这种测试为“穷举测试”。穷举测试会引起以下几种问题:•输入量太大;•输出结果太多;•软件执行路径太多;•说明书存在主观性。1.1软件测试的复杂性软件测试流程E.W.Dijkstra的一句名言对测试的不彻底性作了很好的注解:“程序测试只能证明错误的存在,但不能证明错误的不存在”。由于穷举测试工作量太大,实践上行不通,这就注定了一切实际测试都是不彻底的,也就不能够保证被测试程序在理论上不存在遗留的错误。1.1软件测试的复杂性软件测试流程(2)软件测试是有风险的穷举测试的不可行性使得大多数软件在进行测试的时候只能采取非穷举测试,这又意味着一种冒险。比如在使用MicrosoftOffice工具中的Word时,可以作这样的一个测试:①新建一个Word文档;②在文档中输入汉字“胡”;③设置其字体属性为“隶书”,字号为初号,效果为“空心”;④将页面的显示比例设为“500%”。这时在“胡”字的内部会出现“胡万进印”四个字。类似问题在实际测试中如果不使用穷举测试是很难发现的,而如果在软件投入市场时才发现则修复代价就会非常高。这就会产生一个矛盾:软件测试员不能做到完全的测试,不完全测试又不能证明软件的百分之百的可靠。那么如何在这两者的矛盾中找到一个相对的平衡点呢?1.1软件测试的复杂性软件测试流程如图1所示的最优测试量示意图可以观察到,当软件缺陷降低到某一数值后,随着测试从量的不断上升软件缺陷并没有明显地下降。这是软件测试工作中需要注意的重要问题。如何把测试数据量巨大的软件测试减少到可以控制的范围,如何针对风险做出最明智的选择是软件测试人员必须能够把握的关键问题。图1的最优测试量示意图说明了发现软件缺陷数量和测试量之间的关系,随着测试量的增加,测试成本将呈几何数级上升,而软件缺陷降低到某一数值之后将没有明显的变化,最优测量值就是这两条曲线的交点。1.1软件测试的复杂性软件测试流程图1最优测试量示意图1.2软件测试的经济性软件测试流程软件测试的经济性有两方面体现:一是体现在测试工作在整个项目开发过程中的重要地位;二是体现在应该按照什么样的原则进行测试,以实现测试成本与测试效果的统一。软件工程的总目标是充分利用有限的人力和物力资源,高效率、高质量地完成测试。1.3软件测试的误区软件测试流程随着软件产业工业化、模块化地发展,在软件开发组中软件测试人员的重要性也不断地突出。在国外,很多著名企业早已对软件测试工作十分重视。比如著名的微软公司,其软件测试人员与开发人员的比例已经达到2:1。可见软件测试对于一个软件开发项目的成功与否具有十分重要的意义。但是在实际的项目开发与管理中仍然存在很多管理上或者技术上的误区:(1)期望用测试自动化代替大部分人工劳动(2)忽视需求阶段的参与(3)软件测试是技术要求不高的岗位2软件测试的流程软件测试流程1.软件开发的V模型软件测试是有阶段性的,软件开发流程的V模型是一个广为人知的模型,如图2所示。在V模型中,从左到右描述了基本的开发过程和测试行为,为软件的开发人员和测试管理者提供了一个极为简单的框架。V模型的价值在于它非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系。在V模型中各个测试阶段的执行流程是:单元测试是基于代码的测试,最初由开发人员执行,以验证其可执行程序代码的各个部分是否已达到了预期的功能要求;集成测试验证了两个或多个单元之间的集成是否正确,并且有针对性地对详细设计中所定义的各单元之间的接口进行检查;在单元测试和集成测试完成之后,系统测试开始用客户环境模拟系统的运行,以验证系统是否达到了在概要设计中所定义的功能和性能;最后,当技术部门完成了所有测试工作,由业务专家或用户进行验收测试,以确保产品能真正符合用户业务上的需要。图2描绘出了各个测试环节在整个软件测试工作中的相互联系与制约关系。2软件测试的流程软件测试流程图2V模型示意图2软件测试的流程软件测试流程2.软件测试过程软件测试过程按各测试阶段的先后顺序可分为单元测试、集成测试、确认(有效性)测试、系统测试和验收(用户)测试5个阶段,如图3所示。(1)单元测试:测试执行的开始阶段。测试对象是每个单元。测试目的是保证每个模块或组件能正常工作。单元测试主要采用白盒测试方法,检测程序的内部结构。(2)集成测试:也称组装测试。在单元测试基础上,对已测试过的模块进行组装,进行集成测试。测试目的是检验与接口有关的模块之间的问题。集成测试主要采用黑盒测试方法。(3)确认测试:也称有效性测试。在完成集成测试后,验证软件的功能和性能及其他特性是否符合用户要求。测试目的是保证系统能够按照用户预定的要求工作。确认测试通常采用黑盒测试方法。(4)系统测试:在完成确认测试后,为了检验它能否与实际环境(如软硬件平台、数据和人员等)协调工作,还需要进行系统测试。可以说,系统测试之后,软件产品基本满足开发要求。(5)验收测试:测试过程的最后一个阶段。验收测试主要突出用户的作用,同时软件开发人员也应该参与进去。2软件测试的流程软件测试流程图3测试各阶段示意图3单元测试软件测试流程1.单元测试的定义单元测试(UnitTesting)是对软件基本组成单元进行的测试。单元测试的对象是软件设计的最小单位——模块。很多人将单元的概念误解为一个具体函数或一个类的方法,这种理解并不准确。作为一个最小的单元应该有明确的功能定义、性能定义和接口定义,而且可以清晰地与其他单元区分开来。一个菜单、一个显示界面或者能够独立完成的具体功能都可以是一个单元。从某种意义上单元的概念已经扩展为组件(component)。2.单元测试的目标单元测试的主要目标是确保各单元模块被正确地编码。单元测试除了保证测试代码的功能性,还需要保证代码在结构上具有可靠性和健全性,并且能够在所有条件下正确响应。3.单元测试的内容模块接口测试;局部数据结构测试;独立路径测试;错误处理测试;边界条件测试。3单元测试软件测试流程图4单元测试任务如图4所示,这些测试都作用于模块,共同完成单元测试任务。模块接口测试:对通过被测模块的数据流进行测试。为此,对模块接口,包括参数表、调用子模块的参数、全程数据、文件输入/输出操作都必须检查。3单元测试软件测试流程图5单元测试环境4.单元测试的步骤通常单元测试在编码阶段进行。当源程序代码编制完成,经过评审和验证,确认没有语法错误之后,就开始进行单元测试的测试用例设计。如图5所示。3单元测试软件测试流程5.采用单元测试的原因程序员编写代码时,一定会反复调试保证其能够编译通过。如果是编译没有通过的代码,没有任何人会愿意交付给自己的老板。但代码通过编译,只是说明了它的语法正确,程序员却无法保证它的语义也一定正确。没有任何人可以轻易承诺这段代码的行为一定是正确的。单元测试这时会为此做出保证。编写单元测试就是用来验证这段代码的行为是否与软件开发人员期望的一致。有了单元测试,程序员可以自信的交付自己的代码,而没有任何的后顾之忧。通过单元测试,测试人员可以验证开发人员所编写的代码是按照先前设想的方式进行的,输出结果符合预期值,这就实现了单元测试的目的。与后面的测试相比,单元测试创建简单,维护容易,并且可以更方便的进行重复。单元测试的成本效率大约是集成测试的两倍、系统测试的三倍,如图6所示。注:术语域测试是指软件在投入使用后,针对某个领域所作的所有测试活动。3单元测试软件测试流程图6各测试阶段发现缺陷的耗时4集成测试软件测试流程1.集成测试的定义集成测试(IntegrationTesting)是介于单元测试和系统测试之间的过渡阶段,与软件开发计划中的软件详细设计阶段相对应,是单元测试的扩展和延伸。集成测试的定义是根据实际情况对程序模块采用适当的集成测试策略组装起来,对系统的接口以及集成后的功能进行正确校验的测试工作。4集成测试软件测试流程2.集成测试的层次软件的开发过程是一个从需求分析到概要设计、详细设计以及编码实现的逐步细化的过程,那么单元测试到集成测试再到系统测试就是一个逆向求证的过程。集成测试内部对于传统软件和面向对象的应用系统有两种层次的划分。对于传统软件来讲,可以把集成测试划分为三个层次:模块内集成测试;子系统内集成测试;子系统间集成测试。对于面向对象的应用系统来说,可以把集成测试分为两个阶段:类内集成测试;类间集成测试。4集成测试软件测试流程3.集成测试的模式选择什么方式把模块组装起来形成一个可运行的系统,直接影响到模块测试用例的形式、所用测试工具的类型、模块编号的次序和测试的次序、生成测试用例的费用和调试的费用。集成测试模式是软件集成测试中的策略体现,其重要性是明显的,直接关系到软件测试的效率、结果等,一般是根据软件的具体情况来决定采用哪种模式。通常,把模块组装成为系统的测试方式有两种:⑴一次性集成测试方式(No-IncrementalIntegration)一次性集成测试方式也称作非增值式集成测试。先分别测试每个模块,再把所有模块按设计要求放在一起结合成所需要实现的程序。如图7是所示按照一次性集成测试方式的实例4集成测试软件测试流程图7一次性集成测试方式4集成测试软件测试流程⑵增值式集成测试方式把下一个要测试的模块同已经测好的模块结合起来进行测试,测试完毕,再把下一个应该测试的模块结合进来继续进行测试。在组装的过程中边连接边测试,以发现连接过程中产生的问题。通过增值逐步组装成为预先要求的软件系统。增值式集成测试方式有三种:•自顶向下增值测试方式(Top-downIntegration)主控模块作为测试驱动,所有与主控模块直接相连的模块作为桩模块;根据集成的方式(深度或广度),每次用一个模块把从属的桩模块替换成真正的模块;在每个模块被集成时,都必须已经进行了单元测试;进行回归测试以确定集成新模块后没有引入错误。这种组装方式将模块按系统程序结构,沿着控制层次自顶向下进行组装。自顶向下的增值方式在测试过程中较早地验证了主要的控制和判断点。选用按深度方向组装的方式,可以首先实现和验证一个完整的软件功能。如图8所示表示的是按照深度优先方式遍历的自顶向下增值的集成测试实例。4集成测试软件测试流程图8自顶向下增值测试方式4集成测试软件测试流程②自底向上增值测试方式(Bottom-upIntegration)组装从最底层的模块开始,组合成一个构件,用以完成指定的软件子功能。编制驱动程序,协调测试用例的输入与输出;测试集成后的构件;按程序结构向上组装测试后的构件,同时除掉驱动程序。这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中如果需要从子模块得到信息时可以直接运行子模块获得。如图9表示的是按照自底向上增值的集成测试例子。4集成测试软件测试流程图9自底向上增值测试方式4集成测试软件测试流程③混合增值