软件测试面向对象测试技术
- 格式:pptx
- 大小:82.15 KB
- 文档页数:20
面向对象的软件测试作者:王容来源:《电脑知识与技术》2013年第05期摘要:软件的测试时软件开发的重要部分,是保证软件质量提高软件性能的关键。
面向对象的软件测试具有它自己的特点,需要与传统的软件测试相区别,因此面向对象的软件测试则被分成不同的阶段,本文将面向对象软件测试层次划分为六个个层次,主要介绍了面向对象软件测试的以下三个层次:类测试、集成测试和系统测试。
关键词:面向对象;单元测试;集成测试;系统测试中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)05-1200-02面向对象的方法在现在的软件开发的运用中是越来越广泛,但是相应的测试方法并没有做出相应的改变,仍然有很多使用的还是传统软件使用的测试方法,出现这样的结果不是单方面的原因,既有在采用面向对象方法开发软件的时候在设计和分析阶段保留的文档不够全面或者并没有按照面向对象的方法进行保存,造成了在设计测试的时候不能够找到原始文档。
还有可能就是现在并没有有效的方法是针对面向对象方法的。
这样就会使得工作变得更加的复杂,就会增加工作量。
但是测试的结果也可能并不理想,使得最后得到的软件并不能够达到用户的期望。
因此,如何使用面向对象的方法来测试软件是非常必要的。
1 面向对象测试与传统测试技术的异同首先,这两种技术的测试过程是相同的。
都要对整个测试进行计划,设计出测试用例,运行测试用例,根据结果进行测试分析,最后是用户验收。
其次,这两种技术的测试目标也是相同的。
测试的目的都是为了使得设计出来的软件能够达到期望的功能。
再次,测试也是为了用尽可能少的工作量测试出软件尽可能多的错误,虽然在这三个方面这两种技术都是相同的,但是在测试计划和设计测试用例的时候是有很大的区别的,这主要是归结于面向对象软件和传统的软件的设计思路不同。
传统的软件是由各个功能模块组成的,那么在测试计划和设计测试用例的时候就要注意的就是这些功能模块之间的关系。
软件测试(第2版)178多态性是面向对象方法的关键特性之一。
多态的概念是指同一消息可以根据发送消息对象的不同而采用多种不同的行为方式。
多态性有两个方面的含义,一种是将同一个消息发送给同一个对象,但由于消息的参数不同,对象也表现出不同的行为(这种多态性是通过重载来实现的)。
另一种是将同一个消息发送给不同的对象,各对象表现出的行为各不相同(这种多态是通过重写来实现的)。
例如,有类A 、类B 和类C 3个类,类B 继承类A ,类C 又继承类B 。
成员函数a () 分别存在于这3个类中,但在每个类中的具体实现不同。
同时在程序中存在一个函数fn (),该函数在形参中创建了一个类A 的实例st ,并在函数中调用了方法a ()。
程序运行时相当于执行了一个多路分支的switch () 语句,首先判定传递过来的实参的类型(类A 或类B 或类C),然后再确定究竟执行哪一个类中的方法a ()。
利用多态性,在程序设计中可以解决很多兼容性的问题,这也是面向对象程序设计的一个显著优点,而在测试时,就必须为上面的每一个分支生成测试用例。
由此可见,多态性和动态绑定为程序的执行带来了不确定性,并且增加了系统运行中可能的执行路径,加大了测试用例选取的难度和数量。
多态性为软件测试带来的问题目前仍然是研究的重点及难点之一。
面向对象系统与面向过程系统的测试有着许多类似之处,例如,它们都具有相同的目标,即保证软件系统的正确性,不仅保证代码的正确性,也要保证系统能够完成规定的功能;它们也具有相似的过程,例如测试用例的设计、测试用例的运行、实际结果与预期结果的比较等。
虽然传统测试的理论与方法有不少都可用于面向对象的测试中,但毕竟面向对象软件的开发技术和运行方式与传统的软件有着较大的区别。
面向对象开发技术与传统的开发技术相比,新增了多态、继承、封装等特点,这些新特点使得开发出来的程序,具有更好的结构、更规范的编程风格,极大地优化了数据使用的安全性,提高了代码的重用率。
面向对象的软件测试方法及实践面向对象编程是一种重要的编程方法。
在面向对象的软件开发中,测试也是一个至关重要的环节,它可以有效地发现程序的缺陷,并确保程序的正确性和稳定性。
然而,面向对象的软件测试方法与传统的测试方法有着很大的不同。
本文将就面向对象的软件测试方法及实践的相关问题进行探讨。
一、面向对象的软件测试方法在面向对象的软件测试中,测试重点是对象的行为。
这与传统的测试方法不同,传统的测试方法重点是函数和子程序。
因此,在面向对象的软件测试中,测试的粒度更加细致,测试的内容更加全面。
面向对象的软件测试方法通常包括以下几个方面:1. 单元测试单元测试是指对系统中最小的可测试单元进行测试。
在面向对象的软件测试中,单元测试是对对象的方法进行测试。
单元测试是测试的第一步,它可以有效地发现程序的错误,还可以帮助开发人员快速地发现错误并修正它们。
单元测试通常由开发人员进行,他们会编写测试用例并运行单元测试,以确保代码的正确性。
2. 集成测试集成测试是指在完成单元测试后,将各个部分集成起来测试整个系统。
在面向对象的软件测试中,集成测试是测试对象之间的交互行为。
集成测试可以发现不同对象之间的复杂关系,以及在集成过程中可能存在的问题。
集成测试通常由测试人员进行,他们会编写和运行测试用例,以确保整个系统的正确性。
3. 系统测试系统测试是指在完成集成测试后,对整个系统进行测试。
在面向对象的软件测试中,系统测试是对系统的交互行为进行测试。
系统测试可以确保整个系统的正确性、稳定性和性能。
系统测试通常由测试人员进行,他们会编写和运行测试用例,以确保整个系统的正确性。
4. 用户验收测试用户验收测试是指在完成系统测试后,由最终用户对系统进行测试。
在面向对象的软件测试中,用户验收测试是测试系统是否满足用户的需求。
用户验收测试可以发现系统与用户的交互是否流畅,并帮助开发人员修正不足。
用户验收测试由最终用户进行。
二、面向对象的软件测试实践1. 编写测试用例编写测试用例是面向对象的软件测试实践的第一步。
面向对象的类测试技术研究摘要:类是面向对象软件的基本构成单元,类测试是面向对象软件测试的关键。
从基于服务的、基于对象动态测试模型的、基于流图的四个方面论述了类测试的思想和方法。
关键词:面向对象软件测试类类测试1 面向对象软件的类测试类的概念是面向对象程序设计的核心概念。
把数据和对象的操作和处理封装在一个程序模块中的方法,可以说是人们积几十年程序设计实践的经验总结。
把程序以类的形式组织成若干模块,使其获得了最佳的结构特性,类的概念的引入使程序设计技术发生了革命性的转变。
从结构程序设计中以函数作为程序的基本模块转变为面向对象程序设计中,以类作为程序的基本模块,这一变化使程序设计技术出现了质的飞跃。
类的概念抓住了程序的本质。
程序的基本元素是数据,而函数是围绕数据进行的处理和操作。
类的使用使得:程序设计本身更有条理了;程序的可读性好了:程序设计的过程真正像是机器部件的组装;程序由多个程序员设计变得方便和自然;由于程序的零部件化,使得程序的可重用性变成切实可行的事情。
正是由于面向对象软件构件的基础是类,所以类的测试显得尤为重要。
类测试是面向对象软件测试的关键。
面向对象软件的类测试与传统软件的单元测试相对应,但和传统的单元测试不一样。
类测试时不仅要将操作作为类的一部分,同时要把对象与其状态结合起来,进行对象状态行为的测试。
类的测试按顺序分为以下三个部分:(1)基于服务的测试:测试类中的每一个方法;(2)基于状态的测试:考察类的实例在其生命周期各个状态下的情况;(3)基于响应状态的测试:从类和对象的责任出发,以外界向对象发送特定的消息序列的方法来测试对象的各个响应状态。
2 类测试技术(1)基于服务的类测试技术基于服务的类测试主要考察封装在类中的一个方法对数据进行的操作。
它可以采用传统的白盒测试方法,如:控制流测试、数据流测试、循环测试、排错测试、分域测试等。
但由于受面向对象软件测试技术发展水平等方面因素的限制,测试人员在选择测试用例时往往都是根据直觉和经验来进行,给测试带来很大的盲目性;再者由于测试人员的个性及倾向性也使得选择的测试用例仅能测试出其所熟悉的某一方面的错误,许多隐含的其它错误不能被检测出来,这在无形中降低了软件的可靠性。
面向对象技术在软件开发中的应用随着计算机技术的发展和计算机的广泛应用,软件应用越来越广泛,人们对于软件开发的要求也越来越高。
在软件开发中,面向对象技术被广泛应用,成为开发的重要手段之一。
本文将详细介绍面向对象技术在软件开发中的应用。
一、面向对象技术的概念面向对象技术是一种基于对象的程序设计方法,它将系统看作一组对象的集合,每个对象都有自己的状态和行为,通过对对象的状态和行为进行抽象和封装,实现代码的重用和更好的可维护性。
面向对象技术主要包括以下三个特性:封装:在面向对象技术中,每个对象都有自己的数据和方法,并将其封装起来,以避免其他对象直接访问和改变它们的值。
继承:通过继承可以将一个类的属性和方法继承到另一个类中,实现代码的复用,减少代码的冗余。
多态:多态是指同一种方法可以被不同的对象以不同方式调用,通过多态可以提高代码的可扩展性。
二、面向对象技术在软件开发中有以下几个常见的应用:1.面向对象分析(OOA)面向对象分析(OOA)是一种软件开发方法,其主要目的是将问题域转换为面向对象的模型。
通过面向对象分析,可以将需求变成可执行的模型,同时有效的抵制需求波动造成的影响。
在OOA中,首先需要对问题进行分析,确定系统的需求和功能,然后通过细化这些需求和功能,逐步将其转化为面向对象的模型。
最终得到的模型就可以直接映射到程序代码中。
2.面向对象设计(OOD)面向对象设计(OOD)是一种根据面向对象技术的相关规定对编程进行设计的方式。
这种设计方式将业务领域中的复杂性进行分析与设计,将其转化为面向对象的模型。
在面向对象设计中,首先要创建一个类图,根据需求,在类图上添加所需的类,然后建立类之间的关系。
在建立好类图之后,开始设计每个类的成员方法和属性,最终得到模型,可以直接映射到程序代码中。
3.面向对象编程(OOP)面向对象编程(OOP)是一种开发应用程序的编程技术,通过面向对象编程,可以将任务的操作对象看作是一个独立的对象。
面向对象的软件测试技术(转)面向对象的软件测试技术相关知识点-面象对象(=objectoriented)技术1.对象和类l面象对象的编程语言:以对象为中心,以消息为驱动,程序=对象+消息l类就是一种代莱数据类型,就是设计的核心,就是通过抽象数据类型的方法去同时实现的一种数据类型l类是对某一对象的抽象,对象是某一类的实例,两者密切相关2.PCB、承继和多态性(1)封装:把数据和操作结合一体,使程序结构更加紧凑,避免了数据紊乱带来的调试与维护的困难(2)承继:可以从一个类衍生至另一个类,派生类承继了父类和祖先类的数据成员和函数,减少了软件的可扩充性,并为代码器重提供更多了强有力的手段(3)多态性:多种表现形式,可以用‘一个对外接口,多个内在实现方法’表示。
一.面向对象测试模型1.面向对象测试的分类依据面向对象研发模型(面向对象分析、面向对象设计、面向对向编程),分成:(1)面向对象分析的测试(ooatest)、面向对象设计的测试(oodtest):是对分析结果和设计结果的测试,主要对分析设计产生的文本进行的,是软件开发前期的关键性测试(2)面向对象编程的测试(ooptest):对编程风格和程序代码同时实现展开测试,主要的测试内容在oounittest和oointegratetest中彰显(3)面向对象单元测试(oounittest):对程序内部具体单一的功能模块的测试,主要对类成员函数的测试,是oointegratetest的基础(4)面向对象内置测试(oointergratetest):对系统内部的相互服务展开测试,例如成员函数间的相互作用,类间的消息传递。
不仅必须基于oounittest,还要参照ood、oodtest的结果(5)面向对象确认测试(oosystemtest)、面向对象系统测试(oosystemtest):最后阶段的测试,以用户需求为测试标准,借鉴ooa、ooatest的结果二.面向对象软件的测试策略1.面向对象分析的测试(1)面向对象分析是把e-r图和语义网络模型,即信息造型中的概念,与面向对象程序设计语方中的重要概念结合在一起而形成的分析方法。
面向对象的软件测试技术综述随着软件应用范围的不断扩大,软件测试的技术手段也不断进步。
面向对象的软件开发思想逐渐被广泛采用,因此,面向对象的软件测试技术也应运而生。
本文将综述面向对象的软件测试技术。
一、面向对象软件测试的概念面向对象的软件测试是针对采用面向对象开发思想的软件进行的测试。
与传统的结构化软件测试相比,面向对象软件测试更加注重对软件内部各个部分之间的关系的测试,并且更加关注软件的继承、重载、多态等特性的测试。
二、面向对象软件测试的方法1. 黑盒测试方法对于面向对象的软件测试中的黑盒测试方法,测试人员仅考虑输入与输出,而不关心系统内部的具体实现。
黑盒测试方法可以通过参照生成测试用例的过程,来完成对程序的测试覆盖。
2. 白盒测试方法白盒测试方法则针对系统内部的具体实现进行测试。
它主要通过静态和动态两种方式进行测试,其中静态分析主要是通过代码分析或模型检查等方式,而动态分析则通过运行测试用例,观察程序执行流程和变量变化等方式进行测试。
3. 增量式测试方法对于大型的面向对象软件开发,其测试过程可能需要相当长的时间,增量式测试方法就可以有效缩短测试时间。
增量式测试方法是指将整个系统分成几个部分,然后逐渐增加到完整的系统环境。
这不仅能够逐步发现bug,还能够及时修复,并能逐步提高测试用例的质量。
三、面向对象软件测试的技术手段1. 测试驱动开发(TDD)测试驱动开发是一种基于测试驱动的软件开发方法,它强调在实现代码之前,先编写测试程序,以确保所编写的代码能够满足测试需要。
TDD可以提高测试的自动化程度,逐步提高测试用例的品质,并减少未发现的bug出现次数。
2. 自动化测试自动化测试是一种通过编写脚本和使用自动化测试工具来执行测试用例和比较结果的测试方法。
自动化测试可以将部分测试自动化,减轻测试压力,消除人为测试误差,并且提高测试的效率和准确度。
3. 模拟测试人工模拟测试是一种指人员通过编制人工操作流程,在应用程序的界面进行手动测试的方法,而计算机模拟测试是一种通过编写程序模拟系统功能和用户操作的测试方法,在这种测试方法中,测试人员可以对系统进行多次重复测试,大大提高了测试的效率。
面向对象测试技术详解面向对象测试技术是软件测试中的一种重要方法,它基于面向对象的编程思想,通过对软件系统的对象进行测试,来保证系统的质量和可靠性。
本文将详细介绍面向对象测试技术的原理和方法,以及在实际项目中的应用。
一、面向对象测试技术概述面向对象测试技术是一种针对面向对象软件的测试方法,在传统测试技术的基础上进行了扩展和优化。
它以对象为单位进行测试,通过模拟对象的行为和交互,来验证软件系统的功能和性能。
面向对象测试技术主要包括以下几个方面:1. 单元测试:针对软件系统的最小单元进行测试,即类或对象的方法和属性。
通过构造合适的测试用例,来验证单元的正确性和稳定性。
2. 集成测试:将各个单元进行组合和协作,测试它们之间的接口和交互。
目的是检测集成后的系统是否符合预期的功能和性能要求。
3. 系统测试:对整个软件系统进行测试,验证系统在不同环境下的稳定性和可用性。
主要关注系统的功能、性能、兼容性等方面。
4. 验收测试:由用户或客户进行的测试,用来验证软件系统是否满足用户需求和要求。
二、面向对象测试技术的原理面向对象测试技术的原理主要包括以下几个方面:1. 继承和多态:通过继承和多态的特性,可以构造多个对象,并且使用相同的测试用例进行测试。
这样可以提高测试效率和覆盖率,减少测试工作的重复性。
2. 封装和封装测试:封装是面向对象编程的基本原则之一,也适用于测试。
通过封装测试的方式,可以隐藏对象的内部实现细节,只暴露出外部接口和行为。
这样可以保持测试的独立性和可维护性。
3. 测试驱动开发:测试驱动开发是一种先写测试用例,再写代码的开发方式。
它可以帮助开发人员更早地发现和解决问题,提高软件的质量和稳定性。
三、面向对象测试技术的方法面向对象测试技术有多种方法,下面介绍几种常用的方法:1. 白盒测试:白盒测试是一种基于代码分析的测试方法,通过查看代码的内部结构和逻辑,来设计和执行测试用例。
它主要关注程序的覆盖度和执行路径,以发现潜在的错误和缺陷。
面向对象软件的测试用例的设计方法目前,面向对象软件的测试用例的设计方法,还处于研究、发展阶段。
与传统软件测试(测试用例的设计由软件的输入处理输出视图或单个模块的算法细节驱动)不同,面向对象测试关注于设计适当的操作序列以检查类的状态。
12.4.1 测试类的方法前面已经讲过,软件测试从“小型测试”开始,逐步过渡到“大型测试”。
对面向对象的软件来说,小型测试着重测试单个类和类中封装的方法。
测试单个类的方法主要有随机测试、划分测试和基于故障的测试等3种。
1. 随机测试下面通过银行应用系统的例子,简要地说明这种测试方法。
该系统的account(账户)类有下列操作: open(打开),setup(建立),deposit(存款),withdraw(取款),balance(余额),summarize(清单),creditLimit(透支限额)和close(关闭)。
上列每个操作都可以应用于account 类的实例,但是,该系统的性质也对操作的应用施加了一些限制,例如,必须在应用其他操作之前先打开账户,在完成了全部操作之后才能关闭账户。
即使有这些限制,可做的操作也有许多种排列方法。
一个account类实例的最小行为历史包括下列操作:open·setup·deposit·withdraw·close这就是对account类的最小测试序列。
但是,在下面的序列中可能发生许多其他行为:open·setup·deposit·[deposit|withdraw|balance|summarize|creditLimit]n·withdraw·close从上列序列可以随机地产生一系列不同的操作序列,例如:测试用例#r1:open·setup·deposit·deposit·balance·summarize·withdraw·close 测试用例#r2:open·setup·deposit·withdraw·deposit·balance·creditLimit·withdraw·close执行上述这些及另外一些随机产生的测试用例,可以测试类实例的不同生存历史。
面向对象软件测试方法及工具一、面向对象软件测试方法介绍随着面向对象编程的普及,针对面向对象的软件测试方法也得到了广泛的应用和研究。
面向对象软件测试方法充分利用了面向对象程序设计的特点,对软件系统进行有效的测试。
面向对象软件测试方法主要包括单元测试、集成测试、系统测试、验收测试等。
1、单元测试单元测试是对软件系统中最小单元的测试。
最小单元可以是一个类,一个函数或者一个模块等。
单元测试主要是通过代码测试来验证一个单元的正确性。
单元测试的目标是在每次开发的过程中及时发现和解决问题,以提高软件质量和开发效率。
2、集成测试集成测试是将多个模块或子系统组合在一起进行测试,以验证它们之间的交互和一致性。
集成测试可以分为自下而上的集成测试和自上而下的集成测试。
自下而上的集成测试,也称为模块集成测试。
模块集成测试是对系统中单个模块的测试。
当一个模块经过单元测试后,可以将其与其他模块进行联合测试。
在单元测试中发现的问题可能会影响到多个模块,因此需要在联合测试时进行综合分析和解决。
自上而下的集成测试,也称为模块组装测试。
模块组装测试是将上层模块作为测试的重点,在测试过程中逐步加入下层模块进行测试。
在这种测试方法中,需要重点测试上层模块的功能和接口是否正常,以保证整个软件系统的运行。
3、系统测试系统测试是对整个软件系统的测试,包括对系统的功能、性能、安全、稳定性等方面的测试。
系统测试是保证整个软件系统按照设计要求正常运行的重要手段。
4、验收测试验收测试是在软件系统开发完成后对软件系统进行测试,目的是验证软件系统是否满足用户需求。
验收测试主要包括安装测试、兼容性测试、功能测试和性能测试等。
二、面向对象软件测试技术1、黑盒测试黑盒测试是一种基于软件系统功能的测试技术。
黑盒测试不考虑软件的内部结构,只测试软件是否能够按照规格说明正常工作。
黑盒测试可以独立于编写代码的程序员进行,只需要依据需求文档,就能进行有效的测试。
2、白盒测试白盒测试是一种基于软件系统的内部结构的测试技术。
面向对象与面向方法的测试在软件开发中,测试是确保软件质量的重要环节。
面向对象编程(Object-oriented Programming,简称OOP)和面向方法编程(Method-oriented Programming,简称MOP)都是常见的编程范式。
本文将探讨面向对象和面向方法的测试方法和技巧,并分析它们各自的优缺点。
一、面向对象的测试面向对象的测试方法侧重于测试类的行为和属性。
面向对象编程将数据和操作封装在对象中,因此在测试过程中,需要关注对象的状态和方法的正确性。
1. 单元测试在面向对象编程中,单元测试是最常用的测试方法。
单元测试是针对类中的方法进行测试,确保每个方法的功能正确且独立。
测试人员可以通过对每个方法的输入和输出进行验证,来确保对象的行为符合预期。
2. 集成测试面向对象编程中的集成测试主要用于测试不同类之间的交互和协作。
在集成测试中,测试人员会模拟真实场景,测试多个类之间的相互作用是否正确。
这有助于发现不同类之间潜在的问题和依赖关系。
3. 继承和多态测试继承和多态是面向对象编程的重要特性。
测试人员需要验证子类是否正确地继承了父类的属性和方法,并且多态的行为是否符合预期。
二、面向方法的测试面向方法的测试方法更加关注方法的正确性和功能一致性。
在面向方法编程中,方法是最基础的单位,因此测试过程主要围绕方法的行为和输出展开。
1. 测试数据驱动面向方法编程的测试方法中,测试人员可以使用测试数据驱动的方式,通过不同的输入数据来测试方法的各种情况。
这有助于发现方法在不同输入下的问题和潜在错误。
2. 边界值测试在面向方法编程中,边界值测试是一种重要的测试方法。
测试人员会针对方法的参数或返回值的边界情况进行测试,以保证方法在极端情况下的正确性和稳定性。
3. 状态测试面向方法编程中的状态是一个重要的概念。
方法的运行状态可能会影响方法的行为和结果。
测试人员需要针对方法的不同状态进行测试,以保证方法在不同状态下的正确性和可靠性。
面向对象的测试方法随着软件开发的不断进步,面向对象的编程方式已经成为了主流。
在面向对象的开发过程中,测试是保证软件质量的重要环节。
本文将介绍面向对象的测试方法以及其应用。
一、什么是面向对象的测试方法面向对象的测试方法是指在面向对象的软件开发过程中,通过对类、对象和其关系进行测试,以验证软件的正确性、健壮性和性能。
面向对象的测试方法主要关注软件的功能、封装、继承、多态等特性。
二、面向对象的测试方法的特点1. 继承性:面向对象的测试方法可以通过继承关系对代码进行复用,减少测试用例的编写工作量。
2. 多态性:面向对象的测试方法可以通过多态性对不同类的对象进行统一的测试,增加代码的灵活性和可扩展性。
3. 封装性:面向对象的测试方法可以对类的封装性进行测试,保证类的内部状态和行为的正确性。
三、面向对象的测试方法的应用在面向对象的开发过程中,可以采用以下测试方法来进行测试:1. 单元测试:针对单个类或方法进行测试,验证其功能的正确性。
2. 集成测试:将多个类或模块进行组合,测试它们之间的接口和交互是否正常。
3. 系统测试:对整个系统进行测试,验证其满足用户需求和预期功能。
4. 性能测试:测试系统的性能指标,包括响应时间、并发能力等。
5. 回归测试:通过重新执行既有的测试用例,来验证软件的修改是否对原有功能产生了负面影响。
四、面向对象的测试方法的实施步骤面向对象的测试方法的实施步骤如下:1. 确定测试目标和范围,明确要测试的类和对象。
2. 编写测试用例,包括输入数据和期望输出结果。
3. 进行单元测试,验证每个类和方法的功能是否符合预期。
4. 进行集成测试,验证多个类和模块之间的交互是否正常。
5. 进行系统测试,确保整个系统满足用户需求和预期功能。
6. 进行性能测试,测试系统的性能指标是否符合要求。
7. 进行回归测试,验证修改是否对原有功能产生了负面影响。
8. 收集测试结果,分析和整理测试数据,生成测试报告。
五、面向对象的测试方法的优势和不足面向对象的测试方法有以下优势:1. 提高代码的可复用性和可维护性。
一种基于RRT技术的面向对象软件测试方法近年来,越来越多的软件开始采用面向对象(object oriented,OO)的开发技术, OO具有封装、继承、多态3大特性, 这些特性使得面向对象编程(object oriented programming,OOP)具有很多其他编程语言无法企及的优点,例如面向对象技术可以提高软件的可复用性,使得软件开发速度更快且更易于维护.但同时面向对象语言这些独有的特性也给软件测试带来了一定的影响.当前,所有测试面向对象程序的方法中最常使用的是随机测试(random testing,RT).RT从整个输入域中随机挑选测试用例并执行,即所有程序输入被选为测试用例的概率都相同,以便不会跳过任何程序错误.试验证明,虽然RT挑选测试用例的时间花费较低,但是发现程序错误所使用的测试用例数量比较大.基于上述问题,CHEN T. Y.等提出了改进后的RT方法即自适应随机测试(adaptive random testing,ART)方法.与RT方法相比,ART方法在测试面向对象软件时使用的测试用例更少,发现的错误更多,且使用ART挑选的测试用例可以均匀地分布在整个输入域中;现如今有基于不同概念的ART算法被提出,并且这些算法被用到不同的领域之中.基于限制性区域的自适应性随机测试(restricted random testing,RRT)算法是一种常用的ART实现方案.RRT在所有已执行测试用例周围的输入域空间生成1个排斥区域,然后一直重复随机生成测试用例,直到随机生成的测试用例在所有排斥区域之外,则将其选为下一个测试用例.试验证明,RRT算法的有效性优于RT算法,能够减少测试用例的个数].文中将RRT方法应用到面向对象软件测试中,讨论基于RRT的面向对象测试用例的距离度量公式,并提出一种基于RRT的面向对象的测试用例生成算法,同时1个基于RRT的面向对象软件测试原型系统也被设计和实现.1 RRT算法RRT算法是一种基于排斥区域的ART算法,其算法思想如下:首先从整个输入域中随机挑选1个测试用例,当有n(n≥1)个已执行测试用例时,RRT会围绕每个已执行测试用例定义1个排斥区域.所有的排除区域的值为R·d/n,其中d为输入域的大小;R为目标排除比率,由测试人员设置.然后在输入域中继续随机生成候选测试用例,直到这个候选测试用例在排斥区域之外,才将其作为下一个测试用例.以图1为例说明输入域为一维的情况,输入域为(0,1);设置R的值为0.75,t1是随机生成的,第2个测试用例只能从排斥区域(t1-0.375*d/1,t1+0.375*d/1)之外选取(图1a),同样地,第3个测试用例也只能在排斥区域(t2-0.375*d/2,t2+0.375*d/2),(t1-0.375*d/2,t1+0.375*d/2)外选取(图1b).图1 一维情况下的RRT算法实例RRT算法的具体步骤如下:double oneTest=rand.NextDouble() /*随机生成oneTest并执行*/while(没有达到程序终止条件)add oneTest to excutedsbool flag=true /*flag是1个标志位,用来表示测试用例是否在排除区域之外*/while (flag){flag=false;oneTest=rand.NextDouble()/*随机生成1个候选测试用例oneTest*/ for (int i=0; i<excuteds.Count; i++)/*判断测试用例是否在排除区域之外*/if(oneTest不在排除区域)flag=true;break;end ifend forend whileend while模拟和实证研究表明,RRT在检测软件故障方面比RT更有效,其故障检测有效性变得更高.2 OOS测试用例度量方法2.1 距离表现形式参考文献[19]的方法,采用a+b i的形式来表示测试用例之间的距离,其中i表示1个虚数单位,a,b分别表示主距离和辅助距离.2.2 距离的运算假设2个距离分别为p=a+b i和q=m+n i,其中a,m表示主距离,b,n表示辅助距离.则p,q的四则运算就是相应主距离和副距离的四则运算.判断2个距离间的关系时需要对主距离和辅助距离进行分别判断,对于2个距离p,q,只有当a=m且b=n时才有p=q;当a>m时或者a=m且b>n时才使得p>q;同样当a<m时或者a=m且b<n时才有p<q.2.3 测试用例距离度量将RRT算法应用到面向对象中,最重要的就是定义测试用例之间的距离计算公式.本节在大量文献基础上,综合分析了各种参考资料[20-22],给出了试验中所使用的测试用例间距离的度量公式.在测试面向对象的程序时,测试用例即为对象,则测试用例由属性和方法组成,其中属性为静态部分,方法为动态部分,其结构图如图2所示.由图2可知,测试用例的距离由静态部分和动态部分组成.静态部分包括自定义属性、继承属性以及嵌套属性.为了方便直接将继承属性合并到自定义属性.动态部分包括自定义方法和继承方法.为了方便计算也将继承方法直接合并到自定义方法中.可以用p,q来表示2个测试用例,利用p.s和q.s表示测试用例的自定义属性,利用p.s.d和q.s.d表示2个测试用例的元素,利用p.s.d.type和q.s.d.type表示测试用例的类型;利用p.s.e和q.s.e表示2个测试用的嵌套属性;利用p.b和q.b表示2个测试用例的动态部分.图2 测试用例结构图所以2个测试用例之间的距离可以表示为静态距离加动态距离:ObjectDistance(p,q)=StaticDistance(p.s,q.s)+BehaviorDistance(p.b,q.b),(1)其中静态距离可以表示为自定义属性距离加嵌套属性距离:StaticDistance(p.s,q.s)=defineDistance(p.s,q.s)+embedDistance(p.s,q.s),(2)其中自定义属性距离可表示为元素距离加类型距离:DefineDistance(p.s,q.s)=elementaryDistance(p.s.d,q.s.d)+typeDistance(p.s.d.type,q.s.d.type).(3) 其中元素距离可以表示为elementaryDistance(p.s.d,q.s.d)=(4) 式中distance函数是计算2个属性数值差的绝对值并除以该属性的范围. 类型距离可以表示为typeDistance=|size(p.s.d.type)-size(q.s.d.type)|+|size(p.s.d.type)∪size(q.s.d.type)|-|size(p.s.d.type)∩size(q.s.d.type)|.(5) 静态距离中还有一部分是嵌套属性距离,嵌套属性距离由对象集合距离组成:embedDistance(p.s.e,q.s.e)=objectSetDistance(p.s.e,q.s.e)*a,(6) 式中a为衰变系数.对象集合的距离公式如下:(7)式中:OBJ[i]为第i个对象;m为2个对象集合数量的最大值,即m=max{size(p.OBJ),size(q.OBJ)};Arr为[1,2,3…m]的所有全排列的集合,共有m!种情况,Arr[i]表示所有全排列情况中的第i种情况,Arr[i][j]表示第i种全排列情况下,第j个元素的值.动态距离计算公式为behaviorDistance(p,q)=|size(p.b.m)-size(q.b.m)|+1-size(p.b.m∩q.b.m)/[size(p.b.m∪q.b.m].(8)首先计算2个对象的自定义属性集合中成员变量数量上的差异,在这里取绝对值,然后计算2个对象的自定义属性集合中成员变量的并集与成员变量交集之差,在这里也取绝对值,最后将这两部分加起来就得到了这2个对象的类型距离.3 RRT中面向对象测试用例生成3.1 RRT算法测试流程基于RRT算法的面向对象测试先根据输入的类图的信息利用类的构造函数创建对象,然后为对象的各个参数赋值,使用RRT算法挑选测试用例并执行之后对测试结果进行记录和分析.测试流程图如图3所示.图3 测试流程图基于RRT算法的面向对象测试的具体测试流程如下:1) 获取类图信息并保存.文中试验均使用基于RRT算法的原型系统完成,此原型系统中包括类图输入模块,进行程序测试之前首先在类图输入模块设置所需信息(主要包括当前类是否为基类或其所继承的类的信息,以及当前类的基本成员信息),然后将填写完整的类图信息保存到文件,每次试验只需读取文件中的信息即可.2) 随机生成第1个测试用例.主要是根据输入类的信息来随机生成第1个测试用例,根据类图信息文件创建对象,创建对象时不仅需要当前类名,还需要随机产生对象的参数,参数类型为各个基本数据类型,系统中的随机数生成算法负责对象参数的生成,算法根据对象调用时传入的参数类型和取值范围来随机生成成员变量的值.3) 执行第1个测试用例.将第1个随机生成的测试用例用于测试面向对象程序,如果达到程序结束条件则退出并记录最终结果;若没有满足结束条件则在记录试验结果后继续执行下一步.4) 使用RRT算法挑选下一个测试用例.使用RRT挑选可使用的测试用例时,第1个测试用例为随机生成,执行完该测试用例之后若没有达到程序结束条件,则在该测试用例周围生成可选区域和排除区域;挑选下一个测试用例时,RRT每次都先调用测试用例生成算法随机生成1个测试用例,然后判断其是否在排斥区域内,若在则丢弃,反之则选为下一个测试用例并执行;在满足程序结束条件之前将反复执行上述步骤.5) 执行下一个测试用例.将RRT算法挑选出的测试用例用于测试函数,并分别记录每一次的试验结果,同测试数值型试验一样,这里的试验依然使用F-measure(发现第1个程序错误时所使用测试用例的数量)和E-measure(预期导致程序出错测试用例的总数)2种评价方法对算法进行评估.6) 收集结果.主要任务就是收集每一次的试验结果,即RRT算法的执行结果.为了验证算法的准确性文中进行了大量的试验,本步骤把所有试验收集结果之后还需要对其进行统计,最后把统计后数据保存.7) 分析结果.对上一步骤中保存的试验结果数据进行分析,主要是对比分析RRT和RT算法的各项试验数据,即F-measure,Fm-time和E-measure,Em-time的试验结果;然后根据试验数据比较2种算法的有效性,最后将分析结果以图表或文件的形式保存.3.2 RRT算法在面向对象中的应用面向对象的试验中,文中实现了RRT在测试同1个类中的应用.在测试面向对象程序时,测试用例的生成需要依赖当前待测类的类图信息.所以在使用RRT 算法测试面向对象型程序时,需要先输入待测类的具体信息.在试验所用到的原型系统中有1个类图信息录入模块,在该模块中完成类的创建,然后根据类图信息使用类的构造函数创建对象,并调用随机数生成算法为对象中的各个成员赋值.随机数生成算法用来随机生成对象所需的参数,主要包括基本数据类型的随机数生成,根据所传参数的数据类型来调用相应的随机数生成器,然后在指定的范围内随机生成参数的值并返回.试验中用到的基本数据类型有int,float,double,bool,string以及char类型,其中int,float,double类型的取值范围为(0,100);string类型长度的取值范围为(0,10);char类型的取值范围是Unicode最大值与最小值之差.除了测试用例的生成之外,在测试面向对象程序时还需要考虑测试用例之间的距离计算,根据公式(1)-(8)来度量测试用例之间的距离;文中面向对象的试验完成了同一个类的测试,所以在测试待测类时,测试用例的方法和属性类型均相同,只有引用对象和基本数据类型的值不同,即在计算任意2个测试用例间的距离时,只需要考虑辅助距离的差异.上文中给出了各基本数据类型的取值范围,试验中所用到的输入域A的起始点为0,终点即为各取值范围的最大值相加;排除区域为(A ×R)/n,则排除半径为(A×R)/(2×n),其中n为已执行测试用例的个数;R为排除比率,试验中R取值为0.75.RRT算法在测试面向对象程序时的基本思想同数值型的试验基本相同,第1个测试用例t1在输入域中随机生成,执行测试用例t1后若没有满足程序结束条件则会在t i周围生成1个排除区域(t i-(R×A)/(2×n),t i+(R×A)/(2×n));继续在输入域中随机生成下一个测试用例,然后调用测试用例距离度量算法TDC(testcase distance calculate)计算2个测试用例间的距离,并判断此距离的大小,若距离大于排除区域半径则将其挑选为下一个测试用例,反之则丢弃;接着执行该选中的测试用例,同样地如果没有达到程序终止条件则继续按照之前的步骤挑选下一个测试用例.TDC算法的具体步骤如下:设置TestCase1,TestCase2,dist/* dist表示2个测试用例间的距离*/if(TestCase1==TestCase2)dist=0;end ifelsedist=static distance(TestCase1,TestCase2)+behavior distance(TestCase1,TestCase2)end else/*下面计算static distance,staticdistance=elementary distance+embed distance*/if(2个测试用例的静态部分都为空)static distance=0end ifelse if(有1个静态部分为空)static distance=1end ifelsestatic distance=elementary distance+embed distance end elsefloat allTypeDist,oneTypeDistforeach(每一种类型)for(int i=0;i<TestCount.count;i++)/*为计算元素类型距离的方法,下文会给出*/ oneTypeDist+=distance(TestCase1[i].value,TestCase2[i].value,type)end forallTypeDist+=oneTypeDistend foreach为实现TDC算法,则需要计算distance,具体实现算法如下:/*下面描述distance方法*/switch(type)case “int”:∥float,double,char,string省略f1=float.Parse(value1.value);f2=float.Parse(value2.value);range=Math.Max(value1.typeRange.max, value2.typeRange.max)-Math.Min(value1.typeRange.min, va-lue2.typeRange.min);return (float)(Math.Abs(f1-f2)/range);case “bool”:if(values1.value==values2.value)return 0;end ifelsereturn 1;end elseend switch/*下面计算embedded distance*/embedded distance=objectSet distance/2;/*下面计算objectSet distance*/if((object1==null)&&(object2==null))/*2个引用均为空*/objectSet distance=0end ifif((object1==null)||(object2==null))/*有1个引用为空*/objectSet distance=2;end ifelse if(互相引用)objectSet distance=2*distend ifelseobjectSet distance=objectSetdistance(object1,object2)/*递归计算*/end else综上,TDC算法就是前面所说的距离度量公式的实现,其中静态包括自定义属性距离的计算和嵌套属性距离的计算.自定义属性计算部分又包括元素距离和类型距离:元素距离与测试用例的属性个数有关,而类型距离与属性类型有关.嵌套属性的距离计算和嵌套的层数有关.4 试验系统设计4.1 试验系统测试流程测试面向对象软件时的主要流程如下: ①首先在类图信息录入模块输入待测类的详细信息; ②将待测类的相关信息保存配置到XML文件中,以便每次试验时读取该类的配置参数; ③生成测试用例并执行;根据待测类的配置参数创建对象实例,然后为对象的基本类型成员赋值; ④记录测试用例执行的试验结果;⑤分别使用RRT和RT算法挑选测试用例; ⑥分别将2种算法挑选出的测试用例用于测试程序; ⑦记录试验结果,获得2种算法的F-measure,Fm-time值以及E-measure,Em-time值; ⑧对比分析试验结果并总结.4.2 系统模块分析在测试面向对象软件中,执行算法之前需要输入详细的类图信息,在类图信息录入模块进行各个所需信息的录入,并把录入的类图信息保存到文件中以便试验时读取.同数值型测试一样,该模块也为每个算法设计了独立的页面,执行算法时只需进入相应的页面将所需的参数配置文件载入,然后即可开始执行算法,最后将结果文件保存到相应的路径,图4给出了RRT系统快照.非数值型模块主要包括类图信息录入、算法执行、测试用例距离计算和结果统计分析模块,下文具体介绍这些模块.图4 RRT系统快照4.2.1 类图信息录入模块点击系统中的类图信息录入选项即可进入类图信息录入界面,该界面主要包括类的信息、方法信息和对象信息录入3个部分,点击不同的选项卡即可进行不同信息的录入.在进行类信息录入时主要包括类名和基本类型成员信息,在录入基本成员信息时,除了成员名称之外还需要选择成员类型,并且需要为每种基本成员设定最大值和最小值,设定最大值和最小值的目的是为了计算每个类型的取值范围,用于计算测试用例之间的距离;最后还要选择每个基本成员的权限值.在所有的选项都填写完毕后,点击添加成员按钮即添加成功,可以在类信息录入界面中的成员列表中看到已经添加的类的成员.当所有类信息输入完毕后点击添加类按钮即可完成当前类的创建,同时在该界面的已有类选项中可以看到当前系统中所有已存在的类.在所有类信息录入完毕后系统会将类图信息转化成二进制文件以便试验中使用.为自定义类中添加自定义方法时就需要进行方法的录入,在方法录入时首先选择它所属的类,这里的类时是当前系统中已存在的类,录入方法时必须选择所属类.然后录入方法的名称、返回值以及权限值等信息;方法信息录入完毕后点击添加方法按钮即可完成自定义方法的创建,然后在方法列表项里即可看到新创建的方法.对象信息录入就是进行自定义类的实例化操作,首先录入对象的名称,然后选择该对象的所属类,同自定义方法一样,对象的所属类也必须是已经存在的类.在为对象中的成员变量赋值时,需要先判断成员变量的类型,如果是基本数据类型则在相应的范围内随机生成变量的值;若是引用类型则需先选择其所引用的对象的名称,然后再进行赋值操作;在所有成员变量赋值完毕之后点击添加对象按钮完成对象的创建.4.2.2 算法执行模块该模块同数值型程序测试中的算法执行模块相似,同样为RRT算法设计了独立的操作界面,点击相应的选项卡即可进入算法执行界面.在执行算法之前需要完成2个路径的填写,分别是测试用例生成的参数配置文件和测试结果文件的保存路径.其中配置文件中不仅含有失效率、种子值等信息,最重要的是类信息,即在系统中录入的待测类信息,所由参数配置完毕后保存为xml文件的形式,在执行算法之前将该xml文件路径填写到相应位置即可.除了配置文件的路径之外,同样的非数值型程序中的算法执行模块也需要1个结果文件的保存路径.在这2个路径配置完毕之后点击开始测试按钮即可开始执行相应的算法.4.2.3 测试用例距离计算模块该模块的主要任务是进行测试用例之间的距离计算,在计算测试用例的距离之前需要先进行测试用例的添加,然后选择2个待计算的测试用例进行计算.在计算时首先获取每个测试用例中存储的成员变量信息,然后根据计算公式(1)-(8)进行测试用例间的距离度量.4.2.4 结果分析模块该模块同数值型测试的结果统计模块一样,也是将结果保存为txt文件,然后将该txt文件分别以匹配信息为关键字转换成excel文件,最后在excel文件中统计每种试验结果.5 试验结果分析算法的有效性度量主要包括P-measure[23],F-measure[19]和E-measure[24],其中P-measure是指至少发现1个错误的概率,E-measure是指预期发现的错误的总数,F-measure是指发现第1个错误所需要的测试用例数量.因此,1个测试方法和其他测试方法相比,如果拥有更高的P-measure、更高的E-mea-sure和更低的F-measure,则表示该方法检测错误的效率更高.试验中采用的是F-measure和E-measure这2种评价方法.5.1 F-measure试验结果对比模拟类测试的F-measure试验结果如表1所示,试验中对2个模拟类分别进行了测试,其中模拟类1和模拟类2分别包含了3个和5个公共方法;2个模拟类均包含了int,double,bool,char,float这5种基本数据类型;其中为模拟类1植入了3个错误,为模拟类2植入了4个错误.表1模拟类1和2的F-measure试验结果由表1可见,和RT相比,RRT算法在发现第1个程序错误时使用的测试用例个数少.在测试开源类库时,选取的C#类库为Stack 和Queue,并将这2个类库改为只包含1个类,其中Stack类库包含5个方法,Queue类库包含4个方法;并为Stack和Queue分别植入3个和2个错误.这2个类的F-measure试验结果如表2所示.表2Stack和Queue的F-measure试验结果由表2可见,在测试开源类库时和模拟类的结果基本一致,即RRT算法的F-measure值和Fm-time值都更低,说明RRT在发现第1个程序错误时使用的测试用例个数少;这表明在面向对象的试验中,RRT算法能够很好地改善RT测试用例用例过多的弊端.5.2 E-measure和Em-time试验结果分析E-measure值也是评判面向对象算法有效性的重要指标之一.2个模拟类的E-measure试验结果如表3所示,Em-time如图5所示.表3模拟类1和2的E-measure试验结果图5 模拟类1和模拟类2的Em-time试验结果文中对2个模拟类和2个开源类库分别做了用例个数为100,500,1 000,1 500,2 000的试验,E-measure试验中测试的2个模拟类库同F-measure试验中测试的是完全相同的.并且根据种子值的差异每种类的试验都进行了100次,最后的结果为这100次试验结果的平均值.这2个类的E-measure的试验结果如表3所示.为了试验的完整性,对2个开源类库分别进行用例为100, 500, 1 000, 1 500, 2 000的试验,与模拟类的测试相同,分别进行了100次试验,最后结果是100次试验平均值.同时和F-measure试验一样,在E-measure试验中依然为Stack和Queue分别值入3个和2个错误.试验结果如表4所示.表4Stack和Queue的E-measure试验结果从模拟类和开源类的E-measure试验中可以看出,RRT和RT算法在测试面向对象程序时的E-measure值相差不大,即2种算法在使用相同用例个数的情况下发现的程序错误总数基本相同,即它们发现错误的能力是相同的,但是相比RT,RRT使用的测试用例更少,效果更好.6 结论1) 实现了RRT算法在面向对象中的应用.首先提出了测试用例间的距离表现形式,在对测试用例的结构分析之后,将测试用例间的距离定义为静态部分和动态部分距离之和,并分别给出了各部分的距离计算公式,最后计算出测试用例间的距离,实现了RRT在面向对象中的应用.2) 设计并实现了1个测试工具原型系统.系统中实现了试验中所使用的距离计算公式,然后指出了面向对象程序的测试流程,并给出了类图信息的存储结构以及面向对象测试用例生成方法,系统中的测试模块主要有类图信息录入模块、测试用例距离度量模块、算法执行模块等.在该系统上做了大量试验,验证了提出方法的有效性.。