您的位置:首页 > 其它

软件测试相关概念

2011-11-10 09:32 309 查看
软件缺陷的特征

n “看不到”

——软件的特殊性决定了缺陷不易看到

n “看到但是抓不到”

——发现了缺陷,但不易找到问题发生的原因所在

1、软件测试的定义

软件测试就是在软件投入运行前,对软件需求分析、设计规格说明和编码实现的最终审查,它是软件质量保证的关键步骤。通常对软件测试的定义有两种描述:

n 定义1:软件测试是为了发现错误而执行程序的过程。

n 定义2:软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计的一批测试用例,并利用这些测试用例运行程序以及发现错误的过程,即执行测试步骤。

n 测试:所谓测试的含义,首先是一项活动,在这项活动中某个系统或组成的部分将在特定的条件下运行,结果将被观察和记录,并对系统或组成部分进行评价。测试活动有两种结果:找出缺陷和故障,或显示软件执行正确。测试是一个或多个测试用例的集合。

n 测试用例:所谓测试用例是为特定的目的而设计的一组测试输入、执行条件和预期的结果;测试用例是执行测试的最小实体。

n 测试步骤:测试步骤详细规定了如何设置、执行、评估特定的测试用例。

n 软件测试的对象:

——软件测试不等于程序测试。

——软件测试贯串于软件定义和开发的整个过程。

——软件开发过程中所产生的需求规格说明、概要设计规格说明、详细设计规格说明以及源程序都是软件测试的对象。

n 软件在从需求、设计、编码、测试一直到交付用户公开使用后的过程中,都有可能产生和发现缺陷。随着整个开发过程的时间推移,更正缺陷或修复问题的费用呈几何级数增长。

完整的软件开发流程

n 软件测试的复杂性分析

1、无法对程序进行完全测试

(1)测试所需要的输入量太大

(2)测试的输出结果太多

(3)软件实现的途径太多

(4)软件规格说明没有一个客观标准

2、测试无法显示潜在的软件缺陷和故障

——通过软件测试只能报告软件已被发现的缺陷和故障,无法报告隐藏的软件故障。

3、存在的故障现象与发现的故障数量成正比

——结论:应当对故障集中的程序段进行重点测试

n 静态测试与动态测试(续)

代码检查

n 代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面。

n 代码检查的具体内容:变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等。

n 代码检查的优点:在实际使用中,代码检查比动态测试更有效率,能快速找到缺陷,发现30%~70%的逻辑设计和编码缺陷;代码检查看到的是问题本身而非征兆。

n 代码检查的缺点:非常耗费时间,而且代码检查需要知识和经验的积累。

静态结构分析

n 静态结构分析主要是以图形的方式表现程序的内部结构。 例如函数调用关系图、函数内部控制流图。其中:

——函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系;

——控制流图显示一个函数的逻辑结构,由许多节点组成,一个节点代表一条语句或数条语句,连接结点的叫边,边表示节点间的控制流向。

代码质量度量

n 软件质量包括六个方面:功能性、可靠性、易用性、效率、可维护性和可移植性。软件的质量是软件属性的各种标准度量的组合。

n 针对软件的可维护性,目前业界主要存在三种度量参数:Line复杂度、Halstead复杂度和McCabe复杂度。其中Line复杂度以代码的行数作为计算的基准。Halstead以程序中使用到的运算符与运算元数量作为计数目标(直接测量指标),然后可以据以计算出程序容量、工作量等。McCabe复杂度 一般称为圈复杂度,它将软件的流程图转化为有向图,然后以图论来衡量软件的质量。

n 静态测试阶段的任务:

(1)检查算法的逻辑正确性。

(2)检查模块接口的正确性。

(3)检查输入参数是否有合法性检查。

(4)检查调用其他模块的接口是否正确。

(5)检查是否设置了适当的出错处理。

(6)检查表达式、语句是否正确,是否含有二义性。

(7)检查常量或全局变量使用是否正确。

(8)检查标识符的使用是否规范、一致。

(9)检查程序风格的一致性、规范性。

(10)检查代码是否可以优化,算法效率是否最高。

(11)检查代码注释是否完整,是否正确反映了代码的功能

n 静态测试可以完成以下工作:

(1)发现下列程序的错误:错用局部变量和全局变量;未定义的变量、不匹配的参数;不适当的循环嵌套或分支嵌套、死循环、不允许的递归;调用不存在的子程序,遗漏标号或代码。

(2)找出以下问题的根源:从未使用过的变量;不会执行到的代码、从未使用过的标号;潜在的死循环。

(3)提供程序缺陷的间接信息:所用变量和常量的交叉应用表;是否违背编码规则;标识符的使用方法和过程的调用层次。

(4)为进一步查找做好准备。

(5)选择测试用例。

(6)进行符号测试。

动态测试

n 动态方法的主要特征是:

——计算机必须真正运行被测试的程序,通过输入测试用例,对其运行情况即输入与输出的对应关系进行分析,以达到检测的目的。

n 动态测试包括:

(1)功能确认与接口测试

(2)覆盖率分析

(3)性能分析

(4)内存分析

客户/服务器体系结构测试方法

n 从宏观上说,C/S体系结构的软件测试通常是从单个客户端开始,然后再逐步集成客户端、服务器和网络系统进行集成测试,最后进行系统的整体测试。即从以下三个层面来进行C/S系统的测试:

(1)客户端的独立测试

对客户端的测试主要是属于功能性测试。用户客户端应用以“分离的”模式被测试,即这层测试不考虑服务器和底层网络的运行。通常包括:

Ø 客户端的测试——检测客户端的业务逻辑流程的应用

Ø 操作系统平台测试——在各种系统平台上进行兼容性测试

Ø 浏览器测试

(2)客户端与服务器端的集成测试

客户端软件和关联的服务器端应用作一体测试,但并不过多考虑网络运行的关联因素。

Ø 对服务器的测试——主要是性能的测试。测试包含服务器的协调和数据管理功能以及服务器的性能(整体响应时间和数据的吞吐量)的表现。通常包括:数据库测试、连接速度测试、负载测试、压力测试。

Ø 对应用服务器(中间件)的测试

对C/S系统的集成测试一般采用非增量式的方法完成。此外,C/S测试必须考虑面向对象的测试技术,尤其是C/S系统基本上都采用了GUI(图形用户界面)。

(3)整体测试

对完整的C/S体系结构整体测试,在上述功能测试和性能测试的基础上,还包括网络运行及其性能的测试。 整体测试通常包括以下测试项目:

Ø 事务测试——创建一系列的测试以保证每类事务被按照需求处理。事务测试着重于处理的正确性,同时也关注性能问题。

Ø 网络通信测试——用于验证网络节点间的通信是否正常的发生,并且消息传递、事务和相关的网络通信有无错误的发生。

Web网站的测试

n 基于 Web 的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试,从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。

n 对Web网站测试所采用的测试方法与策略有哪些?

——黑盒测试、白盒测试、静态测试和动态测试都有可能用到,还会包括面向对象测试技术的运用。

n Web网站的测试是一项复杂的任务,如何进行?

——最初的起点是把网页或整个网站当作一个黑盒子。

网页测试

n 文字测试:检查用户等级、术语、内容、准确度以及内容的时效性。

n 链接测试:测试所有链接是否能按照指示的那样正确链接到应当链接的页面;测试所链接的页面是否存在;确保不存在孤立页面(即没有链接指向的页面)。

n 图形、图像测试:确保有明确的用途;颜色的搭配;图片的大小和质量;所有图形是否能够正确载入和显示。

n 表单测试:检测域的大小;数据接收是否正确;可选域是否真正可选;提交操作的完整性等。

n 动态内容测试(要求能查看到程序源代码)

n Cookies测试:Cookies是否起作用;是否按预定的时间进行保存;刷新对Cookies有何影响等。

网站测试

n 数据库测试:在使用了数据库的Web系统中,测试由用户提交的表单信息不正确而引起的数据一致性问题;测试由网络速度或程序设计等问题引起的输出故障。

n 服务器性能及负载(压力)测试:通过应用模拟的方法实现,即通过某种程序方法(工具软件)模拟上万个链接和下载来判断服务器的响应时间、并发访问数量等性能与负载能力。

n 可用性测试:包括整体界面测试和导航测试。

n 安全性测试:测试有效和无效的用户名和密码;测试Web应用系统是否有超时的限制;测试相关信息是否写进了日志文件、是否可追踪;在使用了安全套接字时,测试加密是否正确;在没有经过授权时,测试是否能拒绝在服务器端放置和编辑脚本。

对Web进行压力测试

n Web服务测试原理

n Web压力测试

压力测试是系统测试的一部分,要被设计为通过应用很大的工作负载来使软件超负荷运转,其目的是要弄清楚被测试的Web服务是不是不仅能做预期应能做的事,而且在被施加了某些高强度压力的情况下仍能继续正常运行。如果压力测试通过对软件保持高强度的使用(不超过性能统计数字确定的限制)能够有效执行,那么它就经常能够发现许多其它测试无法发现的隐蔽错误。

n 压力下的错误类型

Ø 内存泄露——通常要求操作重复非常多的次数后才会出现

Ø 并发与同步

n 有效的压力测试系统的关键条件

Ø 重复:就是一遍又一遍地执行某个操作或功能。这将确定一个操作能否正常执行,并且能否继续在每次执行时都表现正常。

Ø 并发:就是在同一时间内执行多个操作。由并发引起的错误只能通过执行多个代码示例才能测出来,测试时要同时遍历多条代码路径。

Ø 量级:要考虑到每个操作中的负载量,操作自身应尽可能给被测软件系统增加压力,即:尽量使单独的操作进行高强度的使用,增加操作的量级。

Ø 随机变化:随机使用前面条件中的无数变化形式,就能够在每次测试运行时应用许多不同的代码路径。

使用WAS进行Web负载测试

面向对象的基本概念

n 对象——是指包含了一组属性以及对这些属性的操作的封装体。属性可以是数据,也可以是另一个对象;每个对象都有它自己的属性值,表示该对象的状态;对象中的属性只能通过该对象所提供的操作来存取或修改。对象所具有的状态、行为、标识三个基本特征,分别对应与对象的属性、方法和对象名。

n 对象是软件开发期间测试的直接目标。

n 面向对象软件测试所关注的焦点:

(1)对象的行为是否符合它的规定说明;

(2)该对象与和它相关的对象是否协同工作。

n 类——是具有相同属性和相同行为的对象的集合。面向对象程序运行的基本元素是对象,而类则是用来定义对象这一基本元素的。

n 在面向对象程序设计中,类是一个独立的程序单位,它有一个类名,还包括用于描述对象属性的成员变量和用于描述对象行为的成员函数。

n 类是对象的抽象定义,它定义了用户将要如何创建对象的方法。使用类时必须先实例化—用对象名创建类的实例,再通过这个对象去访问类的成员变量,去调用类的成员函数。

n 消息——是对象的操作将要执行的一种请求,也被称为成员函数调用或者方法调用。面向对象的程序的执行实际上是执行一个由消息连接起来的方法序列。

Ø “发送消息M到对象N” =“调用N对象的M方法”

n 一个对象通过向另一个对象发送消息来请求其服务,对象之间的协同工作是通过互相传送消息来完成的。

n 一个消息通常包括接收对象名、调用的操作名和适当参数(如有必要)。消息只告诉接收对象需要完成什么操作,但并不指示接收者怎样去完成操作。消息完全由接收者解释,接收者独立决定采用什么方法来完成所需操作。

n 从测试的角度看,关于消息有下面的结论:

(1)消息的发送者决定何时进行发送消息,可能会做出错误的决定;

(2)消息的接收者可能收到非预期的特定消息,并做出不正确地反映;

(3)消息可能含有参数。在处理一条消息时,参数能被接收者使用或修改。若传递的参数是对象,那么在消息被处理前和处理后,对象必须处于正确的状态,而且必须是接收者所期望的接口。

n 接口——是行为声明的集合。接口是由一些规范构成的,规范定义了类的一套完整的公共行为。

n 从测试的角度,关于接口有下面的结论:

(1)接口封装了操作的说明。如果这一接口包含的行为和类的行为不相符,那么这一接口的说明就有问题。

(2)接口非孤立,它与其它的接口和类有一定的关系。一个接口可以指定一个行为的参数类型,使得实现该接口的类可以被当作一个参数进行传递。

n 继承——是指在某个类的层次关联中,不同的类共享属性和操作的一种机制。继承允许一个新的类(称为子类)在一个已有的类(称为父类或者基类)的基础上进行定义。一个父类可以有多个子类,这些子类都是父类的特例。父类描述了这些子类的公共属性和操作,子类中还可以定义它自己的属性和操作。

n 从测试的角度来看,继承包含以下内容:

(1)继承提供一种机制,通过这种机制,潜在的错误能够从一个类传递到它的派生类。

(2)子类是从父类继承过来的,子类也就继承了父类的属性和操作。因此,可以用测试父类的方法对子类进行测试。

n 多态——是指同一个操作作用于不同的对象可以有不同的解释,产生不同的执行结果。多态提供了将类看作是一种或多种类型的能力,它定义了用来支持多种不同类型所适应的策略。多态可分为包含多态与参数多态。

n 与多态密切相关的一个概念就是动态绑定。传统程序设计语言把过程调用与目标代码的连接放在程序运行前进行,称为静态绑定。而动态绑定则是把这种连接推迟到运行时才进行。

n 在程序运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定。

n 自动化测试的定义:使用一种自动化测试工具来验证各种软件测试的需求,它包括测试活动的管理与实施。

n 在进行自动化测试前,首先要建立一个对软件测试自动化的认识观。软件测试工具能提高测试效率、覆盖率和可靠性等,自动化测试虽然具有很多优点,但它只是测试工作的一部分,是对手工测试的一种补充。自动化测试绝不能代替手工测试,它们各有各自的特点,其测试对象和测试范围都不一样:

Ø 在系统功能逻辑测试、验收测试、适用性测试、涉及物理交互性测试时,多采用黑盒测试的手工测试方法。

Ø 单元测试、集成测试、系统负载测试、性能测试、稳定性测试、可靠性测试等比较适合采用自动化测试。

Ø 那种不稳定软件的测试、开发周期很短的软件、一次性的软件等不适合自动化测试。

Ø 工具本身并没有想象力和灵活性,根据报道,自动化测试只能发现15%的缺陷,而手工测试可以发现85%的缺陷。

Ø 自动化测试工具在进行功能测试时,其准确的含义是回归测试工具,这时工具不能发现更多的新问题,但可以保证对已经测试过部分的准确性和客观性。

多数情况下,手工测试和自动化测试应该相结合,以最有效的方法来完成测试任务。

n 通常,当软件开发过程具有下列情况时,就需要考虑引入自动化测试:

(1)非常重要的测试;(2)涉及范围很广的测试;(3)对主要功能的测试;(4)容易自动化的测试;(5)很快有回报的测试;(6)运行最频繁的测试;(7)测试个案的生成,包括测试输入、测试输出、测试操作指令等;(8)测试的执行与控制,包括单机运行和网络多机分布式的运行,在节假日的运行,测试个案调用控制,测试对象、测试范围与测试版本的控制等;(9)测试结果与标准输出进行对比;(10)不吻合预期的测试结果的分析、记录、分类和报告,及总体测试状况的统计及报表的产生。

自动化测试的原理和方法

n 软件测试自动化实现的基础是可以通过设计的特殊程序模拟测试人员对计算机的操作过程、操作行为,或者类似于编译系统那样对计算机程序进行检查。

n 软件测试自动化实现的原理和方法主要有:直接对代码进行静态和动态分析、测试过程的捕获和回放、测试脚本技术、虚拟用户技术和测试管理技术。

(1)代码分析

代码分析类似于高级编译系统,一般针对不同的高级语言去构造分析工具,在工具中定义类、对象、函数、变量等定义规则、语法规则;在分析时对代码进行语法扫描,找出不符合编码规范的地方;根据某种质量模型评价代码质量,生成系统的调用关系图等。

(2)捕获和回放

代码分析是一种白盒测试的自动化方法,捕获和回放则是一种黑盒测试的自动化方法。捕获是将用户每一步操作都记录下来。这种记录的方式有两种:程序用户界面的像素坐标或程序显示对象(窗口、按钮、滚动条等)的位置,以及相对应的操作、状态变化或是属性变化。所有的记录转换为一种脚本语言所描述的过程,以模拟用户的操作。

回放时,将脚本语言所描述的过程转换为屏幕上的操作,然后将被测系统的输出记录下来同预先给定的标准结果比较。这可以大大减轻黑盒测试的工作量,在迭代开发的过程中,能够很好地进行回归测试。

n 关于自动化测试中的“录制—回放”技术

目前的自动化负载测试解决方案几乎都是采用 “录制-回放”的技术。

所谓的“录制-回放”技术,就是先由手工完成一遍需要测试的流程,同时由计算机记录下这个流程期间客户端和服务器端之间的通信信息,这些信息通常是一些协议和数据,并形成特定的脚本程序 (Script) 。然后在系统的统一管理下同时生成多个虚拟用户,并运行该脚本,监控硬件和软件平台的性能,提供分析报告或相关资料。这样,通过几台机器就可以模拟出成百上千的用户对应用系统进行负载能力的测试。

常用测试工具概要

n ParasoftC++ Test

n TureCoverage

n QACenter

n DataFactory

n WinRunner

n MS ACT

n RationalRobot

n PureLoad
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: