发布新日志

  • 集成测试

    2009-06-02 15:31:04

     

     

     

    集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。此外,如果程序由多个进程组成,应该成对测试它们,而不是同时测试所有进程。

    集成测试识别组合单元时出现的问题。通过使用要求在组合单元前测试每个单元并确保每个单元的生存能力的测试计划,可以知道在组合单元时所发现的任何错误很可能与单元之间的接口有关。这种方法将可能发生的情况数量减少到更简单的分析级别。

    集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指标及要求的活动。也就是说,在集成测试之前,单元测试应该已经完成,集成测试中所使用的对象应该是已经经过单元测试的软件单元。这一点很重要,因为如果不经过单元测试,那么集成测试的效果将会受到很大影响,并且会大幅增加软件单元代码纠错的代价。

    集成测试是单元测试的逻辑扩展。在现实方案中,集成是指多个单元的聚合,许多单元组合成模块,而这些模块又聚合成程序的更大部分,如分系统或系统。集成测试采用的方法是测试软件单元的组合能否正常工作,以及与其他组的模块能否集成起来工作。最后,还要测试构成系统的所有模块组合能否正常工作。集成测试所持的主要标准是《软件概要设计规格说明》,任何不符合该说明的程序模块行为都应该加以记载并上报。

    所有的软件项目都不能摆脱系统集成这个阶段。不管采用什么开发模式,具体的开发工作总得从一个一个的软件单元做起,软件单元只有经过集成才能形成一个有机的整体。具体的集成过程可能是显性的也可能是隐性的。只要有集成,总是会出现一些常见问题,工程实践中,几乎不存在软件单元组装过程中不出任何问题的情况。从图1可以看出,集成测试需要花费的时间远远超过单元测试,直接从单元测试过渡到系统测试是极不妥当的做法。

    集成测试的必要性还在于一些模块虽然能够单独地工作,但并不能保证连接起来也能正常工作。程序在某些局部反映不出来的问题,有可能在全局上会暴露出来,影响功能的实现。此外,在某些开发模式中,如迭代式开发,设计和实现是迭代进行的。在这种情况下,集成测试的意义还在于它能间接地验证概要设计是否具有可行性。

    集成测试的目的是确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。它所测试的内容包括单元间的接口以及集成后的功能。使用黑盒测试方法测试集成的功能。并且对以前的集成进行回归测试。

    一、集成测试过程

    二、单元测试工作内容及其流程

    三、集成测试需求获取

    集成测试需求所确定的是对某一集成工作版本的测试的内容,即测试的具体对象。集成测试需求主要来源于设计模型(Design Model)和集成构件计划(Integration Build Plan)。集成测试着重于集成版本的外部接口的行为。因此,测试需求须具有可观测、可测评性。

    1. 集成工作版本应分析其类协作与消息序列,从而找出该工作版本的外部接口。

    2. 由集成工作版本的外部接口确定集成测试用例。

    3. 测试用例应覆盖工作版本每一外部接口的所有消息流序列。

    注意:一个外部接口和测试用例的关系是多对多,部分集成工作版本的测试需求可映射到系统测试需求,因此对这些集成测试用例可采用重用系统测试用例技术。

    四、集成测试工作机制

    软件集成测试工作由产品评测部担任。需要项目组相关角色配合完成。如图示:

    软件评测部:

    软件项目组:

    集成测试工作内容及其流程工作流程:

    五、集成测试产生的工件清单

    1、 软件集成测试计划
        2、 集成测试用例
        3、 测试过程
        4、 测试脚本
        5、 测试日志
        6、 测试评估摘要

    六、集成测试常用方案选型

    集成测试的实施方案有很多种,如自底向上集成测试、自顶向下集成测试、Big-Bang集成测试、三明治集成测试、核心集成测试、分层集成测试、基于使用的集成测试等。在此,笔者将重点讨论其中一些经实践检验和一些证实有效的集成测试方案。

    ·自底向上集成测试

    自底向上的集成(Bottom-Up Integration)方式是最常使用的方法。其他集成方法都或多或少地继承、吸收了这种集成方式的思想。自底向上集成方式从程序模块结构中最底层的模块开始组装和测试。因为模块是自底向上进行组装的,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)事前已经完成组装并经过测试,所以不再需要编制桩模块(一种能模拟真实模块,给待测模块提供调用接口或数据的测试用软件模块)。自底向上集成测试的步骤大致如下:

    步骤一: 按照概要设计规格说明,明确有哪些被测模块。在熟悉被测模块性质的基础上对被测模块进行分层,在同一层次上的测试可以并行进行,然后排出测试活动的先后关系,制定测试进度计划。图2给出了自底向上的集成测试过程中各测试活动的拓扑关系。利用图论的相关知识,可以排出各活动之间的时间序列关系,处于同一层次的测试活动可以同时进行,而不会相互影响。

    步骤二: 在步骤一的基础上,按时间线序关系,将软件单元集成为模块,并测试在集成过程中出现的问题。这里,可能需要测试人员开发一些驱动模块来驱动集成活动中形成的被测模块。对于比较大的模块,可以先将其中的某几个软件单元集成为子模块,然后再集成为一个较大的模块。

     步骤三: 将各软件模块集成为子系统(或分系统)。检测各自子系统是否能正常工作。同样,可能需要测试人员开发少量的驱动模块来驱动被测子系统。

     步骤四: 将各子系统集成为最终用户系统,测试是否存在各分系统能否在最终用户系统中正常工作。

    方案点评: 自底向上的集成测试方案是工程实践中最常用的测试方法。相关技术也较为成熟。它的优点很明显: 管理方便、测试人员能较好地锁定软件故障所在位置。但它对于某些开发模式不适用,如使用XP开发方法,它会要求测试人员在全部软件单元实现之前完成核心软件部件的集成测试。尽管如此,自底向上的集成测试方法仍不失为一个可供参考的集成测试方案。

    ·核心系统先行集成测试

    核心系统先行集成测试法的思想是先对核心软件部件进行集成测试,在测试通过的基础上再按各外围软件部件的重要程度逐个集成到核心系统中。每次加入一个外围软件部件都产生一个产品基线,直至最后形成稳定的软件产品。核心系统先行集成测试法对应的集成过程是一个逐渐趋于闭合的螺旋形曲线,代表产品逐步定型的过程。其步骤如下:

    步骤一: 对核心系统中的每个模块进行单独的、充分的测试,必要时使用驱动模块和桩模块;

    步骤二: 对于核心系统中的所有模块一次性集合到被测系统中,解决集成中出现的各类问题。在核心系统规模相对较大的情况下,也可以按照自底向上的步骤,集成核心系统的各组成模块。

    步骤三: 按照各外围软件部件的重要程度以及模块间的相互制约关系,拟定外围软件部件集成到核心系统中的顺序方案。方案经评审以后,即可进行外围软件部件的集成。

    步骤四: 在外围软件部件添加到核心系统以前,外围软件部件应先完成内部的模块级集成测试。

    步骤五: 按顺序不断加入外围软件部件,排除外围软件部件集成中出现的问题,形成最终的用户系统。

    方案点评: 该集成测试方法对于快速软件开发很有效果,适合较复杂系统的集成测试,能保证一些重要的功能和服务的实现。缺点是采用此法的系统一般应能明确区分核心软件部件和外围软件部件,核心软件部件应具有较高的耦合度,外围软件部件内部也应具有较高的耦合度,但各外围软件部件之间应具有较低的耦合度。

    ·高频集成测试

    高频集成测试是指同步于软件开发过程,每隔一段时间对开发团队的现有代码进行一次集成测试。如某些自动化集成测试工具能实现每日深夜对开发团队的现有代码进行一次集成测试,然后将测试结果发到各开发人员的电子邮箱中。该集成测试方法频繁地将新代码加入到一个已经稳定的基线中,以免集成故障难以发现,同时控制可能出现的基线偏差。使用高频集成测试需要具备一定的条件: 可以持续获得一个稳定的增量,并且该增量内部已被验证没有问题; 大部分有意义的功能增加可以在一个相对稳定的时间间隔(如每个工作日)内获得; 测试包和代码的开发工作必须是并行进行的,并且需要版本控制工具来保证始终维护的是测试脚本和代码的最新版本; 必须借助于使用自动化工具来完成。高频集成一个显著的特点就是集成次数频繁,显然,人工的方法是不胜任的。

    高频集成测试一般采用如下步骤来完成:

    步骤一: 选择集成测试自动化工具。如很多Java项目采用Junit+Ant方案来实现集成测试的自动化,也有一些商业集成测试工具可供选择。

    步骤二: 设置版本控制工具,以确保集成测试自动化工具所获得的版本是最新版本。如使用CVS进行版本控制。

    步骤三: 测试人员和开发人员负责编写对应程序代码的测试脚本。

    步骤四: 设置自动化集成测试工具,每隔一段时间对配置管理库的新添加的代码进行自动化的集成测试,并将测试报告汇报给开发人员和测试人员。

          步骤五: 测试人员监督代码开发人员及时关闭不合格项。

          按照步骤三至步骤五不断循环,直至形成最终软件产品。

          方案点评: 该测试方案能在开发过程中及时发现代码错误,能直观地看到开发团队的有效工程进度。在此方案中,开发维护源代码与开发维护软件测试包被赋予了同等的重要性,这对有效防止错误、及时纠正错误都很有帮助。该方案的缺点在于测试包有时候可能不能暴露深层次的编码错误和图形界面错误。

          以上我们介绍了几种常见的集成测试方案,一般来讲,在现代复杂软件项目集成测试过程中,通常采用核心系统先行集成测试和高频集成测试相结合的方式进行,自底向上的集成测试方案在采用传统瀑布式开发模式的软件项目集成过程中较为常见。读者应该结合项目的实际工程环境及各测试方案适用的范围进行合理的选型。

  • 集成与构建指南(一)

    2009-06-02 15:12:44

    胡协刚

    中国软件架构师网 首席软件架构师

    szjinco@public.szptt.net.cn

     

    1.概述

    软件开发的目标是得到满足需求的可运行的交付工件,即通常是得到由源码等中间工件编译、链接并集成而生成的一个建造(build)。然而构建集成却是一项看似简单实际上充满了陷阱的工作,特别是在团队开发的场景下,将牵涉到将不同成员开发的源码等集成一体,解决各类冲突与依赖等复杂情况,这个过程还直接依赖于软件配置管理流程的支持。一个合格的集成员需要掌握多项知识和技能,本文档将帮助集成员等相关角色理解一个完整的构建集成过程,引导他们迅速地掌握本项目的构建工作。

    本文档主要内容包括:

    ²        描述如何创建满足项目集成与构建活动的工作环境

    ²        简要介绍构建工具的相关知识

    ²        描述实施—单元测试—提交—集成—冒烟测试的基本流程

    ²        深入说明自动化持续集成的流程

    ²        提供对第三方开发包、项目构件等的源码结构组织和集成的指南

     

    2.术语说明

    Ÿ         冒烟测试

    用于快速验证一个系统集成的工作版本被成功地构建的一组测试。它们必须是低成本的测试(比如自动化的测试),目标是保证一个相对稳定的、值得展开后续重量级测试的工作版本被发布给测试员使用。

    Ÿ         持续集成

    是对日构建的进一步扩展。在专门工具的支持下,通过实施自动化的构建、测试,使得项目的源码可以在专用构建机上持续地进行集成构建与测试,即在既定周期(可以短到30秒)中,新提交的源码将被自动地集成,相关人员随即获得编译和测试结果。

     

    3.角色与职责

    参与构建集成过程的角色如下:

     

    角色

    相关职责描述

    备注

    集成员

    Ÿ           制定集成与构建计划

    Ÿ           编制集成的自动化构建脚本

    Ÿ           指导或帮助实施员编制私有构件的自动化构建脚本

    Ÿ           执行集成,解决编译与链接冲突,调试构建脚本等

    Ÿ           建立工作基线

     

    实施员

    Ÿ           编制私有构件面向集成的自动化构建脚本

    Ÿ           提交构件源码等中间工件(delivery

    Ÿ           重设开发基线(rebase

     

    配置管理员

    Ÿ           配置集成用工作视图(view

    Ÿ           分配存取权限

     

    环境工程师

    Ÿ           制定项目组的开发环境配置方案

    Ÿ           建立项目的开发、集成与测试软件环境

    Ÿ           解决软件开发环境和工具使用中出现的问题

     

     

    4.集成环境

    为了将源码等中间工件编译、链接生成的一个建造(build),必须使用相应的编译工具;而实现构建的自动化,则需要类似make等构建工具的支持;实施持续集成还依赖CruiseControl这类专门工具;另外由于集成通常在团队协同的环境下开展,软件配置管理工具将在此间充当重要角色

    推荐的安装顺序是:克隆主机—安装配置管理工具客户端建立用户视图准备用户私有构建场所配置编译环境—配置构建环境—执行初次构建

    4.1集成网络部署

     

    4.2编译环境

    4.2.1msvc6

    本项目的首要IDE用的是MS Visual Studio 98,编译器相应的用msvc6

    项目中使用了msvc6的基础库和mfc库的全集(包括unicode部件,在安装时注意要使用定制方式来选择)。

    为了正常使用msvc6,注意正确设置相应的Path等环境变量,虽然安装程序能自动设置它们,但通过克隆的机器可能丢失。

    环境变量示例:

    Path=C:\WINNT\system32;C:\WINNT;C:\Development_Tools\Building-Utils\apache-ant-1.6.0\bin;C:\Development_Tools\Microsoft Visual Studio\Common\Tools\WinNT;C:\Development_Tools\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Development_Tools\Microsoft Visual Studio\Common\Tools;C:\Development_Tools\Microsoft Visual Studio\VC98\bin; C:\Development_Tools\Microsoft Visual Studio\Common\MSDev98\bin

    另外可以直接运行下列批命令来自动设置(仅对克隆的机器有效):

    D:\Development_Home\Tools.Configs\path.bat

    4.2.2bcc55

    为了支持第三方使用Borland IDE,需要配置Bcc55编译器。

    4.3构建工具

    常见的构建工具,C/C++MakeBjamcpptasks for AntJavaAntC#NAnt。考虑到Ant具备使用方便、功能全面、XML格式可读性强、容易掌握等优点,本项目选用Ant作为首要的构建工具。

    典型构建工具环境的配置为:

    jsdk1.4.x——Java运行环境

    apache-ant-1.6.0——Ant工具

    安装路径示例:

    C:\Development_Tools\Building-Utils\apache-ant-1.6.0

    cpptasks1.0beta——支持Ant进行 C/C++构建的扩展

    安装路径示例:

    C:\Development_Tools\Building-Utils\apache-ant-1.6.0\lib\ cpptasks.jar

    ant-contrib-0.6——支持Ant使用控制逻辑的扩展

    安装路径示例:

    C:\Development_Tools\Building-Utils\apache-ant-1.6.0\lib\ ant-contrib-0.6.jar

    envset——项目组自行开发的一个WinNT环境变量设置小程序

    安装路径示例:

    C:\Development_Tools\Building-Utils\apache-ant-1.6.0\bin\ envset.exe

    注意:

    为了支持cpptasks ant-contrib的使用,必须在Ant构建脚本中加入以下声明:

           <!-- task and type extension -->

           <taskdef resource="cpptasks.tasks"/>

           <typedef resource="cpptasks.types"/>

           <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

    4.4持续集成工具

    主流的持续集成工具有CruiseControl,提供了Javadot.net两个版本。我们通过对Java版本进行相应配置,实现了C/C++项目的持续集成。

    在集成服务器上的安装路径示例:

    C:\Development_Tools\Building-Utils\cruisecontrol-2.1.5

    为了支持C/C++项目,需要加入cpptasksant-contrib,可以通过修改CruiseControl.bat文件来实现,示例如下:

    set EXTLIBDIR=%ANT_HOME%\lib

    %EXTLIBDIR%\ant-contrib-0.6.jar;%EXTLIBDIR%\cpptasks.jar;

    4.5软件配置管理客户端

    本项目选用ClearCase作为软件配置管理的工具。开发工作站、测试工作站和集成服务器都将安装ClearCase客户端,其安装配置参见其它ClearCase相关文档。

    视图路径示例:

    D:\Shared_Views\PCHL_V1_Dev

    4.6用户私有构建场所

    各构建主机上需要创建类似D:\Development_Home\的目录,作为工作用户私有的开发场所,开发人员可以将\PCHL_Supports\Environments\Development\ Development_Home.zip(可以从ClearCasePCHL_Working流下找到)解压直接生成此目录集,其中D:\Development_Home\Building.Workspace子目录将用于自动构建。Development_Home.zip包内还包含CruiseControl持续集成的相关配置文件。

    4.7主机克隆

    为了提高工作效率,项目组的开发工作站可以通过克隆的方式进行快速安装。环境工程师针对项目组日常开发、管理、协同等工作需要,制作了完整的系统盘(C主分区)映像,包括开发工具、CASE工具、其它常用工具等,上述构建用工具软件均包含在内。

    映像有Windows2000ProfessionalWindows2000Server两个版本,源路径示例:

    \\back1-svr\ghost_imgs\w2ksrv_x\w2ksrv.GHO

    使用者可以用支持网络连接的引导CD启动系统,执行ghost,然后进行克隆。

     

  • 集成测试过程-2

    2009-05-19 11:31:00

    根据IEEE标准 集成测试划分为4个阶段:计划阶段,设计阶段,实现阶段,执行阶段(实施阶段)
    计划阶段
    1)时间安排       概要设计完成评审后大约一个星期
    2)输入           需求规格说明书 概要设计文档  产品开发计划路标
    3)入口条件       概要设计文档已经通过评审
    4)活动步骤      1.定被测试对象和测试范围 2.评估集成测试被测试对象的数量及难度,即工作量 3.确定角色分工和作任务4.标识出测试各阶段的时间,任务,约束等条件5.考虑一定的风险分析及应急计划6.考虑和准备集成测试需要的测试工具,测试仪器,环境等资源7.考虑外部技术支援的力度和深度,以及相关培训安排8.定义测试完成标准
    5)输出           集成测试计划
    6)出口条件       集成测试计划通过概要设计阶段基线评审

    设计阶段
    1)时间安排 详细设计阶段开始
    2)输入  需求规格说明书  概要设计  集成测试计划
    3)入口条件  概要设计基线通过评审
    4)活动步骤  1.被测对象结构分析 2.集成测试模块分析3.集成测试接口分析4.集成测试策略分析
       5.集成测试工具分析6.集成测试环境分析7.集成测试工作量估计和安排。
    5)输出  集成测试设计(方案)
    6.出口条件  集成测试设计通过详细设计基线评审。

    实现阶段
    1)时间安排 在编码阶段开始后进行
    2)输入 需求规格说明书  概要设计  集成测试计划 集成测试设计
    3)入口条件 详细设计阶段
    4)活动步骤  集成测试用例设计 集成测试程设计 集成测试代码设计(如果需要)  集成测试脚本(如果需要)  集成测试工具(如果需要)
    5)输出  集成测试用例 集成测试规程 集成测试代码 集成测试脚本 集成测试工具
    6)出口条件  测试用例和测试规程通过编码阶段基线评审

    执行阶段
    1)时间安排 单元测试已经完成后就可以开始执行集成测试了
    2)输入     需求规格说明书 概要设计  集成测试计划  集成高度设计  集成测试例 集成测试规程  集成测试代码(如果有)  集成测试脚本 集成测试工具 详细设计  代码  单元测试报告  
    3)入口条件 单元测试阶段已经通过基线化评审
    4)活动步 骤 执行集成测试用例 回归集成测试用例  撰写集成测试报告  
    5)输出  集成测试报告
    6)出口条件  集成测试报告通过集成测试阶段基线评审
  • 集成测试过程

    2009-05-19 10:07:47

    目的:
        ●  按照项目定义的测试过程进行测试。由独立于软件开发者的测试组制定测试计划和测试用例,提交测试报告。
    角色与职责:
        ●  项目软件经理(开发负责人):负责审批测试计划;评审测试用例;将欲测试的内容集成到测试环境。
        ●  测试人员:负责完成测试用例设计、集成测试环境搭建、执行集成测试、验证问题、撰写测试报告。
        ●  开发人员:负责及时修复测试出的问题。
    进入准则: 
        ●  项目已启动。
        ●  需求文档已通过评审
    输入:
        ●  需求文档
    
    结束准则:
        ●  通过集成测试。
    输出: 
        ●  已通过集成测试的代码及软件
        ●  测试用例
        ●  问题记录
        ●  测试报告
    主要活动:
    1  测试人员在项目启动后编制测试计划,其中可包括集成测试计划,在集成测试时进行细化或变更。测试计划应经过相关人
       员(项目经理、SQA、需求人员等)评审。集成测试分为单元(也叫组装)集成测试和系统集成测试两个阶段。
       
    2  单元(组装)集成测试(与开发同步进行,指对开发出的程序单元集成到系统中进行的测试):
        ●  测试人员依照测试计划进行测试设计,编写测试用例和测试脚本(可选)。测试设计的结果要经过评审。
        ●  测试人员在开发负责人协助下搭建独立的测试环境(该环境能够运行代码程序)。
        ●  开发负责人将已通过单元测试的程序单元提交集成到测试环境中。
        ●  测试人员执行单元集成测试,测试出的问题登记到项目BUG库中,见《开发项目缺陷库使用说明》。
        ●  开发人员根据项目BUG库中的登记,及时修复程序问题。非最终状态问题的每种状态存活周期不超过5个工作日。
        ●  测试人员验证问题。
        ●  测试人员按照项目测试计划,分阶段出具《测试周报》。
        ●  重复上面1-7步直到子系统模块单元全部通过《测试计划》中定义的单元集成测试通过标准。
        单元(组装)集成测试通过标准:
            ◇ 相关测试用例执行完毕。
            ◇ 单元(组装)集成测试发现的严重问题(一二级)90%得到正确修改;一般问题(三级)70%得到修改。
            
    3 系统集成测试(指对已编译的Build进行的测试):
        ●  测试人员依照测试计划进行测试设计,编写测试用例和测试脚本(可选)。测试设计的结果要经过评审。
        ●  测试人员在开发负责人协助下搭建独立的测试环境。
        ●  开发负责人依照计划将已经过编译构建的Build提交集成到测试环境中。
        ●  测试人员执行系统集成测试,测试出的问题登记到项目BUG库中,见《开发项目缺陷库使用说明》。
        ●  开发人员根据项目BUG库中的登记,及时修复程序问题。非最终状态问题的每种状态存活周期不超过5个工作日。
        ●  测试人员验证问题。
        ●  测试人员按照项目测试计划,分阶段出具《Build测试报告》。
        ●  重复上面1-7步直到子系统模块单元全部通过《测试计划》中定义的系统集成测试通过标准。
        系统集成测试通过标准:
            ◇ 所有测试用例执行完毕。
            ◇ 系统集成测试发现的严重问题(一二级)90%得到正确修改;一般问题(三级)70%得到修改。
            ◇ 问题库中的问题都为最终状态(最后一个Build的问题除外)。
            
    4 测试人员分析总结集成测试活动,编制《集成测试报告》。
    
    5 测试人员填写《需求列表》中的需求覆盖表,以便于跟踪和验证。
    过程裁剪说明:
    ◆ 已配备了专职测试人员的项目需按该过程执行。
    ◆ 未在公司立项的项目集成测试可参照该过程执行
    
  • 集成测试计划怎么写

    2009-05-18 11:30:04

    可以思考以下内容并用集成测试计划的模板写下来:

    1、确定集成测试对象

    2、确定集成测试策略

    3、确定集成测试验收标准

    4、确定集成测试挂起和恢复条件

    5、估计集成测试工作量

    6、估计集成测试所需资源

    7、进行集成测试任务划分(包括任务名、责任人、 输入和输出、风险及应对措施、进度安排等)

    集成测试过程

    根据IEEE标准 集成测试划分为4个阶段:计划阶段,设计阶段,实现阶段,执行阶段(实施阶段)

    计划阶段 

    1)时间安排 概要设计完成评审后大约一个星期

    2)输入 需求规格说明书 概要设计文档 产品开发计划路标

    3)入口条件 概要设计文档已经通过评审

    4)活动步骤 1.定被测试对象和测试范围 2.评估集成测试被测试对象的数量及难度,即工作量 3.确定角色分工和作任务4.标识出测试各阶段的时间,任务,约束等条件5.考虑一定的风险分析及应急计划6.考虑和准备集成测试需要的测试工具,测试仪器,环境等资源7.考虑外部技术支援的力度和深度,以及相关培训安排8.定义测试完成标准

    5)输出 集成测试计划

    6)出口条件 集成测试计划通过概要设计阶段基线评审

    设计阶段

    1)时间安排 详细设计阶段开始

    2)输入 需求规格说明书 概要设计 集成测试计划

    3)入口条件 概要设计基线通过评审

    4)活动步骤 1.被测对象结构分析 2.集成测试模块分析3.集成测试接口分析4.集成测试策略分析

    5.集成测试工具分析6.集成测试环境分析7.集成测试工作量估计和安排。

    5)输出 集成测试设计(方案)

    6)出口条件 集成测试设计通过详细设计基线评审。

    实现阶段

    1)时间安排 在编码阶段开始后进行

    2)输入 需求规格说明书 概要设计 集成测试计划 集成测试设计

    3)入口条件 详细设计阶段

    4)活动步骤 集成测试用例设计 集成测试程设计 集成测试代码设计(如果需要) 集成测试脚本(如果需要) 集成测试工具(如果需要)

    5)输出 集成测试用例 集成测试规程 集成测试代码 集成测试脚本 集成测试工具

    6)出口条件 测试用例和测试规程通过编码阶段基线评审

    执行阶段

    1)时间安排 单元测试已经完成后就可以开始执行集成测试了

    2)输入 需求规格说明书 概要设计 集成测试计划 集成高度设计 集成测试例 集成测试规程 集成测试代码(如果有) 集成测试脚本 集成测试工具 详细设计 代码 单元测试报告

    3)入口条件 单元测试阶段已经通过基线化评审

    4)活动步 骤 执行集成测试用例 回归集成测试用例 撰写集成测试报告 

    5)输出 集成测试报告

    6)出口条件 集成测试报告通过集成测试阶段基线评审 

     

  • 软件集成测试思路

    2009-05-18 10:25:28

        对于集成测试,初学者往往比较模糊,到底怎么测?是不是把两个模块连在一起,然后采用单元测试的技术,测试这个更大的模块?

      我们都知道,集成测试关注的是模块之间的接口。那么可以将“接口”作为切入点。纵观模块之间的接口,我们可以归纳为以下几种类型,下面一一介绍一下。

      1、通信协议:两个模块之间通信采用的是标准的或者自定义的(网络)协议;
      协议中即包含数据部分,又包含控制部分;有些实现将数据与控制分离,如FTP;而大部分实现将数据与控制通过一条链路来传递,往往通过不同的消息包进行分离。

      2、调用关系:模块A调用模块B,实际上是由模块A向模块B发出了一条控制指令,这里数据传递体现的不是很明显,往往体现为参数与返回值,它们可以认为是控制的副本。

      3、文件、数据库、队列、第三方中间件等:表现的主要是数据的传递,其中的控制体现的不明显。

      4、共享资源:比如共享一段“存储区域”,其中涉及的关键资源主要是“锁”了;这样的两个模块在运行时往往分布到不同的进程或者线程中,表现为对资源的竞争,以及数据的共享。

      5、同步:一个模块的运行需要另外一个模块的触发,双方往往存在“信号”等通知机制,也可以理解为一种特殊的控制方式。

      OK,现在切入点有了,我们可以将被测系统归类(以上的分类),找出其中的数据接口与控制接口。

      接下来的做法与一般的测试思路没有什么不同。
      首先,将数据接口与控制接口分解——需要传递哪些数据?存在哪些控制指令?
      然后,找出数据与指令中的变数所在;如数据(协议包)中的字段的取值,指令的参数变化等;
      接下来,将变数划分等价类,找出每类的代表,就是我们的测试数据了——我们的目标是:让每类数据流与控制流均通过接口一次,从而实现接口测试的完全性;
      最后,就是考虑如何生成这些测试数据了。往往需要对应到集成后“大模块”的输入与输出。

      谈了很多,上面的内容更多的关注了实现。下面我们要考虑另外一个侧面——业务。
      模块之间的联系(接口)往往是为了体现业务上的关联。大家都知道,关联本身也是有很多属性的。如关联点(每个模块)都存在一个角色,关联有多重性(multiplicity)——即模块A在运行时可能对应多个模块B的实例。

      我们找到了测试的另外一个切入点,模块的集成能否准确体现业务上的关联?各个模块是否具备其角色的全部属性和接口,模块之间的关联关系如何打破?关联的多重性是否有效?

      当然,集成测试不会太关心业务或者需求,那是系统测试的事了。但此时想想,往往能够得到意外的收获。

    太多的关注功能,往往忽略其他。有时我们不得不考虑接口的性能,尤其对于系统关键接口。接口的性能测试越早进行越好。如果等到系统测试时做,可能接口外面封装了太多的代码,影响性能问题的精确定位。

    集成测试单元测试的逻辑扩展。它的最简单的形式是:两个已经测试通过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部门,方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。此外,如果程序由多个进程组成,应该成对测试它们,而不是同时测试所有进程。

    集成测试识别组合单元时出现的问题。通过使用要求在组合单元钱测试每个单元并确保每个单元的生存能力的测试计划,可以知道在组合单元时所发现的任何错误很可能与单元之间的接口有关。这种方法将可能发生的情况数量减少到更简单的分析级别。

    可以以多种方式进行集成测试,而下面是三种常见的类别:

    由上而下的集成测试方法要求首先测试和集成最高级别的模块。这种高级别的逻辑和数据流可以在过程的早期阶段测试。有助于最大限度地减少对驱动程序的需求。但是,对存根(stub)的需求使测试管理变得复杂,低级别的使用工具在开发周期中相对较晚的阶段测试。由上而下的集成测试的另一个缺点是必能很好的支持有限功能的早期发布。

    由下而上的方法要求首先测试和集成最低级别的单元。这些单元常被称为使用工具模块。通过使用这种方法,使用工具模块在开发过程的早期阶段测试,最大限度第减少了对存根(stub)的需求。但是,不利的方面是对却动程序的需求使测试管理变得复杂,高级别的逻辑和数据流在晚期测试。与由上而下的方法一样,有下而上的方法也不能很好地支持有限功能的早期开发。

    第三种方法(有时也称为伞状方法)要求测试沿功能性测试和控制流路径进行。首先,函数的输入以上面的讨论的由下而上的模式集成。然后,每个函数的输入以由上而下的方式集成。这种方法的主要优点是对有限公能的早期发布的支持程度。它也有助于最大限度地减少对存根(stub)和驱动程序的需求。但是,这种方法的潜在缺点非常明显,因为它的系统性可能比其他两种方法,会导致对回归测试的更大需求。

  • 集成测试计划书

    2009-05-15 16:36:39

    集成测试计划书
     
    作者:不详    文章来源:网络
     
     1引言

    1.1编写目的

    本文是描述****集成测试的大纲文章,主要描述如何进行集成测试活动?如何控制集成测试活动?集成测试活动的流程以及集成测试活动的工作安排。本文主要的读者对象是项目负责人,集成部门经理,集成测试设计师。

    1.2背景

    项目名称:***集成测试

    项目相关对象:******************

    1.3定义

    **********:********************

    1.4参考资料

    《*********》

    2测试项目

    本测试主要为***系统的集成测试,目前***的版本为2.0,测试是***的最终集成测试,是建立在开发组程序员开发完毕自己的测试以及开发组测试的基础之上

    3 被测特性

    3.1操作性测试

    主要测试操作是否正确,有无误差?分为两部分:

    3.1.1返回测试

    由主界面逐级进入最终界面,按EXIT键逐级返回,检查返回时候屏幕聚焦是否正确

    比如:

    1. 进入“系统设置”

    2. 进入“频道搜索”

    3. 进入“自动频道搜索”

    4. 按EXIT键返回,检查当前聚焦是否为“频道搜索”

    5. 按EXIT键返回,检查当前聚焦是否为“系统设置”

    3.1.2进入测试

    由主界面逐级进入最终界面,按MENU键返回主界面,再次进入,检查是否聚焦正确

    比如:

    1. 进入“系统设置”

    2. 进入“频道搜索”

    3. 进入“自动频道搜索”

    4. 按MENU键返回主界面

    5. 当前聚焦是否为“系统设置”

    6. 进入“系统设置”,当前聚焦是否为“频道搜索”

    3.2功能测试

    测试机顶盒中每个应用的功能是否正确

    3.3性能测试

    3.3.1疲劳性测试

    测试连续开机1个月不关机器,每3天去运行一次应用。看系统的稳定性

    3.3.2大容量数据测试

    前段***数据库表中含有大量数据,测试***功能

    4 不被测特性

    5 测试方法

    1. 书写测试计划

    2. 审核测试计划,未通过返回第一步

    3. 书写测试用例;

    4. 审核测试用例,未通过返回第三步

    5. 测试人员按照测试用例逐项进行测试活动,并且将测试结果填写在测试报告上;(测试报告必须覆盖所有测试用例)

    6. 测试过程中发现bug,将bug填写在bugzilla上发给集成部经理;(bug状态NEW)

    7. 集成部经理接到bugzilla发过来的bug

    7.1 对于明显的并且可以立刻解决的bug,将bug发给开发人员;(bug状态ASSIGNED);

    7.2 对于不是bug的提交,集成部经理通知测试设计人员和测试人员,对相应文档进行修改; (bug状态RESOLVED,决定设置为INVALID);

    7.3 对于目前无法修改的,将这个bug放到下一轮次进行修改;(bug状态RESOLVED,决定设置为REMIND)

    8. 开发人员接到发过来的bug立刻修改;(bug状态RESOLVED,决定设置为FIXED)

    9. 测试人员接到bugzilla发过来的错误更改信息,应该逐项复测,填写新的测试报告(测试报告必须覆盖上一次中所有REOPENED的测试用例);

    10. 如果复测有问题返回第六步(bug状态REOPENED)

    11. 否则关闭这项BUG(bug状态CLOSED)

    12. 本轮测试中测试用例中有95%一次性通过测试,结束测试任务;

    13. 本轮测试中发现的错误有98%经过修改并且通过再次测试(即bug状态CLOSED),返回第五步进行新的一轮测试;

    14. 测试任务结束后书写测试总结报告;

    15. 正规测试结束进入非正规测试,首先是ALPHA测试,请公司里其他非技术人员以用户角色使用系统。发现bug通知测试人员,测试人员以正规流程处理bug事件;

    16. 然后是BETA测试,请用户代表进行测试。发现bug通知测试人员,测试人员以正规流程处理bug事件。

    几点说明:

    • 测试回归计划为三次;
    • 测试用例应该写得比较详尽,步骤一定要标明清楚(应该包括:编号,测试描述,前置条件,测试步骤以及测试希望结果);
    • 对于测试人员觉得应该进行的测试项目,测试人员应该报告测试设计人员,完善和健全测试用例;
    • 测试报告与测试用例分开,测试报告标明测试用例序号以及是否通过Y/N;
    • 对于集成部经理无法决定的上交项目负责人决定;
    • 性能测试中的疲劳性测试可以结合在功能测试部分,即测试期间不关闭机器;
    • 性能测试中的大容量数据测试放在测试后部分轮次(第二步,只需要进行一次)

    6 测试通过标准

    测试结果与测试用例中期望的结果一致,测试通过,否则标明测试未通过。

    6.1测试结果审批过程

    6.1.1测试回归申请结束

    测试人员提出申请这轮测试结束,提交集成部经理;

    集成部经理召集本组人员开会讨论;

    讨论通过,进行下一轮测试,并且部署下一轮测试的注意事项,流程等内容;

    如果发现这轮测试目前还存在问题没有解决,延期下一轮测试时间,讨论下一步工作应该如何进行。

    6.1.2测试结果申请结束

    测试人员提出申请测试结束,提交集成部经理;

    集成部经理召集本组人员开会讨论;

    1. 讨论通过,结束测试任务;

    2. 如果发现目前测试还存在问题没有解决,延期测试结束时间,并且讨论下一步工作应该如何进行。

    7 测试挂起和恢复条件

    7.1挂起条件

    • 进入第一轮测试,测试人员大体了解一下产品情况,如果在一小时之内发现5个以上(含5个)操作性错误,或者3个以上(含3个)功能性错误,退回测试组测试;
    • 遇到有项目优先级更高的集成测试任务;
    • 遇到有项目优先级更高的集成任务;
    • 在测试复测过程中发现产品无法运行下去;
    • 人员,设备不足。

    7.2恢复条件

    • 符合进入集成测试条件(一小时之内发现5个以下(不含5个)操作性错误,或者3个以下(不含3个)功能性错误);
    • 项目优先级更高的集成测试任务暂告完成;
    • 项目优先级更高的集成任务暂告完成;
    • 复测过程中产品可以运行下去;
    • 人员,设备到位。

    8应提供的测试文件

    • 测试计划书
    • 测试用例
    • 测试报告
    • 测试总结

    9测试任务

    • 制定审核测试计划
    • 制定和审核测试用例
    • 进行测试活动
    • 书写测试报告

    10测试环境需求

    10.1硬件需求

    ***********

    10.2软件需求

    ************

    10.3测试工具

    *************

    10.4测试需要的条件

    **************

    10.4.1需要的文档

    • 用户手册
    • 应用手册
    • 安装说明

    10.4.2需要完成的任务

    • 程序员本人测试
    • 测试组完成测试

    11角色和职责

    • 集成(测试)经理:控制并完成测试任务和测试过程,决定测试人员提交上来的bug是否需要修改;
    • 测试设计人员:书写集成测试用例;
    • 测试人员:按照测试用例进行测试活动;
    • 开发人员:MHP程序bug修改;
    • 用户代表:进行BETA测试。

    12 人员和培训

    • 集成测试经理有责任对测试相关人员进行测试流程,规章制度培训;
    • 测试设计人员有责任对测试人员进行测试操作培训

    13 测试进度

    测试工作 进度(人*工作日)
    测试计划 8
    测试设计 60
    测试执行总共进度 30
    每次回归进度 10
    测试报告

    14风险及应急计划

    设备不到位:加紧设备购买;

    人员不到位

    人员请假:请假人员回来加班或赶紧测试进度/申请调配新的人员;

    人员离职:调配新的人员;

    人员调配到其他部门或项目:调配新的人员;

    开发人员开发频频出错:通知开发部门,商量策略;

    其他原因的测试工作频频被挂起或者挂起后迟迟恢复不了:加班或延期

    15审批

    集成部经理 技术部经理

    姓名: 姓名:

    日期: 日期:

     
  • 集成测试的组成及流程

    2009-05-14 16:04:00

    集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层  意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,  将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。此外,如果程序由多个进程组成,应该成对测试它们,而不是同时测试所有进程。

      集成测试识别组合单元时出现的问题。通过使用要求在组合单元前测试每个单元并确保每个单元的生存能力的测试计划,可以知道在组合单元时所发现的任何错误很可能与单元之间的接口有关。这种方法将可能发生的情况数量减少到更简单的分析级别。

      集成测试是在单元测试的基础上,测试在将所有的软件单元按照概要设计规格说明的要求组装成模块、子系统或系统的过程中各部分工作是否达到或实现相应技术指  标及要求的活动。也就是说,在集成测试之前,单元测试应该已经完成,集成测试中所使用的对象应该是已经经过单元测试的软件单元。这一点很重要,因为如果不  经过单元测试,那么集成测试的效果将会受到很大影响,并且会大幅增加软件单元代码纠错的代价。

      集成测试是单元测试的逻辑扩展。在现实方案中,集成是指多个单元的聚合,许多单元组合成模块,而这些模块又聚合成程序的更大部分,如分系统或系统。集成测  试采用的方法是测试软件单元的组合能否正常工作,以及与其他组的模块能否集成起来工作。最后,还要测试构成系统的所有模块组合能否正常工作。集成测试所持  的主要标准是《软件概要设计规格说明》,任何不符合该说明的程序模块行为都应该加以记载并上报。
     

            
      

      所有的软件项目都不能摆脱系统集成这个阶段。不管采用什么开发模式,具体的开发工作总得从一个一个的软件单元做起,软件单元只有经过集成才能形成一个有机的整体。具体的集成过程可能是显性的也可能是隐性的。只要有集成,总是会出现一些常见问题,工程实践中,几乎不存在软件单元组装过程中不出任何问题的情况。从图1可以看出,集成测试需要花费的时间远远超过单元测试,直接从单元测试过渡到系统测试是极不妥当的做法。

      集成测试的必要性还在于一些模块虽然能够单独地工作,但并不能保证连接起来也能正常工作。程序在某些局部反映不出来的问题,有可能在全局上会暴露出来,影响功能的实现。此外,在某些开发模式中,如迭代式开发,设计和实现是迭代进行的。在这种情况下,集成测试的意义还在于它能间接地验证概要设计是否具有可行性。

      集成测试的目的是确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。它所测试的内容包括单元间的接口以及集成后的功能。使用黑盒测试方法测试集成的功能。并且对以前的集成进行回归测试。

        一、集成测试过程         

          二、单元测试工作内容及其流程

          

        三、集成测试需求获取

      集成测试需求所确定的是对某一集成工作版本的测试的内容,即测试的具体对象。集成测试需求主要来源于设计模型(Design  Model)和集成构件计划(Integration Build  Plan)。集成测试着重于集成版本的外部接口的行为。因此,测试需求须具有可观测、可测评性。

        1. 集成工作版本应分析其类协作与消息序列,从而找出该工作版本的外部接口。

        2. 由集成工作版本的外部接口确定集成测试用例。

        3. 测试用例应覆盖工作版本每一外部接口的所有消息流序列。

      注意:一个外部接口和测试用例的关系是多对多,部分集成工作版本的测试需求可映射到系统测试需求,因此对这些集成测试用例可采用重用系统测试用例技术。

        四、集成测试工作机制

      软件集成测试工作由产品评测部担任。需要项目组相关角色配合完成。如图示:

      软件评测部:

              

      软件项目组:

              

      集成测试工作内容及其流程工作流程:

              
    五、集成测试产生的工件清单

        1、软件集成测试计划    

        2、集成测试用例     

        3、测试过程     

        4、测试脚本     

        5、测试日志     

        6、测试评估摘要

        六、集成测试常用方案选型

      集成测试的实施方案有很多种,如自底向上集成测试、自顶向下集成测试、Big-Bang集成测试、三明治集成测试、核心集成测试、分层集成测试、基于使用的集成测试等。在此,笔者将重点讨论其中一些经实践检验和一些证实有效的集成测试方案。

              

      ·自底向上集成测试

      自底向上的集成(Bottom-Up  Integration)方式是最常使用的方法。其他集成方法都或多或少地继承、吸收了这种集成方式的思想。自底向上集成方式从程序模块结构中最底层的模  块开始组装和测试。因为模块是自底向上进行组装的,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)事前已经完成组装并经过测试,所以不再需要编制桩模块(一种能模拟真实模块,给待测模块提供调用接口或数据的测试用软件模块)。自底向上集成测试的步骤大致如下:

      步骤一:  按照概要设计规格说明,明确有哪些被测模块。在熟悉被测模块性质的基础上对被测模块进行分层,在同一层次上的测试可以并行进行,然后排出测试活动的先后关  系,制定测试进度计划。图2给出了自底向上的集成测试过程中各测试活动的拓扑关系。利用图论的相关知识,可以排出各活动之间的时间序列关系,处于同一层次的测试活动可以同时进行,而不会相互影响。

      步骤二:  在步骤一的基础上,按时间线序关系,将软件单元集成为模块,并测试在集成过程中出现的问题。这里,可能需要测试人员开发一些驱动模块来驱动集成活动中形成的被测模块。对于比较大的模块,可以先将其中的某几个软件单元集成为子模块,然后再集成为一个较大的模块。

      步骤三: 将各软件模块集成为子系统(或分系统)。检测各自子系统是否能正常工作。同样,可能需要测试人员开发少量的驱动模块来驱动被测子系统。

      步骤四: 将各子系统集成为最终用户系统,测试是否存在各分系统能否在最终用户系统中正常工作。

      方案点评: 自底向上的集成测试方案是工程实践中最常用的测试方法。相关技术也较为成熟。它的优点很明显:  管理方便、测试人员能较好地锁定软件故障所在位置。但它对于某些开发模式不适用,如使用XP开发方法,它会要求测试人员在全部软件单元实现之前完成核心软  件部件的集成测试。尽管如此,自底向上的集成测试方法仍不失为一个可供参考的集成测试方案。

      ·核心系统先行集成测试

      核心系统先行集成测试法的思想是先对核心软件部件进行集成测试,在测试通过的基础上再按各外围软件部件的重要程度逐个集成到核心系统中。每次加入一个外围软件部件都产生一个产品基线,直至最后形成稳定的软件产品。核心系统先行集成测试法对应的集成过程是一个逐渐趋于闭合的螺旋形曲线,代表产品逐步定型的过程。其步骤如下:

      步骤一: 对核心系统中的每个模块进行单独的、充分的测试,必要时使用驱动模块和桩模块;

      步骤二: 对于核心系统中的所有模块一次性集合到被测系统中,解决集成中出现的各类问题。在核心系统规模相对较大的情况下,也可以按照自底向上的步骤,集成核心系统的各组成模块。

      步骤三: 按照各外围软件部件的重要程度以及模块间的相互制约关系,拟定外围软件部件集成到核心系统中的顺序方案。方案经评审以后,即可进行外围软件部件的集成。

      步骤四: 在外围软件部件添加到核心系统以前,外围软件部件应先完成内部的模块级集成测试。

      步骤五: 按顺序不断加入外围软件部件,排除外围软件部件集成中出现的问题,形成最终的用户系统。

      方案点评: 该集成测试方法对于快速软件开发很有效果,适合较复杂系统的集成测试,能保证一些重要的功能和服务的实现。缺点是采用此法的系统一般应能明确区分核心软件部件和外围软件部件,核心软件部件应具有较高的耦合度,外围软件部件内部也应具有较高的耦合度,但各外围软件部件之间应具有较低的耦合度。

      ·高频集成测试

      高频集成测试是指同步于软件开发过程,每隔一段时间对开发团队的现有代码进行一次集成测试。如某些自动化集成测试工具能实现每日深夜对开发团队的现有代码  进行一次集成测试,然后将测试结果发到各开发人员的电子邮箱中。该集成测试方法频繁地将新代码加入到一个已经稳定的基线中,以免集成故障难以发现,同时控  制可能出现的基线偏差。使用高频集成测试需要具备一定的条件: 可以持续获得一个稳定的增量,并且该增量内部已被验证没有问题;  大部分有意义的功能增加可以在一个相对稳定的时间间隔(如每个工作日)内获得;  测试包和代码的开发工作必须是并行进行的,并且需要版本控制工具来保证始终维护的是测试脚本和代码的最新版本;  必须借助于使用自动化工具来完成。高频集成一个显著的特点就是集成次数频繁,显然,人工的方法是不胜任的。

    高频集成测试一般采用如下步骤来完成:

      步骤一: 选择集成测试自动化工具。如很多Java项目采用Junit+Ant方案来实现集成测试的自动化,也有一些商业集成测试工具可供选择。

      步骤二: 设置版本控制工具,以确保集成测试自动化工具所获得的版本是最新版本。如使用CVS进行版本控制。

      步骤三: 测试人员和开发人员负责编写对应程序代码的测试脚本。

      步骤四: 设置自动化集成测试工具,每隔一段时间对配置管理库的新添加的代码进行自动化的集成测试,并将测试报告汇报给开发人员和测试人员。

      步骤五: 测试人员监督代码开发人员及时关闭不合格项。

      按照步骤三至步骤五不断循环,直至形成最终软件产品。

      方案点评:  该测试方案能在开发过程中及时发现代码错误,能直观地看到开发团队的有效工程进度。在此方案中,开发维护源代码与开发维护软件测试包被赋予了同等的重要性,这对有效防止错误、及时纠正错误都很有帮助。该方案的缺点在于测试包有时候可能不能暴露深层次的编码错误和图形界面错误。

      以上我们介绍了几种常见的集成测试方案,一般来讲,在现代复杂软件项目集成测试过程中,通常采用核心系统先行集成测试和高频集成测试相结合的方式进行,自底向上的集成测试方案在采用传统瀑布式开发模式的软件项目集成过程中较为常见。读者应该结合项目的实际工程环境及各测试方案适用的范围进行合理的选型。

  • 软件可靠性测试及其实践

    2008-04-30 11:12:13

        软件可靠性工程是指为了满足软件的可靠性要求而进行的一系列设计、分析、测试工作。其中确定软件可靠性要求是软件可靠性工程中要解决的首要问题。软件可靠性要求可以包括定性定及量要求。

      软件可靠性测试是在软件生存周期的系统测试阶段提高软件可靠性水平的有效途径。各种测试方法、测试技术都能发现导致软件失效的软件中残存的缺陷,排除这些缺陷后,一般来讲一定会实现软件可靠性的增长,但是排除这些缺陷对可靠性的提高的作用却是不一样的。其中,软件可靠性测试能最有效地发现对可靠性影响大的缺陷,因此可以有效地提高软件的可靠性水平。

      软件可靠性测试也是评估软件可靠性水平,验证软件产品是否达到软件可靠性要求的重要且有效的途径。

      1 软件可靠性测试概念

      “测试”一般是指“为了发现程序中的错误而执行程序的过程”。但是在不同的开发阶段、对于不同的人员,测试的意义、目的及其采用的方法是有差别的。在软件开发的测试阶段,测试的主要目的是开发人员通过运行程序来发现程序中存在的缺陷、错误。而在产品交付、验收阶段,测试主要用来验证软件产品是否达到用户的要求。或者说,对于开发人员,测试是发现缺陷的一种途径、手段,而对于用户,测试则是验收产品的一种手段。根据测试用例选取原则的不同,测试可分为黑盒测试方法和白盒测试方法两大类。黑盒测试方法是指按照软件需求生成测试用例对软件进行测试的方法,黑盒测试不关心程序是如何实现的;而白盒测试方法则是指根据程序的结构生成测试用例对软件进行测试的方法。

      软件可靠性测试是指为了保证和验证软件的可靠性要求而对软件进行的测试。其采用的是按照软件运行剖面(对软件实际使用情况的统计规律的描述)对软件进行随机测试的测试方法。通过软件可靠性测试可以达到以下目的:

      (1) 有效地发现程序中影响软件可靠性的缺陷,从而实现可靠性增长:软件可靠性是指“在规定的时间内,规定的条件下,软件不引起系统失效的能力,其概率度量称为软件可靠度。”软件的“规定的条件”主要包括相对不变的条件和相对变化的条件,相对不变的条件如计算机及其操作系统;相对变化的条件是指输入的分布,用软件的运行剖面来描述。按照软件的运行剖面对软件进行测试一般先暴露在使用中发生概率高的缺陷,然后是发生概率低的缺陷。而高发生概率的缺陷是影响产品可靠性的主要缺陷,通过排除这些缺陷可以有效地实现软件可靠性的增长。

      (2) 验证软件可靠性满足一定的要求:通过对软件可靠性测试中观测到的失效情况进行分析,可以验证软件可靠性的定量要求是否得到满足。

      (3) 估计、预计软件可靠性水平:通过对软件可靠性测试中观测到的失效数据进行分析,可以评估当前软件可靠性的水平,预测未来可能达到的水平,从而为开发管理提供决策依据。软件可靠性测试中暴露的缺陷既可以是影响功能需求的缺陷也可以是影响性能需求的缺陷。软件可靠性测试方法从概念上讲是一种黑盒测试方法,因为它是面向需求、面向使用的测试,它不需要了解程序的结构以及如何实现等问题。

      软件可靠性测试通常是在系统测试、验收、交付阶段进行,它主要是在实验室内仿真环境下进行,也可以根据需要和可能在用户现场进行。

      2 软件可靠性测试过程

      2.1 软件可靠性测试活动

      软件可靠性测试的一般过程如图1所示。主要活动包括:测试数据、测试环境的准备,测试运行,可靠性数据收集,可靠性数据分析和失效纠正。

      (1) 构造运行剖面:软件的运行剖面“是指对系统使用条件的定义。即系统的输入值用其按时间的分布或按它们在可能输入范围内的出现概率的分布来定义”。粗略地说,运行剖面是用来描述软件的实际使用情况的。运行剖面是否能代表、刻画软件的实际使用取决于可靠性工程人员对软件的系统模式、功能、任务需求及相应的输入激励的分析,取决于他们对用户使用这些系统模式、功能、任务的概率的了解。运行剖面构造的质量将对测试、分析的结果是否可信产生最直接的影响。

      (2) 选取测试用例:软件可靠性测试采用的是按照运行剖面对软件进行可靠性测试的方法。因此,可靠性测试所用的测试用例是根据运行剖面随机选取得到的。

  • QALoad优秀的性能测试工具

    2008-03-04 09:24:19

     

        QALoad是客户/服务器系统、企业资源配置(ERP)和电子商务应用的自动化负载测试工具。
    QALoad是QACenter性能版的一部分,它通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能。QACenter汇集完整的跨企业的自动测试产品,专为提高软件质量而设计。QACenter可以在整个开发生命周期、跨越多种平台、自动执行测试任务。

      在投产准备时期,QALoad可以模拟成百上千的用户并发执行关键业务而完成对应用程序的测试,并针对所发现问题对系统性能进行优化,确保应用的成功部署。

      预测系统性能
      当应用升级或者新应用部署时,负载测试能帮助确定系统是否能按计划处理用户负载。QALoad并不需调用最终用户及其设备,它能够仿真数以千计的用户进行商业交易。通过QALoad,用户可以预知业务量接近投产后真实水平时,端对端的响应时间,以便满足投产后的服务水平要求。

      通过重复测试寻找瓶颈问题
      QALoad录制/回放能力提供了一种可重复的方法来验证负载下的应用性能,可以很容易地模拟数千个用户,并执行和运行测试。利用QALoad反复测试可以充分地测试与容量相关的问题,快速确认性能瓶颈并进行优化和调整。

      从控制中心管理全局负载测试
      QALoad Conductor工具为定义、管理和执行负载测试提供了一个中心控制点。Conductor通过执行测试脚本,管理无数的虚拟用户。Conductor可以自动识别网络中可进行负载测试的机器,并在这些机器之间自动分布工作量,以避免网段超载。从Conductor自动启动和配置远程用户,跨国机构可以进行全球负载测试。在测试过程中,Conductor还可以在负载测试期间收集有关性能和时间的统计数据。

      验证应用的可扩展性
      出于高可扩展性的设计考虑,QALoad包括了远程存储虚拟用户响应时间并在测试结束后或其他特定时间下载这些资料的功能。这种方法可以增加测试能力,减少进行大型负载测试时的网络资源耗费。QALoad采用轮询法采集响应时间,在无需影响测试或增加测试投资的条件下,就可了解测试中究竟出现了什么情况。

      在利用QALoad进行测试时,可以有选择地改变硬件或软件的配置,并改变测试步调和负载量。QALoad系统的NetLoad 模块帮助建立所需的额外网络流量来模拟真实的产品负载。借助于“NetLoad”,可以在大环境下分配虚拟用户,更好地规划投产环境中如何让这些应用更好地工作。

      6-3QALoad 引入了"flash"为电子商务应用软件作容量测试。flash测试允许在测试期间增加大量的虚拟用户,来确定压力对底层部件和基础结构的影响。flash测试也可以证明应用投产后其响应时间将不会降低至服务级以下。

      快速创建仿真的负载测试
      准确仿真复杂业务的进行,对于预测电子商务应用软件的功能至关重要。运用QA Load,可以迅速创造出一些实际的安装测试方案,而不需要手工编写脚本或有关应用中间软件的详细知识和和协议。

      对结合了多种传输协议的应用软件进行负载测试是一个巨大的挑战。为了准确仿真这些应用软件产生的流量,QALoad可以捕获多种协议并在同一测试过程中执行它们。基于浏览器的应用经常打开与服务器的多个连接以缩短网页下载时间,导致服务器的额外流量。QALoad能准确地仿真除浏览器与服务器之间的交互,包括多重联结,使负载更加准确。

      另外,这些应用软件常常包含一些在测试方案中必须申明的动态信息。运用QALoad的ActiveData特征,可以定义脚本参数以帮助确保应用测试脚本的成功执行。

      例如,对一些安全或非安全的web应用软件,ActiveData自动转化为动态信息,如cookies;包括动态Active Serve Page cookies、动态URL名称、服务器导向、动态框架或者其它时期的特定信息。ActiveData for web有助于保证测试脚本与Web应用在测试过程中保持同步。
    ActiveData每次自动查找和提出需要的变更建议,使测试脚本正确执行。在脚本执行过程中,脚本中的信息可以被产生的正确信息自动替代。

  • 用webload进行web application性能测试

    2008-01-24 16:19:14

    一、webload是什么?
    webload是RadView公司推出的一个性能测试和分析工具,它让web应用程序开发者自动执行压力测试;webload通过模拟真实用户的操作,生成压力负载来测试web的性能
    用户创建的是基于java scrīpt的测试脚本,称为议程agenda,用它来模拟客户的行为,通过执行该脚本来衡量web应用程序在真实环境下的性能
    当前最高版本是6.0
    webload提供巡航控制器cruise control的功能,利用巡航控制器,可以预定义web应用程序应该满足的性能指标,然后测试系统是否满足这些需求指标;cruise control能够自动把负载加到web应用程序,并将在此负荷下能够访问程序的客户数量生成报告
    webload能够在测试会话执行期间对监测的系统性能生成实时的报告,这些测试结果通过一个易读的图形界面显示出来,并可以导出到excel和其他文件里

     

    二、webload结构


      
    三、Webload6.0安装
    下载地址:
    http://www.radview.com/

    四、Webload的通信设置
    配置SNMP协议使多个压力机之间互相通信:
    在win2000里进入[控制面板]->[添加删除程序]->[添加删除windows组件]
    选择[管理和监控工具],[下一步]后选择windows安装文件路径,[完成]
    TestTalk:
    TestTalk在测试会话里监测压力机间的信息传递,如果通信不成功则报错
    TestTalk自动安装,测试执行时在后台自动运行,注意不要将它关闭

    五、Webload程序组成
    Agenda Authoring Tool for Explorer (SSL)
    Visual AAT
    WebLOAD Console
    WebLOAD REPORTER
    Tools:TestTalk 和Performance Measurements Manager 等

    六、Webload性能测试工作流
    计划一个压力会话load session
    创建测试议程agenda
    创建压力模板load templates
    运行压力模板load templates
    输入测试报告并分析测试结果

    七、如何计划一个压力会话load session
    what application are you going to test?
    What functionality do you want to test — what actions will the users perform?
    How many Virtual Clients you want to simulate?
    How long your test will run?
    What are acceptable results? Acceptable results are defined by your test objective. For example,you can verify:
    Acceptable user response times
    Reliability by running stress tests
    Performance degradation after updates
    What resources are required for performing the test?

    八、创建测试议程agenda

    用WebLoad Visual AAT创建测试议程agenda:
    打开Visual Agenda Authoring Tool
    选择[Create a new project],并[确定]


     
    创建测试议程agenda
    设置清除浏览器的cache和cookie:
    选择[tools]->[default project options]->[IE playback settings]
    选择[clear cache]和[clear cookie]
    点击[ok]
    目的:防止记录脚本时将IE的相关信息保存到cache或cookie里引起不必要的麻烦.

    创建测试议程agenda
    点击[start record]按钮,弹出提示,点击ok
    自动打开一个IE,手工输入要测试的地址,进入系统
    在测试系统里完成一系列操作
    点击[stop record]停止录制,一个agenda脚本创建完毕;保存脚本

    九、创建压力模板load templates
    用WebLOAD Console创建load templates-将一系列压力事件定义到一个压力会话load session里:
    1)用webload wizard创建一个简单的压力模板
    2)用Cruise Control Wizard创建一个预期性能参数的压力测试模板
    3)用webload console手工创建压力模板
    说明:打开webload console时提示选择用哪个方式

    十、用webload wizard创建压力模板

    之前的准备工作,需要定义:
    运行的Agenda(s)
    用来生成负载的压力机
    虚拟客户端的个数
    压力测试进度表(用webRM创建)
    另外,还可以设置agenda选项,比如模拟浏览器的类型、连接速度、回放休眠时间等选项。
    用webload wizard创建压力模板
    进入webload console,选择该种方式创建压力模板:


     

    选择一个agenda或者混合型:
    lSingle Agendas:创建只有一个agenda脚本的压力模板
    lMix of Agendas:多个agenda脚本,模拟用户不同活动


     

    选择single agenda:


     

    选择Mix方式:可选择一个已有的mix文件,也可新建一个mix。


     
    选择新建一个mix时:



    上述三种方式【下一步】后,到达选择主机窗口:


     

    压力会话的进度设置:有两种设置方式,一个是手工分配每个压力机的压力;另一个是自动均匀分配每个压力机的压力。


     
    手工分配每个压力机的压力:


     
    Load profiler设置:共有八种进度模型,详细参照附录一


     
    自动均匀分配每个压力机的压力:可手工添加、删除、复制来设置进度;也可通过load profiler来设置,具体操作同手工分配压力的方式。

     

    【下一步】点击后,可立即执行测试,也可不立刻执行,点击【完成】;对于创建完的压力模板,可以:
    编辑压力模板
    通过菜单【reports】-【integrated report】-【new report】来查看webload默认生成的报告
    通过菜单【session control】-【modify host selection】来修改主机设置
    通过菜单【session control】-【modify schedule】修改压力进度表


    十一、创建一个预期性能参数的压力测试模板
    很多时候,我们不知道应用系统到底要多少用户访问;但是我们知道系统的性能应该满足什么样的指标是合适的;例如希望应用服务器的响应时间不超过3秒,webload会得到该目标下的最佳性能状况。
    打开webload console,选择用cruise control wizard创建模板:


     
    进入选择single agenda或mix方式添加脚本,之后选择压力机和探测客户机,这些操作和前一种方式相同;然后进入测试目标定义窗口:


     
    点击【add goal】按钮弹出所有可以添加的测量参数:


     
    添加一个或多个测量参数:


     
    为了达到测量参数目标,设置每次增加虚拟用户的速度:


     
    定义当测量目标参数达到时webload状态:


     
    点击【完成并运行】按钮,开始运行压力模板,并得到实时跟踪的测试结果:


     
    十二、手工创建压力模板
    打开webload console首页,选择【create a new template manually】,开始手工创建压力模板;该种方式的工作流如下,具体操作同前,这里不赘述:


     
    十三、运行压力模板load templates
    每种方式创建的压力模板都可以自动运行,也可以保存起来,或修改之后,通过如下方式运行:
    在webload console菜单栏里选择【session control】-【start session】
    在webload console工具栏里选择start session按钮


    十四、输出测试报告并分析测试结果
    实时查看测试结果:
    在chat view页面右键单击任何一个点查看实际值
    点击工具栏【dashboard】按钮查看整个测试中的关键参数
    点击工具栏【openstatistics】按钮统计整个测试中的详细参数,点击某个参数值可查看更详细信息
    点击工具栏【data drilling】按钮查看每个被测web页面的传输性能参数,点击可查看更详细信息


    创建集成报告:
    选择菜单栏【report】-【integrated report】-【new report】
    点击【rename】创建新的报告
    从参数树里选择本次测试中,想要生成报告的选项
    点击【ok】,报告显示出来

    用webload reporter分析测试结果
    打开webload reporter
    在这里,有整个测试过程中想要的各个分析工具,点击任何一个即动态生成该类型的报告,已做分析
    点击菜单栏【publish】,可以从中选择将生成的报告以其他方式导出
    关闭webload reporter
    Webload reporter界面


     
    十五、性能测量管理器PMM介绍
    Webload通过Performance Measurements Manager (PMM)
    来检测服务器端的性能,webload通过收集服务器端的有效数据,提供一个完全图形化的web应用程序的性能报告;用PMM,我们可以监测服务器的:
    Application Server Resources
    Database Resources
    System Resources
    Web Server Resources
    Stream Technology Resources
    Other Resources

    十六、性能测量管理器PMM操作
    三种方式打开PMM:
    在webload console菜单里【Session Control】-【Performance Measurements Manager】
    在开始菜单里Start | Programs | WebLOAD 6.0 | Tools |Performance Measurements Manager
    一般我们在创建load templates时,会有一个按钮进入PMM界面,我们重点介绍这种方法的操作

    PMM主界面:点击【add data source】


     
    开始选择数据源,选择数据源的主机:



    如果连接成功,会显示如下的数据源参数,在此选择我们想要测试的参数,点击【完成】:



    然后自动跳回PMM主界面,在此会看见如下的数据源参数代码,点击主界面的【close and update】,这些数据源参数会在load templates完成后自动出现在报告里:


     
    Webload的PMM在设置weblogic、iplanet、oracle等服务器的测量参数前,都要在该服务器端进行一定的设置,使其成为SNMP的代理服务器;具体设置步骤见用户手册372页。
    附录loader profile进度模型参数讲解
    1.Linear:
    Total time in minutes — 压力测试总时间(分)
    Starting Load Size — 初始压力个数
    Concluding Load Size — 结束时压力大小
    2. Random:
    Min. Load Size —最小压力大小
    Max. Load Size — 最大压力大小
    附录loader profile进度模型参数讲解
    Incrementing Intervals:
    Base Load Size — 初始压力大小(方波最小值)
    Time Between Each Interval-T1 — 加压持续的时间
    Time of Each Interval-T2-间隔时间
    Load to Increase Each Interval-每次加压加的压力个数
    Incrementing Intervals (time calculate):同上
    附录loader profile进度模型参数讲解
    Step Increments:Time of each Interval — 每次间隔的时间
    Load to increase each interval — 每个间隔增加的压力个数
    Ramp Up:
    Max Load Size — 最大压力数
    Ramp UpTime — 为了到达最大压力持续的增加时间
    Time to Run Max Load Size — 在最大压力时运行的时间
    Ramp Down Time — 从最大压力降到最小过程持续的时间
  • 运用LOADRUNNER .NET ADD-IN 写的性能测试脚本

    2007-12-20 15:30:53

    运用LOADRUNNER .NET ADD-IN 写的性能测试脚本

    运用LOADRUNNER .NET ADD-IN 写的性能测试脚本 using System;
    using System.Runtime.InteropServices;
    using System.Data.OleDb;
    using System.Data;
    namespace LoadRunnerUser1
    {
    /// <summary>
    /// Summary descrīption for VuserClass.
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class VuserClass
    {
      LoadRunner.LrApi lr;
      public VuserClass()
      {
       // LoadRunner Standard API Interface ::     DO NOT REMOVE!!!
       lr = new LoadRunner.LrApi();
       
      }
      // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      public int Initialize()
      {
       // TO DO: Add virtual user's initialization routines
       lr.message("Initialize部分,我只执行一次哦!");
       return lr.PASS;
      }
      // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      public int Actions()
      {
       // TO DO: Add virtual user's business process actions
       lr.message("Actions部分,我可以重复执行(在设置迭代情况下)!");
       try
       {
        //设置连接字符串开始
        string strC;
        [email=strConnection+=@]strConnection+=@"Data[/email] Source=C:\\test.mdb";
        //设置连接字符串结束
        //插入一个集合点开始
        lr.rendezvous("集合点");
        //插入一个集合点结束
        //事务开始
        lr.start_transaction("SQL语句性能");
        //建立OleDbConnection和OleDbCommand,并指定要运行的Sql语句开始
        System.Data.OleDb.OleDbConnection  conn=new
            System.Data.OleDb.OleDbConnection(strConnection);
        System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand();
        cmd.Connection = conn;   
        cmd.CommandText = "select * from testdb";
        //建立OleDbConnection和OleDbCommand,并指定要运行的Sql语句结束
        //插入一个日志开始
        lr.log_message("LOG: Sql语句开始执行了,Sql="+cmd.CommandText);
        //插入一个日志结束
        //将查询结果填充到DataTable开始
        DataTable dt = new DataTable();
       
        System.Data.OleDb.OleDbDataAdapter ōleDA = new
            System.Data.OleDb.OleDbDataAdapter();
        oleDA.SelectCommand = cmd;
        oleDA.Fill(dt);
        //将查询结果填充到DataTable结束
        //插入一个日志开始
        lr.log_message("LOG: Sql语句执行完成,Sql="+cmd.CommandText);
        //插入一个日志结束
        //取得结果集的记录数
        int iCountRec=Convert.ToInt32(dt.Rows.Count.ToString());
        conn.Close();//关闭连接
        //如果记录数大于0,完整这个事务,否则标识事务失败
        if(iCountRec>0)
         lr.end_transaction("SQL语句性能",lr.PASS);
        else
         lr.end_transaction("SQL语句性能",lr.FAIL);
        //再来一个参数化的示例开始
         lr.output_message("Welcome "+lr.eval_string("<username>")+"!");
        //再来一个参数化的示例结束
        //Thinktime 的应用,就是模拟手工操作的延时,在这里我们延时3秒钟
          lr.think_time(3);
       }
       catch(Exception ex)
       {
        conn.Close();//关闭连接
        string error = ex.Message;
       }
       return lr.PASS;
      }
      // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
      public int Terminate()
      {
       // TO DO: Add virtual user's termination routines
       lr.message("Terminate部分,我只执行一次哦!");
       return lr.PASS;
      }
    }
    }

  • 绿化版虚拟机使用问题

    2007-12-19 18:01:44

      由于工作原因分别在工作电脑和测试机上安装了虚拟机,在测试机上安装的是绿色版的虚拟机,版本是vm5.5.0,后来其他原因在工作电脑上安装了绿化版测试机。

      在使用中发现,不管是打开的原安装的虚拟机(下称安装版虚拟机)还是打开绿色版的虚拟机,在进程中发现都调用的是绿色版的路径,结束这个进程的话,不管开的是那个虚拟机都会自动结束。

      将原安装版虚拟机卸载,重新进行安装,但是在安装完成后虚拟机却始终无法上网,同时还发现虚拟网卡也存在很大的问题。正常安装虚拟机后可以虚拟出“VMnet8”和“VMnet1”这样两个虚拟连接(可以查看本机的网络连接),但是绿色版虚拟机却虚拟出了“VMnet0”,可以查看虚拟机的“虚拟网络设置”,但是在本机的网络连接上却没有这样的连接,所以一旦对虚拟机的网卡连接进行修改就会出现无法上网的问题。

      后来发现绿色版虚拟机在使用前的绿化中对本机的注册表进行了设置,不论执行多少次安装版虚拟机的卸载都会出现这样的情况。

      解决办法:

      1、重新做系统,一劳永逸啊!

      2、利用绿色版虚拟机自带的卸载程序,删除注册表信息,但是效果不好,同时由于本人还没有发现绿色版虚拟机在注册表中的路径,所以不能给出更好的解决方案。

  • LR高级技巧实战

    2007-12-07 18:03:17

     

    1.概述
            在山东BOSS性能压力 测试 过程中,发现脚本对于整个压力测试过程的重要性,一个压力测试脚本录制和编辑修改得怎么样直接影响后面压力测试的执行。通常情况下,脚本应尽可能的精简,就像写代码一样。针对BOSS系统的特点, 个人 认为把单一业务录制成一个Action,并在脚本中添加Transaction,Find检查(可以采用URL-based scrīpt 方式录制并事先设定),Rendezvous,参数化等基本元素,然而有时我们会发现光有这些基本元素还不能满足我们的要求。比如在Controller中运行我们的脚本时,一旦压力过大或某种原因导致某一业务失败,而此时我们很想尽快地找出错误的原因。当然此时我们第一想到的是,查找 日志 ,但是有时发现查找日志很不方便,因此我们希望寻求一种更快捷的方式,希望能直接从Controller的Errors错误中找到出错的服务号码、在第几次Iteration的哪个Transaction出错。实现的方式,当然是通过简单的编程来调用错误日志里的信息,另外本文中还简单介绍了关于 LoadRunner 工具使用的一些常用注意事项、脚本处理技巧和一些常用性能参数的分析及 性能测试 中机器瓶颈的定义和查看机器瓶颈的相关命令。
            下面再具体的一一介绍。

    2.一个规范的性能测试脚本就像一段规范的程序代码一样,需要基本的说明信息:
    在下面要介绍的脚本中,我把这些信息以注释的形式放在vuser_init最前面:
    /*
    @corporation:Copyright By *** Technologies CO.,LTD. All Rights Reserved.
    @Athour:XuLinLin
    @Date:2005-09-18
    @Name:异地缴费压力测试脚本
    @Parameter:BOSSURL,LogName,PhoneNum,iteration,FanHui
    @Data:BOSSURL:BOSSURL.dat; //由于BOSS压力测试前台展现环境多,故将地址也参数化。
    LogName:LogName.dat; //登录用操作员,选择具备异地缴费权限的操作员,这里选择的是德州操作员300个。
    PhoneNum:PhoneNum.dat; //用于异地缴费的服务号码,这里选择的是烟台的正常在用的标准全球通号码3000个。
    iteration:iteration.dat; //用于压力测试出错时,打印出错所在的循环次数。
    @Descrīption:此脚本用于测试异地缴费的性能及稳定性,选用德州的操作员对烟台的标准全球通号码进行异地缴费,目标是
    通过vuser模仿真实操作员进行异地缴费,达到验证或测试系统性能和稳定性的目的。
    @Notes:脚本的录制使用的是LoadRunner8.0的VU,采用的是URL-based scrīpt方式,需要特别注意的是Recording Options(按Ctrl+F7)
    的Advanced 选项里的Surport Charset一般情况默认为不选,除非字符集合采用的是国际标准才选中UTF-8选项,否则会出现汉字乱码现象。
    */

    3.通常情况下,任何业务必须在登陆成功后才能做,所以有必要对登陆成功与否进行判断:
    下面我从脚本中取出相关部分进行简单介绍:
    vuser_init()
    {
    int status; //定义变量用于判断登陆是否成功
    web_reg_find("Text="山东移动BOSS"",
    LAST);
    …….
    …….
    web_submit_data("reguserAction.do", //登陆提交数据Action。
    "Action="http://{BOSSURL}/boss/reguserAction.do"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/index.jsp"",
    "Snapshot="t12.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="logname"", "Value="{LogName}"", ENDITEM,
    "Name="password"", "Value=", ENDITEM,
    LAST);
    status = web_submit_data("reguserAction.do", // 取成功与否标志
    "Action="http://{BOSSURL}/boss/reguserAction.do"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/index.jsp"",
    "Snapshot="t12.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="logname"", "Value="{LogName}"", ENDITEM,
    "Name="password"", "Value=", ENDITEM,
    LAST);

    if (status ="=" LR_FAIL) //一旦登陆失败,脚本给出提示报错信息。
    {
    lr_error_message("错误信息: %s", "不能正常登陆!");
    return -1;
    }
    }

    4.事务的定义,很简单,也很有必要,尽量是每个定义的事物符合逻辑和小。
    在下面的脚本中,在异地缴费这一业务中定义了两个Transaction:准备异地缴费数据和提交异地缴费,见如下脚本代码:
    lr_start_transaction("准备异地缴费数据");


    web_set_max_html_param_len("4096");
    ……….
    web_submit_data("chargeacc.do",
    "Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=queryaccount"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/acccharge.jsp?act=first"",
    "Snapshot="t74.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="isconfirm"", "Value="no"", ENDITEM,
    "Name="chargetype"", "Value="telnumber"", ENDITEM,
    "Name="telnumber"", "Value="{PhoneNum}"", ENDITEM,
    "Name="nowfee"", "Value="0.0"", ENDITEM,
    "Name="factfee"", "Value=", ENDITEM,
    "Name="totalfee"", "Value="0.0"", ENDITEM,
    LAST);
    lr_end_transaction("准备异地缴费数据", LR_AUTO);

    5.增强脚本,对脚本进行简单的编程。
    增强脚本,对脚本进行简单的编程,为性能或压力测试提供方便,这也是写
    本文的宗旨,下面对此做简单的介绍:
            5.1首先,定义成功与否的判断标志或字符串。
            在此,我把判断成功与否的标志定义在异地缴费Action 最前面,具体定义如下:char fanhuiflag[30]="操作业务数据成功!";
    但是大家可能会问,字符串"操作业务数据成功!"从何处而来,可以肯定的不能凭空想象,成功标志可从两三种方式来取得:
    第一种:也是最简单的一种,直接从脚本中取得,具体操作是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里去取。见下面的 图片
    注:Snapshot在录制前要将Recording Options>Advanced里的Save snapshot resources locally 选项选中。

     


            第二种方式,从脚本代码中去取,即取find函数中相关字符串,具体做法是,找到在提交事件前的web_reg_find函数,然后从中取相关字符串。
    web_reg_find("Text="---------操作业务数据成功!--------"",
    LAST);
    值得注意的是要有web_reg_find函数,可以在录制前选中Recording Options>Advanced里的Generate web_reg_find functions for page titles 选项。


            第三种方式,从本地的snapshot里去取,具体操作,首先找到提交数据事件相关脚本,找到snapshot文件的名称,然后从本地的data文件里去找这个snapshot文件,然后丛中找到我们需要的字符串。
    web_reg_find("Text="---------操作业务数据成功!--------"",
    LAST);
    …….
    web_submit_data("chargeacc.do_3",
    "Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=submit&atype=commitdata"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=querycustomer"",
    "Snapshot="t129.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="isconfirm"", "Value="no"", ENDITEM,
    "Name="chargetype"", "Value="telnumber"", ENDITEM,
    "Name="telnumber"", "Value=", ENDITEM,
    "Name="nowfee"", "Value="8.8"", ENDITEM,
    "Name="factfee"", "Value="0.00"", ENDITEM,
    "Name="totalfee"", "Value="8.8"", ENDITEM,
    "Name="accountno"", "Value="{WCSParam_Diff1}"", ENDITEM,
    "Name="factpay"", "Value="8.8"", ENDITEM,
    "Name="grantpercent"", "Value=", ENDITEM,
    "Name="grantfee"", "Value="0"", ENDITEM,
    "Name="takecash"", "Value="8.8"", ENDITEM,
    "Name="zero"", "Value="0"", ENDITEM,
    "Name="paytype"", "Value="Cash"", ENDITEM,
    "Name="remark"", "Value=", ENDITEM,
    "Name="invoice"", "Value="joininvoice"", ENDITEM,
    LAST);

            5.2设置和保存判断成功与否的参数,这也是最关键的地方。
    有一点大家都很清楚,业务成功返回的字符串和失败返回的字符串是不同的,我们所要做的是将返回的字符串做为参数保存下来,然后拿这个参数和我们事先定义好的成功的标志做比较,有两种方式可以设置和保存这一参数,下面简单介绍:
    第一种方式也是最准确的方式,是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里的成功的返回标志,然后对其进行Create Parameter,这样LoadRunner会自动在脚本中添加web_reg_save_param函数,具体如下:
    // [WCSPARAM WCSParam_Text2 24 操作业务数据成功!_Text2] Parameter {WCSParam_Text2} created by Correlation Studio
    web_reg_save_param("WCSParam_Text2",
    "LB="---------"",
    "RB="-"",
    "Ord="1"",
    "RelFrameId="1"",
    "Search="Body"",
    LAST);

     

            第二种方式是在提交事件前添加web_reg_save_param函数,具体操作是在提交事件前右击鼠标选择Insert Before 选项,然后在弹出的对话框中选择Services里的web_reg_save_param选项,单击OK按纽,然后在弹出的对话框中输入相关的数据。

     


            5.3 编写相关判断代码段。
            在已经定义好判断字符串和设置和保存好成功与否的标志字符串参数后,编写相关判断代码段,这也是最关键的地方,具体代码段如下:
    if (strcmp(fanhuiflag,lr_eval_string("{WCSParam_Text2}"))!="0)
    {
    lr_error_message("消息: %s,在第 %s 次循环时出错,出错号码:%s", "提交异地缴费数据失败!", lr_eval_string("{iteration}"), lr_eval_string("{PhoneNum}"));
    }
    简单解释如下:
    fanhuiflag:前面已经定义好的成功标志字符串的数组名,当然前面也可以用指针来实现,这里不做介绍。
    WCSParam_Text2:为实现设置和保存好的成功与否返回的字符串的参数;
    PhoneNum:服务号码的参数化,具体为电话号码。关于参数化,这里不做分析和解释部分。
    Iteration:为了定位具体的循环而设置的参数。
    Strcmp函数:LoadRunner自带的字符串比较函数,相等时返回0
    lr_eval_string函数:LoadRunner自带求字符串函数,函数格式为
    char * lr_eval_string (const char * instring );
    (另一种判断方式:先事先定义好int rc="1;" char *fanhuiflag="操作业务数据成功!";然后在定义事务的结尾进行判断: rc="strcmp(str_tip,lr_eval_string(""{re_str_tip}"));
    if(rc="=0)"
    {
    lr_end_transaction("异地缴费_提交", LR_PASS);
    }
    else
    {
    lr_error_message("异地缴费_提交失败,号码为:%s",lr_eval_string("{msisdn}"));
    lr_end_transaction("异地缴费_提交", LR_FAIL);
    }
    //lr_end_transaction("异地缴费_提交",LR_AUTO);)

            5.4验证我们的需求是否实现
            下面简单介绍,整个验证过程,在确保脚本正确和测试环境正常的情况下,我们先在VU里验证下是否真正实现了我们想要的功能,为了方便,我特地将判断条件该为="=而不是!=,通过查看日志来检查。

            首先,选中菜单栏里的Run-time Settings子菜单,设置里面的Log选项,选中Enable Logging 和Always send messages 和Extended log 及Parameter substitution。
    设置Run Logic 里的Number of Iterations 为2,然后运行,并查看日志。可以得到如下的日志(只取了关键部分的):
    第一次循环关键部分:
    YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.8459 Wasted Time: 0.0060).
    YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
    YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 1 [table = iteration].
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "1"
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953555588"
    YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 1 次循环时出错,出错号码:13953555588

    第二次循环关键部分:
    YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.2347 Wasted Time: 0.0064).
    YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
    YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 2 [table = iteration].
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "2"
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953572390"
    YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 2 次循环时出错,出错号码:13953572390

            下面验证执行时,能正确找到出错的号码信息,将脚本加入到场景后,同样设置好Run-time Settings。

            设置结果保存路径等相关信息,按Start Scenario 执行场景,等出错是单击右上角的Errors,然后选中错误信息再按Details按纽查看错误信息。

    6.怎么样使多台产生vuser的测试机均匀地对被测试的系统施加压力?
    在测试的过程中,为了尽可能减少或者避免本身的测试机成为测试过程中的瓶颈,需要使用多台测试机产生vuser对被测试系统施加压力,下面对操作步骤做简单介绍:
            在默认模式下使用controller添加多台Generators机器时,不管你怎么加,最终能真正起作用的只有一台(10.19.180.2/3/4或localhost):

    为了让10.19.180.2/3/4机器同时能真正被添加进去,我们需要做以下几步工作:
    改变场景模式,将组模式()改变为百分比模式(percentage mode),具体做法是,选择Scenario菜单下的Convert Scenario to the Percentage Mode;

    然后,在已经添加好的Load Generators机器列表中同时选择你想选择的机器;

    最后,点OK按钮就可以得到我们所要的结果了。

    当然,如有必要我们还可以把场景模式改为Vuser Group Mode,具体做法如下:
    选择Scenario菜单下的Convert Scenario to the Vuser Group Mode;

    然后在弹出的对话框中,单击Yes按钮可以得到如下结果,

    到此为止,添加多台Load Generators测试机整个过程就完成了,其实很简单,关键是你发现了没有。

    7. 怎么样在关联时取列表的最后一个值(在测试重打发票取流水号时需要)?
    在压力测试脚本的关联过程中,我们有时可能需要关联最新的值(如最新的流水号,通常情况下,最新的流水号放在列表的最下方),所以找最新的流水号就是最列表最下方,如果保存在数组里,那就是找index值最大的那个元素。下面以重打发票(注:具体流程为先缴费,然后查询缴费历史,然后从缴费历史里找到最新的流水号,然后使用此流水号进行重打发票)为例对整个过程做详细的介绍:
    首先,在缴费历史里找到需要关联的流水号并关联之,具体做法如下,
    7.1以Tree View方式打开脚本并在对应事件的Page View里找到最新的流水号

            找到我们需要关联的流水号(这里为536dxwf0200051031000000)后,需要把它给关联,(因为返回的值是事后才知道的,且对于不同的电话号码,对应的返回值不同,所以对于这样的值是需要关联的。)具体做法是打开Server Response 页面并在Body里找到需要关联的流水号,然后选中此流水号并在右键弹出的菜单中使用Create Parameter关联之。

     


    7.2单击是(Y)按钮,对应的脚本中会增加如下内容。

            单击View scrīpt 图标以scrīpt模式查看关联情况。

    7.3到此为止脚本中多出如下代码段,下面对它做一定的分析:
    web_reg_find("Text="缴费历史查询"",
    LAST);
    // [WCSPARAM WCSParam_Text1 23 536dxwf0200051031000000] Parameter {WCSParam_Text1} created by Correlation Studio
    web_reg_save_param("WCSParam_Text1",
    "LB="formnum="",
    "RB=\"",
    "Ord=8",
    "RelFrameId=1",
    "Search=Body",
    LAST);
    //后面的内容为注释部分,说明流水号536dxwf0200051031000000已经关联并保存到WCSParam_Text1参数中。
            web_reg_save_param()为LoadRunner的保存参数所用的函数,其作用是将返回流水号保存到WCSParam_Text1参数中,以便使用不同的号码进行缴费历史查询出来的流水号能随着时间的变化流水号也跟着变化,而不是录制脚本时的536dxwf0200051031000000,这样可以避免在重打发票时不会报诸如此流水号不存在等类似错误信息。然而现在的问题是怎么将此流水号对应到重打发票对应的地方。另一个问题是,不是所有的号码缴费后查询到的流水号数量都和录制脚本时查询到的流水号相同,事实上每做一笔除查询类的操作都会有一个流水号。而我们关注的是怎么取到最新的缴费的流水号,下面详细介绍相关步骤。

    5.1 修改web_reg_save_param()函数相关部分,很简单,把"Ord="8"",改为"Ord=ALL",目的是找最TOP的那个参数值。

    5.2 光保存和取参数还不够,我们需要把参数能正确传递到重打发票对应的地方,为此我采取的做法如下:
            在缴费历史事件脚本最前面定义两个变量,目的是为了将流水号以字符串的形式保存在变量里(因为LoadRunner不支持在web_submit_data()函数里直接使用变量):具体做法是:
    char WCSParam_Text1Pram[50]; //保存取到的流水号
    char WCSParam_Text1PramVal[50]; //保存以"Value="流水号""取到的流水号。


            将关联好的流水号存到变量里,在此的做法是在对应的web_submit_data()函数后添加如下代码段:
    lr_message("WCSParam_text1:%s",lr_eval_string("{WCSParam_Text1}"));
    //打印出关联的参数WCSParam_Text1的值。
    sprintf(WCSParam_Text1Pram,"{WCSParam_Text1_%s}",lr_eval_string("{WCSParam_Text1_count}"));
    //把取到流水号保存到WCSParam_Text1Pram里,具体形式为
    sprintf(WCSParam_Text1PramVal,"Value="%s"",lr_eval_string(WCSParam_Text1Pram));
    //组合流水号和”Value=”并保存到WCSParam_Text1PramVal变量中。
    lr_message("The value argument is : %s", WCSParam_Text1PramVal);
    //打印出字符串变量WCSParam_Text1PramVal的值。

     

    5.3 找到重打发票中响应的流水号,并把其中的"Value="536dxwf0200051031000000""替换成WCSParam_Text1PramVal,在这里总共有两处。

     

            到此为止,流水号的关联已经基本上处理完毕,下面我们执行脚本,来验证我们想要的是不是真的有效。(注,参数化的问题在本文中不做具体介绍)为了看到明显的效果,我们需要将日志的处理做简单设置。

            然后执行脚本,查看相关执行日志,可以得到类似下面得消息。

     

    8.使用LoadRunner一些常用的注意事项:
    Note1:VuGen仅能录制 Windows平台上的会话,但是,录制的Vuser脚本既可以在Windows 平台上运行,也可以在 UNIX 平台上运行。
    通用 Vuser 函数和特定于协议的函数,它们共同构成了 LoadRunner API,并使Vuser能够直接与服务器通信。

    Note2:用于运行Vuser脚本的C解释器仅支持ANSI C语言。它不支持 Microsoft对ANSI C的任何扩展。
    通常情况下,可以将登录到服务器的活动录制到vuser_init部分中、将客户端活动录制到Actions部分中,并将注销过程录制到vuser_end部分中。

    Note3:只能向Action部分(而不是init或end 部分)添加集合。
    Note:不要从事务内部发送消息,因为这可能使事务执行时间变长,并扭曲事务结果。

    Note4:如果使用日志运行时设置修改脚本的调试级别,则 lr_message、lr_output_message 和 lr_log_message 函数的行为将不会更改,它们将继续发送消息。

    Note5:录制 Java Vuser 脚本时, Vuser 脚本中将不生成 lr_think_time 语句。

    Note6:VuGen 新建参数,但不会自动替换任何在脚本中选定的字符串。

    Note7:不要将参数命名为 unique,因为该名已被 VuGen 使用。

    Note8:如果在常规运行时设置文件夹中将“错误处理”设置为“出现错误时仍继续”,则错误消息仍将被发送到输出窗口。

    Note9:因为生成的服务器消息很长,而且日志记录会降低系统的运行速度,所以请仅为脚本中特定的代码块激活服务器消息日志记录功能。

    Note10:启用“出现错误时仍继续”功能时,将覆盖 0 严重级别;即使发生数据库错误,也将继续执行脚本。然而,如果禁用了“出现错误时仍继续”功能,但将严重级别指定为 1,则当发生数据库错误时仍将继续执行脚本。

    Note11:下列协议不是线程安全协议:Sybase-Ctlib、Sybase-Dblib、Informix、Tuxedo 和 PeopleSoft-Tuxedo。

    Note12:对于支持树视图的协议(如“视图”菜单所示),在树视图中运行 Vuser脚本时, VuGen 将从 Vuser 脚本中的第一个图标开始运行该脚本。

    Note13:要显示运行时查看器,必须安装 Microsoft Internet Explorer 4.0 或更高版本。
    Note:Vuser 生成“结果摘要”报告时,事务时间可能会增加。Vuser 可以仅在从 VuGen 运行时才生成“结果摘要”报告。使用 Controller 运行 Web Vuser 脚本时, Vuser 不能生成报告。

    Note14:当使用 Javascrīpt 和 VBscrīpt Vuser 时,在脚本中用到的 COM 对象必须完全的兼容。这使下列情况成为了可能:一个应用程序操纵另一个应用程序中的对象,或者公开对象以便操纵它们。

    9.性能参数解析:
    WEB资源参数

            每秒点击次数:中Vuser每秒向Web服务器提交的HTTP请求数,依据点击次数来评估Vuser产生的负载量。

            吞吐量:案运行过程中服务器上每秒的吞吐量。吞吐量的度量单位是字节,表示Vuser在任何给定的某一秒上从服务器获得的数据量,依据服务器吞吐量来评估Vuser产生的负载量。

            每秒HTTP响应数:中每秒从Web服务器返回的HTTP状态代码号(表示HTTP请求的状态,例如“the request was successful”、“the page was not found”)

            每秒下载页面数:每秒钟从服务器下载的网页数,依据下载的页面数来评估Vuser产生的负载量。

            每秒重试次数:中每秒钟内服务器尝试的连接次数,在下列情况下将重试服务器连接:初始连接未经授权、要求代理服务器身份验证、服务器关闭了初始连接、初始连接无法连接到服务器或者服务器最初无法解析负载生成者的IP地址。

            连接数:每个时间点上打开的TCP/IP连接数。

            每秒SSL连接数:每秒打开的新的以及重新使用的SSL连接数。当对安全服务器打开TCP/IP连接后,浏览器将打开SSL连接,因为新建SSL连接需要消耗大量的资源,所以应该尽量少地打开新的SSL连接。

    网页细分图
            注意:由于要从客户端测定服务器时间,因此,如果发送初始HTTP请求到发送第一次缓冲这一段时间内网络性能发生变化,则网络时间可能会影响此测定。因此,所显示的服务器时间是一个估计值,可能不太精确。
    DNS解析:显示使用最近的DNS服务器将DNS名称解析为IP地址所需的时间。“DNS 查找”度量是指示DNS解析问题或DNS服务器问题的一个很好的指示器。

            连接:显示与包含指定URL的Web服务器建立初始连接所需的时间。连接度量是一个很好的网络问题指示器。此外,它还可表明服务器是否对请求作出响应。

            第一次缓冲:显示从初始HTTP请求(通常为 GET)到成功收回来自Web服务器的第一次缓冲时为止所经过的时间。第一次缓冲度量是很好的Web服务器延迟和网络滞后指示器。注意:由于缓冲区大小最大为 8K,因此第一次缓冲时间可能也就是完成元素下载所需的时间。

            SSL握手:显示建立SSL连接(包括客户端 hello、服务器hello、客户端公用密钥传输、服务器证书传输和其他部分可选阶段)所用的时间,自此点之后,客户端与服务器之间的所有通信都将被加密。SSL握手度量仅适用于HTTPS通信。

            接收:显示从服务器收到最后一个字节并完成下载之前经过的时间。“接收”度量是很好的网络质量指示器(查看用来计算接收速率的时间/ 大小比率)。

            FTP验证:显示验证客户端所用的时间。如果使用FTP,则服务器在开始处理客户端命令之前,必须验证该客户端。“FTP 验证”度量仅适用于 FTP 协议通信。

            客户端时间:显示因浏览器思考时间或其他与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的平均时间。

            错误时间:显示从发出HTTP请求到返回错误消息(仅限于HTTP错误)这期间经过的平均时间。

            系统资源(UNIX资源参数):
    CPU utilization :CPU的使用时间百分比
    Disk rate :磁盘传输速率
    Paging rate :每秒钟读入物理内存或写入页面文件中的页数
    Page-in rate :每秒钟读入到物理内存中的页数
    Page-out rate :每秒钟写入页面文件和从物理内存中删除的页数
    Collision rate :每秒钟在以太网上检测到的冲突数
    Context switches rate :每秒钟在进程或线程之间的切换次数
    Average load :上一分钟同时处于“就绪”状态的平均进程数
    Swap-in rate :正在交换的进程数
    System mode CPU utilization :在系统模式下使用CPU的时间百分比
    User mode CPU utilization :在用户模式下使用CPU的时间百分比

    网络监视参数

            网络延迟时间:源计算机与目标计算机(例如,数据库服务器和Vuser负载生成器)之间的整个路径的延迟。

            网络子路径时间:从源计算机到路径上每个节点的延迟。注意:从源计算机到每个节点的延迟是同时而又独立地度量的。因此,从源计算机到其中一个节点的延迟可能大于源计算机与目标计算机之间的整个路径上的延迟。

            网络段延:路径上每个段的延迟。

            验证网络是否是瓶颈:可以合并各种图来确定网络是否是瓶颈。例如,通过使用网络延迟时间图和运行Vuser图,可以确定Vuser的数量如何影响网络延迟。网络延迟时间图指示在方案运行期间的网络延迟。

    数据库服务器

            User Calls :在每次登录、解析或执行时, Oracle 会分配资源(Call State 对象)以记录相关的用户调用数据结构。在确定活动时,用户调用与RPI调用的比指明了,因用户发往Oracle的请求类型而生成的内部工作量

            Total file opens :由实例执行的文件打开总数。每个进程需要许多文件(控制文件、日志文件、数据库文件)以便针对数据库进行工作

            Opened cursors current :当前打开的光标总数

            DB block changes :由于与一致更改的关系非常密切,此统计计算对SGA中所有块执行的、作为更新或删除操作一部分的更改总数。这些更改将生成重做日志项,如果事务被提交,将是对数据库的永久性更改。此统计是一个全部数据库作业的粗略指示,并且指出(可能在每事务级上)弄脏缓冲区的速率。

    10.AIX操作系统机器性能瓶颈定义:
    瓶颈定义
    CPU bound : vmstat : when %user+%sys greater than 80%;
    Disk I/O bound : vmstat : when %iowait greater than 40%(AIX4.3.3 or later);
    Application disk bound :vmstat : when %tm_act greater than 70%;
    Paging space low : lsps -a : when used paging space greater than 70% active;
    Paging bound : iostat vmstat : paging logical volumes %tm_act greater than 30% of the I/O(iostat) and paging activity greater than 10* the number of CPUs(vmstat);
    Thrashing : vmstat sar :rising page outs, CPU wait and run queue;

    11.系统性能分析命令:
    cpu : vmstat,iostat,topas,nmon,ps,sar,time,timex,netpmon,trace,trcrpt;
    内存:vmstat,topas,nmon,ps,svmon,lsps,filemon,trace,trcrpt;
    磁盘:iostat,topas,nmon,lvmstat,iostat -d, lvmstat, lsps,filemon,lsattr,lsdev;
    网络:netstat,topas,nmon,entstat,nfsstat,ifconfig,iptrace,ipreport,trace,trcrpt;
    监视CPU使用情况:vmstat 2 ; iostat -t 2 6;sar -P ALL 2 3;
    监视内存使用情况: vmstat 2 10;ps aux;svmon -G;svmon -Pau 10;
    监视I/O使用情况: iostat 5;sar -d 3 3;
    监视网络使用情况: netstat -i ;netstat -m;netstat -v;

    此文来源于51testing博客,转载请注明出处
    原始链接:
    http://www.51testing.com/?94273/action_viewspace_itemid_13778.html

  • Visual Studio 2008单元测试实践

    2007-12-07 17:42:29

    本文转载自http://blog.csdn.net/kkshizhu520/archive/2007/12/04/1915438.aspx
       
        单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。

        在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数或子过程。在象C++这样的面向对象的语言中, 要进行测试的基本单元是类。对Ada语言来说,开发人员可以选择是在独立的过程和函数,还是在Ada包的级别上进行单元测试。单元测试的原则同样被扩展到第四代语言(4GL)的开发中,在这里基本单元被典型地划分为一个菜单或显示界面。

        单元测试不仅仅是作为无错编码的一种辅助手段在一次性的开发过程中使用,单元测试必须是可重复的,无论是在软件修改,或是移植到新的运行环境的过程中。因此,所有的测试都必须在整个软件系统的生命周期中进行维护。

        Visual Studio 2008 单元测试功能介绍

    一、测试代码与被测代码分离成独立的两个项目

        单元测试中,测试的代码不能对被测试的代码施加影响。如果将测试代码写入被测试的代码中,测试完成后再删除的话,测试的正确性将得不到保证。因此,在Visual Studio 2008种提供了一种“Test Project”的项目,测试代码写在Test Project中,并且测试工程可以进行重复使用。

    二、测试代码的自动生成

        书写测试代码是一件很烦琐的事情,这些代码没有像程序代码一样具有“创造性”,因此该部分代码可以进行自动化生成。Visual Studio 2008就提供了一个自动生成测试代码的测试框架。利用Visual Studio 2008自动生成的代码,只需要很少的改动就可以完成整个测试程序。

    三、测试管理

        Visual Studio 2008提供了测试列表来进行测试工作的管理工作,我们需要一个反映目前测试状况的工具,那些测试通过了,那些没有通过,应该提供一个列表来为我们改进测试手段,进行更全面的测试提供指导。
     
        利用Visual Studio 2008来进行单元测试

        假设我们有一个类BankAccount,该类定义了一个银行的账户,私有属性_currentBalance是银行储户的账户金额,depositMoney是存款方法,对帐户增加一笔资金,makePayment是支付方法,对账户减少一笔资金。代码如下:

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

     

    namespace BankAccountDemo.Business

    {

        
    class BankAccount

        
    {

            
    private float _currentBalance;

       
    public float CurrentBalance

            
    {

                
    get return _currentBalance; }

                
    set { _currentBalance = value; }

            }


            
    public BankAccount(float initialBalance)

            
    {

                
    this._currentBalance = initialBalance;

            }


            
    public void depositMoney(float depositAmount)

            
    {

                
    this._currentBalance += depositAmount;

            }


            
    public void makePayment(float paymentAmount)

            
    {

                
    this._currentBalance -= paymentAmount;

            }


     

        }


    }



        要对
    BankAccount类进行单元测试,只需要在BankAccount的定义处鼠标右键,在菜单中选择“Create Unit Tests”即可进入测试项目的创建工作。如下图所示:

     



       
    在弹出的创建单元测试的对话框中,对需要创建测试的方法和属性进行选择,然后点击“OK”按钮,如图所示:

       
    紧接着在出现的文本框中输入测试项目的名称“BankAccountDemo.Business.Tests”,点击确定后,测试项目被创建。在这里“BankAccountDemo.Business.”只是用于更好的对命名空间进行规划,完全可以直接使用“BankAccountDemoTest”来作为测试项目的名字。
    生成的测试代码如下,为了紧凑的表现代码,将注释代码作了删除。

    这个时候的代码并不能开始测试,而需要我们按照测试用例的要求将测试用例的数据加入到测试方法中,并进行结果的比较,修改后的depositMoneyTest方法如下:

     

    [TestMethod()]

    public void depositMoneyTest()

    {

        float initialBalance = 0F; // TODO: Initialize to an appropriate value

        BankAccount target = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

        float depositAmount = 100F; // TODO: Initialize to an appropriate value

        target.depositMoney(depositAmount);

        Assert.AreEqual(initialBalance + depositAmount, target.CurrentBalance, "Deposit Test: Deposit not applied correctly");

     }


         
    鼠标右键在depositMoneyTest方法内任意位置单击,在弹出的菜单中选择“Run Tests”,即可以对该方法进行测试。在“Test Results”窗口中显示测试的结果,如下图所示:

     

     


        可以看出,
    Visual Studio 2008给我们提供了一个功能强大,操作简单的单元测试功能。利用该功能,程序员在编写代码后,可以马上对所编写的类进行单元测试,通过了程序员自行组织的单元测试后再将代码交给测试人员进行进一步测试。

       
    总结:微软将单元测试功能从Visual Studio 2005 Team System开始集成到开发环境中,是经过了微软公司多年的实践经验证明的。如今,开发环境从以前的单一开发功能,将关注点分散到软件的整个生命周期过程中来,已经成为一个ALM平台。软件开发人员不仅需要做开发工作,而且需要对自己开发的代码进行单元测试,不能将所有的问题全部抛给测试人员。测试人员可以将更多的精力放在系统一级的测试工作上面。

    using BankAccountDemo.Business;

    using Microsoft.VisualStudio.TestTools.UnitTesting;

    namespace BankAccountDemo.Business.Tests

    {

        [TestClass()]

        
    public class BankAccountTest

        
    {

            
    private TestContext testContextInstance;

     

            
    public TestContext TestContext

            
    {

                
    get

                
    {

                    
    return testContextInstance;

                }


                
    set

                
    {

                    testContextInstance 
    = value;

                }


            }


     

            
    Additional test attributes

     

     

            [TestMethod()]

            
    public void CurrentBalanceTest()

            
    {

                
    float initialBalance = 0F; // TODO: Initialize to an appropriate value

                BankAccount target 
    = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

                
    float expected = 0F; // TODO: Initialize to an appropriate value

                
    float actual;

                target.CurrentBalance 
    = expected;

                actual 
    = target.CurrentBalance;

                Assert.AreEqual(expected, actual);

                Assert.Inconclusive(
    "Verify the correctness of this test method.");

            }


     

            [TestMethod()]

            
    public void makePaymentTest()

            
    {

                
    float initialBalance = 0F; // TODO: Initialize to an appropriate value

                BankAccount target 
    = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

                
    float paymentAmount = 0F; // TODO: Initialize to an appropriate value

                target.makePayment(paymentAmount);

                Assert.Inconclusive(
    "A method that does not return a value cannot be verified.");

            }


     

            [TestMethod()]

            
    public void depositMoneyTest()

            
    {

                
    float initialBalance = 0F; // TODO: Initialize to an appropriate value

                BankAccount target 
    = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

                
    float depositAmount = 0F; // TODO: Initialize to an appropriate value

                target.depositMoney(depositAmount);

                Assert.Inconclusive(
    "A method that does not return a value cannot be verified.");

            }


    [TestMethod()]

            
    public void BankAccountConstructorTest()

    查看(911) 评论(0) 收藏 分享 管理

  • loadrunner- winsock 函数 一览表

    2007-12-04 18:10:48

    lrs_accept_connection 接受侦听套接字连接

            lrs_close_socket 关闭打开的套接字


            lrs_create_socket 初始化套接字


            lrs_disable_socket 禁用套接字操作


            lrs_exclude_socket 重播期间排除套接字


            lrs_get_socket_attrib 获取套接字属性


            lrs_get_socket_handler 获取指定套接字的套接字处理程序


            lrs_length_receive 接收来自指定长度的缓冲区的数据


            lrs_receive 接收来自套接字的数据


            lrs_receive_ex 接收来自数据报或流套接字的数据(具有特定长度)


            lrs_send 将数据发送到数据报上或流套接字中


            lrs_set_receive_option 设置套接字接收选项


            lrs_set_socket_handler 设置特定套接字的套接字处理程序


            lrs_set_socket_options 设置套接字选项


    缓冲区函数

            lrs_free_buffer 释放分配给缓冲区的内存


            lrs_get_buffer_by_name 从数据文件中获取缓冲区及其大小


            lrs_get_last_received_buffer 获取套接字上接收到的最后的缓冲区及其大小


            lrs_get_last_received_buffer_size 获取套接字上接收到的最后一个缓冲区的大小


            lrs_get_received_buffer 获取最后接收到的缓冲区或其一部分


            lrs_get_static_buffer 获取静态缓冲区或其一部分


            lrs_get_user_buffer 获取套接字的用户数据的内容


            lrs_get_user_buffer_size 获取套接字的用户数据的大小


            lrs_set_send_buffer 指定要在套接字上发送的缓冲区


    环境函数

            lrs_cleanup 终止 Windows 套接字 DLL 的使用


            lrs_startup 初始化 Windows 套接字 DLL


    关联语句函数

            lrs_save_param 将静态或接收到的缓冲区(或缓冲区部分)保存到参数中


            lrs_save_param_ex 将用户、静态或接收到的缓冲区(或缓冲区部分)保存到参数中


            lrs_save_searched_string 在静态或接收到的缓冲区中搜索出现的字符串,将出现字符串的缓冲区部分保存到参数中


    转换函数

            lrs_ascii_to_ebcdic 将缓冲区数据从 ASCII 格式转换成 EBCDIC 格式


            lrs_decimal_to_hex_string 将十进制整数转换为十六进制字符串


            lrs_ebcdic_to_ascii 将缓冲区数据从 EBCDIC 格式转换成ASCII 格式


            lrs_hex_string_to_int 将十六进制字符串转换为整数


    超时函数

            lrs_set_accept_timeout 为接受套接字设置超时


            lrs_set_connect_timeout 为连接到套接字设置超时


            lrs_set_recv_timeout 为接收套接字上的初始预期数据设置超时


            lrs_set_recv_timeout 为建立连接后接收套接字上的预期数据设置超时


            lrs_set_send_timeout 为发送套接字数据设置超时


            录制会话之后,通过 VuGen 的内置编辑器可以查看录制的代码。您可以在脚本中滚动,查看应用程序生成的函数,并检查传输的数据。在主窗口中查看脚本时,可以看到VuGen 录制活动的顺序。在典型的会话期间,将录制下列函数顺序:


            lrs_startup 初始化 WinSock DLL


            lrs_create_socket 初始化套接字


            lrs_send 在数据报上或者向流套接字发送数据


            lrs_receive 接收来自数据报或流套接字的数据


            lrs_disable_socket 禁用套接字操作


            lrs_close_socket 关闭打开的套接字


            lrs_cleanup 终止 WinSock DLL 的使用

            VuGen 在 Windows 上使用 Windows 套接字协议支持应用程序的录制和重播;而在UNIX 平台上仅支持重播。

  • 清闲的一天

    2007-11-22 18:12:21

      今天蛮清闲!嘿嘿~~~

      今天本来安排了测试一个web,但是在早上同同事沟通,了解到现在主要的功能还没有实现,直接影响后面的测试工作,主要功能的完成时间还不确定,但是界面测试已经进行了2次(辛苦啊!!!)。同事由于这个web在使用时没有什么用户访问压力产生,所以连压力测试都免了。总结就是今天很清闲。

      怎样渡过今天那?

      捡起loadrunner的学习计划,继续向前吧!今天主要是学习脚本了,以前几乎对脚本没有什么认识,还是因为工作需要了解了些,但那是非常肤浅的,不够细致,所以从头开始。从头开始要有从头开始的基础,听很多人说脚本学习很容易,所以我也就放弃了系统的学习脚本这样的过程。直接就在loadrunner的学习中开始学习脚本,现在网上找了一份关于loadrunner脚本的教程,开始了我的学习之路。艰辛啊

      在学习中,看到了卖烧烤的鱼在博客中发布的一段,loadrunner自身带的订票系统的一段脚本(http://www.cnblogs.com/mayingbao/archive/2007/11/09/953967.html),仔细研究,但是没有什么长进,不过,看过这样一句话,“顿悟,需要渐悟的牵引”,如果说现在的艰辛过程没有效果,那是因为我还在渐悟的路上,踢掉前面的绊脚石,翻过前面的高山,走到渐悟的那头—顿悟。

      革命尚未成功,学涛仍需努力。

      自勉

Open Toolbar