软件测试 |
您所在的位置:网站首页 › 问题空间包括 › 软件测试 |
1 面向对象测试的概述 面向对象软件测试的目标与传统测试一样:用尽可能低的测试成本和尽可能少的测试用例,发现尽可能多的软件缺陷。 面向对象的测试策略也遵循从“小型测试”到“大型测试”,即从单元测试到最终的功能性测试和系统性测试。 变化 面向对象 = 对象 + 类 + 继承 + 通信 新特点:封装、继承、多态 这些变化带来了产生新错误的可能,带来了测试的变化: (1)基本功能模块 系统的基本构造单元不再是传统的功能模块,而是类和对象。 在测试过程中,不能仅检查输入数据产生的输出结果是否与预期结果相吻合,还要考虑对象的状态变化、方法间的相互影响等。 (2)系统的功能实现 系统的功能体现在对象间的协作上,而不再是简单的过程调用。 (3)封装对测试的影响 封装使对象的内部状态隐蔽,如果类中未提供足够的存取函数来表明对象的实现方式和内部状态,则类的信息隐蔽机制将给测试带来困难。 (4)继承对测试的影响 继承削弱了封装性,产生了类似于非面向对象语言中全局数据的错误风险。 若一个类得到了充分的测试,当其被子类继承后,继承的方法在子类的环境中的行为特征需要重新测试。 (5)多态对测试的影响 多态依赖于不规则的类层次的动态绑定,可能产生非预期的结果。 面向对象的开发模型突破了传统的瀑布模型,将开发分为: 面向对象分析(OOA) 面向对象设计(OOD) 面向对象编程(OOP) 三个阶段。 开发阶段的面向对象的软件测试 面向对象分析的测试(OOA Test) 面向对象设计的测试(OOD Test) 面向对象编程的测试(OOP Test) 面向对象单元测试(OO Unit Test) 面向对象集成测试(OO Integrate Test) 面向对象系统测试(OO System Test) (1)OOA Test 和 OOD Test 是对分析结果和设计结果的测试。 主要是对分析设计产生的文本进行测试,是软件开发前期的关键性测试。 (2)OOP Test 主要针对编程风格和代码实现进行测试。 其主要的测试内容在面向对象单元测试和面向对象集成测试中体现。 (3)面向对象单元测试 是对程序内部具体单一的功能模块的测试。 主要就是对类和类成员函数的测试。 (4)面向对象集成测试 主要对系统内部的相互服务进行测试,如成员函数间的相互作用、类间的信息传递等。 面向对象集成测试不但要基于面向对象单元测试,更要参见OOD或OOD Test结果。 (5)面向对象系统测试 主要以用户需求为测试标注,也要借鉴OOA或OOA Test结果。 2 开发前期的面向对象测试 在这个时器的测试工作主要是静态测试。 通过各种评审和质量分析活动,完成必须的测试工作,及时检测和克服各种缺陷。 2.1 面向对象分析的测试(OOA Test)面向过程分析 VS 面向对象分析(OOA) 传统的面向过程分析是一个功能分解的过程,是把一个系统看成可以分解的功能的集合。 面向对象分析是把E-R图和语义网络模型与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法,最后得到问题领域的可视的形式描述。 OOA直接映射问题空间,全面的将问题空间中实现功能的现实抽象化,将问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和操作表示实例的特性和行为。 OOA测试的重点在其完整性和冗余性 OOA对问题领域分析抽象的不完整,最终会影响软件的功能实现,导致软件开发后期大量可避免的修补工作; 而一些冗余的对象或结构会影响类的选定、程序的整体结构或增加程序员不必要的工作量。 OOA阶段的测试可分为五个方面: (1)对认定的类的测试 (2)对认定的结构的测试 (3)对认定的主题的测试 (4)对定义的属性和实例关联的测试 (5)对定义的服务和消息关联的测试 2.2 面向对象设计的测试(OOD Test)对OOD的测试,应从如下三个方面考虑: (1)对认定的类的测试 (2)对构造的类层次结构的测试 (3)对类库的支持的测试(复用性测试) 2.3 面向对象编程的测试(OOP Test)面向对象程序的特点 典型的面向对象程序具有继承、封装和多态的新特性,这使得传统的测试策略必须有所改变: (1)封装是对数据的隐藏,外界只能通过被提供的操作来访问或修改数据,这样降低了数据被任意修改和读写的可能性,降低了传统程序中对数据非法操作的测试。 (2)继承使得代码的重用率提高,同时也使错误传播的概率提高 (3)多态使得程序内统一函数的行为复杂化,测试时必须考虑不同类型具体执行的代码和产生的行为。 面向对象程序时把功能的实现分布在类中 与某些设计功能相关的一组对象,通过对象提供的服务和对象之间的消息传递,共同协作来实现这个功能。 这种面向对象程序风格,可将出现的错误精确定位在某一个具体的对象。 在面向对象编程阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格,主要体现为以下两个方面: (1)数据成员是否满足数据封装的要求 (2)类是否实现了要求的功能 3 开发后期的面向对象测试编程完成后,需要经历若干个阶段的测试:单元测试、集成测试、验收测试、系统测试 3.1 面向对象的单元测试传统的单元测试对象 模块。多采用白盒测试 面向对象测试 最小的可测试单位可能是封装的类或对象,类包含一组不同的操作。 单元测试可能是测试封装操作的类,也可能是测试类中的单个操作。 传统的单元测试主要关注模块的算法;面向对象软件的类测试主要是测试封装在类中的操作以及类的状态行为,需要分两步: (1)测试与对象相关联的单个操作 它们是一些函数或程序,传统的白盒测试和黑盒测试方法都可以使用。 (2)测试单个对象类 黑盒测试的原理不变,但等价划分的概念要扩展以适合操作序列的情况。 3.1.1 对象操作的测试(1)在面向对象程序中,对象的操作(成员函数)通常都很小,功能单一,函数间调用频繁,易出现一些不易发现的错误。 (2)面向对象编程的特性使得对成员函数的测试又不等同于传统的函数或过程测试,尤其是集成特性和多态特性。 a. 继承的成员函数可能需要重新测试 对父类中已经测试过的成员函数,两种情况需要在子类中重新测试: 继承的成员函数在子类中做了改动 成员函数调用了改动过的成员函数 b. 对父类的测试用例不能照搬到子类 分层与增量 派生类D是C的子类,那么所有的用于C的基于规范的测试用例也都适用于D。 引入术语“继承的测试用例”来代表从父类测试用例中选取出来的、用于子类的测试用例。 可以通过增量变化分析来确定继承的测试用例中哪些在测试子类时必须执行、哪些可以不执行。 D的接口中添加新的操作,并且有可能是D的一个新方法实现的新操作。新操作引入了新的功能/代码,这些需要测试。 在D中改变了那些在C中声明的操作规范,需要为操作添加新的基于规范的测试用例。 在D中覆盖那些在C中实现了某个操作并且被D继承了的方法,可以复用该方法的所有继承来的基于规范的测试用例。 在D中添加新的实例变量来实现更多的状态和属性,最有可能与新的操作和重载方法中代码有关,而且关系到对测试的处理。 在D中改变类常量。类常量累计成每个测试用例的附加的后置条件。 3.1.2 对象类测试在测试对象时,完全的覆盖测试应当包括: 隔离对象中所有操作,进行独立测试 测试对象中所有属性的设置和访问 测试对象的所有可能的状态转换。所有可能引起状态改变的事件都要模拟到。 (未完) 3.2 面向对象的集成测试传统的集成测试 自顶向下集成、自底向上集成 面向对象测试 当开发面向对象系统时,集成的层次并不明显。 当一组对象类通过组合行为提供一组服务时,则需将它们一起测试,这就是簇测试。 对象集成测试又称交互测试,目的是确保对象的消息传递能够正确进行。 面向对象的集成测试有3种可用的方法: (1)类层次测试 着眼于系统结构,首先测试几乎不使用服务器类的独立类,再测试那些使用了独立类的下一层次的依赖类。 这样一层层地持续下去,直到整个系统构造完成。 (2)基于线程地测试 把为响应某一系统输入或事件所需的一组对象类组装在一起,每一条线程将分别测试和组装。 (3)对象交互测试 集成测试能够检测出相对独立的单元测无法检测出的那些类相互作用时才会产生的错误。 集成测试只关注于系统的结构和内部的相互作用。 面向对象的集成测试可以分成两步进行: 先进行静态测试,再进行动态测试。 3.3 面向对象的确认测试与传统的确认测试一样,面向对象软件的有效性集中在用户可见的动作(事件驱动与过程)与用户可识别的系统输出(结果),通过测试检验软件是否满足用户的需求。 在面向对象的确认测试种,通常采用传统的黑盒测试方法,以证明软件功能和需求的一致性。 3.4 面向对象的系统测试可套用传统的系统测试方法 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |