发布新日志

  • 一份好的测试报告

    2009-12-23 09:14:46

    项目完成,拿来测试总结的模板,开始往里面添内容,去完成测试总结报告,写过几次报告,并没有去对报告做过一个梳理,如何去写一份好的总结报告呢?

    项目简介:一些需要介绍的内容,项目简称的解释,项目背景等等
    测试内容:测试内容的大纲
    测试环境:测试环境的描述,包括客户端和网络环境
    测试资源:测试过程中的测试资源使用
    测试的数据:bug数,解决数,遗留数。模块bug分布,bug走势图,缺陷遗留,需要说明的问题
    测试数据分析:对于整个过程测试的一个分析,得出结论
    遗留问题:对于软件遗留问题有详细说明。

    报告的内容每个人都可以说清楚,但是仅仅简单的罗列,也能使看的人很费劲。如何展现这些东西使你的测试报告丰满而又有说服力,并且易读易看呢?
    1、内容简洁:说话抓住重点,不说废话,简单易懂,能用表格的尽量用表格展示
    2、不罗列详细数据,挑拣一些能说明问题分析数据的:比如缺陷走势图,模块的bug分布等等。加必要的简短的分析。图形简单易懂,且比较直观。如果不能说明问题或者一些不重要的图表就不用都一一列在报告中了,会显得报告比较啰嗦。
    3、遗留问题说明很重要:遗留问题列表:当遗留问题比较多时,要择优选择,因为大家都有这样的感受,10个问题,大家都会仔细看,100个问题就没有心情和时间仔细看了,会感觉重点不突出,这就需要测试人员挑出比较重要的问题展示出来,并且说明重要问题的影响。
    4、分析结论一定要给出,并且明显的位置。让项目经理清楚你的测试结论是什么,当时间比较紧的时候他看到结论心里就有数了
    5、把其他的详细数据付成附件,可供想得到详细数据学习的人去学习理解。

  • loadrunner参数化总结

    2009-02-27 13:31:24

     

    1.         select next row(下一值取值方式)

    l         Sequential(顺序):Vuser按照顺序从数据表中取值,每次当Vuser访问数据表,都返回下一个可用的数据,如果没有足够的数据,VuGen将从数据表的第一行重新开始取值。这种方式强调虚拟用户的一致性,每个用户运行到该点取值是一致的

    l         Random(随机)

    每次Vuser访问数据表时都分配一个随机的值

    l         Unique(唯一)

    唯一的数,为每个Vuser的参数分配唯一的值。与sequential相比,Unique强调的是用户间的差异性,每个用户取到的参数都不一致

    2.         Update value on(更新方式)

    l         Each iteration:每次迭代都取一个新的值,如果在脚本的一次迭代中,该参数出现两次也只取同一个值

    l         Each occurrence:每次遇到参数都取一个新值,如果在脚本的一次迭代中,该参数出现两次,那么两次都取不同的值

    l         Once 在一个Vuser中参数都取相同的值(不管几次迭代)

    3.         组合取值说明表

    参数取值和更新方式列表

    update method
    (更新方式)

    数据分配方法

    sequential(顺序)

    random(随机)

    unique(唯一)

    Each iteration
    (每次迭代)

    对于每一次迭代,Vuser都从数据表中取下一个值

    对于每一次迭代,Vuser都从数据表里取一个新的随机值

    对于每一次迭代,Vuser都会从数据表里取下一个唯一值

    Each occurrence
    (
    每次遇到)

    即使在一次迭代中,每次遇到参数,Vuser都会从数据表中取下一个值

    即使在一次迭代中,每次遇到参数,Vuser都会从数据表中取一个新的随机值

    即使在一次迭代中,每次遇到参数,Vuser都会从数据表中取一个新的唯一值

    once
    (一次)

    对于每个Vuser,第一次迭代分配的值和接下来的迭代取相同的值

    对于每个Vuser,第一次迭代分配的随机值和接下来迭代取相同的值

    对于每个Vuser,第一次迭代分配的唯一值和接下来的迭代取相同的值

    4.         Unique参数取值说明

    Select next row = unique 需要选下面两个内容

    l         When out of value(当数据表的值不够的时候所做操作)

    Abort user (中止运行):停止运行

    Continue with last value(取最后一个值):Vuser取最后一个值

    Continue in a cyclic manner(循环取值):Vuser从属于他的数据表中的第一个取值开始循环取值

    l         Allocate Vusers value in the Controller(为Vuser分配参数块)

    Automatically allocate block size(自动分块):系统自动为参数分块大小

    自动分块示意图:假设一个Vuser执行完迭代需要4个值

    A1

    A2

    A3

    A4

    A5

    A6

    A7

    A8

    An

    An+1

     

    Vuser1

    Vuser2

    Vuser n

    Vuser n+1

    1)        会按照排队的方式分配参数

    2)        块的大小为一个Vuser运行完毕所需要的参数

    3)        Vuser分到的参数不够,将在自己分的块中进行取值:例如:Vuser n只分到两个参数,Vuser n会按照when out of value的方式取值,如果是Continue with last valueVuser n 的参数取值是AnAn+1An+1An+1,如果选择的是Continue in a cyclic mannerVuser n的参数取值是AnAn+1AnAn+1(块内循环)

    4)        Vuser n+1因为没有分到参数会报错

    5)        所需参数总数  块大小 * Vuser个数(块大小计算,Each iteration每次迭代)则 = 迭代次数,Each occurrence每次遇见)则 = 迭代次数 * 一次迭代出现次数)

     

    Allocate ** values for each Vuser(分配**块给每个Vuser):手动分块

    手动分块示意图:假设一个Vuser执行完迭代需要4个值,手动分块块大小为3

    A1

    A2

    A3

    A4

    A5

    A6

    A7

    A8

    A9

    Vuser1

    Vuser2

    Vuser3

    1)        会按照分块的方式分参数

    2)        块大小为设定大小

    3)        Vuser分到的参数不够,将在自己分的块中进行取值:例如:因为每个Vuser需要四个参数,所以每个Vuser参数都不够,则Vuser2为例,如果选择的是Continue with last valueVuser 2 的参数取值是A4A5A6A6,如果选择的是Continue in a cyclic mannerVuser 2的参数取值是A4A5A6A4(块内循环)

    4)        所需参数总数 手动分配块大小 * Vuser个数

    注:在controller设置duration的情况下,自动分块的分块方式有所变化,块大小 = 我们输入的参数总数 /  Vuser的个数,其他处理方式和手动分配块大小一致

  • 自动化实用模型(下)

    2009-02-26 10:00:26

     

    结论

    实用的自动化软件测试系统是一个不断发展的技术,以提高生命力和减少维护

     

    提高生命力说的是自动化测试系统有能力只能的调整和应对以外调整下的测试,一直这样做的话,测试系统的生命被延长,是通过保证他他固有的能力一直的有用

     

    减少维护的时间,这是个消除冗余工作的功能,例如一点维护这个例子和使用可重用模块

     

    PATS设计的目的是提供解决测试带来的挑战新的发展技术和环境,重要的是要明白测试系统执行测试用例,他们没有定义或者有限考虑。他们需要进行强大的测试基础设施和STLC去支撑自动化实践和建立成功的标准

    我想以下面的列表来作为结束

     

     

    实用性自动化测试系统

    l         在无人职守的情况下不分白天黑夜的运行

    l         就算是测试用例出错,系统依然可以正常的工作

    l         不惜一切代价启用自动化测试

    l         能辨认出是硬件问题还是软件问题

    l         能输出有意义的日志

    l         一点维护

    l         重用模块容易更新

    l         变量中的文本字符串存储可以被容易的发现和更新

    l         用类似英语的语言书写比较容易理解

    l         自动化最重要的是业务功能

    l         对于新的特性可以迅速的增加脚本和模块

    l         不要浪费时间在把功能做的复杂上面,要保证功能的简单

    l         收集有用的信息例如操作系统和用例工具

    l         跟踪组件跟踪自动化测试系统

    l         跟踪可重用模块防止冗余

    l         认真的测试测试系统

    l         从测试用例套件中持续跟踪测试的覆盖率

    l         跟踪自动化测试用例哪些是自动化的哪些是需要手工的

    l         对于基于WEBGUI的应用系统利用一样的架构

    l         确定基线数据已经定义而且可以更新数据

    l         确保测试环境的干净和更新为最新状态

    l         测试用例管理-把测试用例存储在数据库中方便维护

    l         跟踪测试结果,通过或者失败

     

     

    自动化测试---怎样保持他们运行

    l         测试实验必须有专用的机器

    l         每天执行测试用例

    l         把他作为一个日常的活动

    l         像开发和实施证明自动化测试的有用性

    l         在运行测试的时候使得开发对于自动化测试感兴趣

    l         为开发或者最终用户建立一个测试集合

     

     

  • 自动化实用模型(中)

    2009-02-26 09:55:09

    事件2

     

    为了避免陷阱,在企业实施自动化测试时,这些因素都要被仔细审查1)测试架构,2)自动化测试生命周期和3)公司支持

    测试的基础保证

    测试的基础设施包含,测试活动,时间,任务和进程,立即支持自动化,以及手册,软件测试。基础设施越完善将保证稳定,持续的可靠性的自动测试

    基础设施包括

    l         测试计划

    l         测试用例

    l         基础测试数据

    l         更新或者回滚数据的程序

    l         专用的测试环境,浏览器稳定的前端和后端

    l         专用的测试实验

    l         一体化的结构和进程

    l         测试用例的数据库,跟踪和更新自动化和手工用例

    l         在测试周期中确定测试用例优先级的方法

    l         覆盖率分析指标和程序

    l         缺陷跟踪数据库

    l         风险管理指标/程序(McCabe tools

    l         版本控制系统

    l         配置管理程序

    l         工具/程序/方法去跟踪需求到测试用例

    l         改善度量指标

     

    测试基础设施的目的,例如

    l         在有规律的情况下,无人值守的运行自动化测试用例

    l         专用的测试环境防止手工测试和自动化测试的冲突

    l         跟踪测试结构的程序,不管通过或者没有通过

    l         报告测试覆盖率的方法

    l         保证预期结果的一致性

    l         测试实验室专用设备与自动化使一个单一的自动化测试套件进行多用户和压力测试

     

    重要的是记住,在通往成功的开始,基础设施的各个部分都充分不是必须的。优先级列表,逐步的加入组件,随着时间的推移,目前的模式可以进行调整和整合的变化。经验证明这样需要一年的时间去加入一个主要过程和两个小的组件到模式中去

    基于经验,从创建一个专用的测试环境和使测试的用例和计划标准化开始。随着一个良好的自动化测试构架需要很长的路才能走向自动化的成功

     

    下面的内容是“肉和土豆”列表是STLC的内容

    1.       计划

    2.       分析

    3.       设计

    4.       建设

    5.       测试-初始化测试周期,bug修改和重新测试

    6.       最终测试和执行

    7.       后期执行

     

    每个短语包含五个到二十个高级别的测试任务和程序去准备和执行手工和自动化测试,下面是一些例子

    1.       计划

    l         营销组织撰写文档定义产品

    l         定义问题报告程序

    l         高级别测试用例

    l         首先分析项目的范围

    l         定义接收的标准

    l         建立自动化测试环境

    1.        分析

    l         营销和研发组织一起工作撰写需求文档

    l         在业务需求的基础上开发功能性验证矩阵

    l         确认那些测试用例可以进行自动化

    l         为测试用例计划极限数据

     

    1.        设计

    l         开发组编写详细的文件定义产品的架构

    l         根据变更修改测试计划和测试用例

    l         修改测试生命周期矩阵和时间点

    l         建立风险评估标准(McCabe tools

    l         正式详细的自动化测试系统,文件名的约束和多样性

    l         决定是否任何一套测试用例将自动将它们变为数据驱动/模板模型

    l         开始编写自动化测试用例和重用模块

     

    正如STLC正在不断完善,将阐明本组织的测试过程。什么时候应该做什么事情,去确定什么时候软件已经可以测试,包含手工的和自动的测试系统。这里的想法是早开始,对于变更要准备好去面对

     

    其中自动化测试失败的一个最重要的原因是早期准备的不够充分,也就是对于什么时候应该坐什么的缺乏理解。步骤不是很难,主要是明白STLC是怎样工作的,这个不需要比失败的状况花更多的时间和努力

     

    对于测试的基础设施,成功的测试,没有必要按照所有的STLC任务,包括手工的自动的测试。比较重要的内容我们都知道是“尽早开展”很多的自动化工作可以在软件可以测试之前完成,如果非得需要良好的架构,一点维护,自动化测试系统和方法,即,PATS

     

    公司

    公司的动态性是对于你们自己的整个领域。自动化测是的目标是保证接受和支持可重复的程序,这是公司的关键重要的一点。没有这样的保证自动化测试不会成功

     

  • 自动化实用模型(上)

    2009-02-18 14:09:59

        接触自动化,总觉得无法推行,归根结底是自己站的位置太低了,总是一个脚本的编写者去看待问题,无法站在更高的位置上去考虑很多东西,所以做了一些翻译,觉得这篇文章写的不错,只是自己水平有限,不知能否翻译出原文的精髓

    原文地址 http://www.automated-testing.com/PATfinal.htm

    译文:

                         自动化测试的实用模型

    摘要

    这篇文章的目的就是去探索自动化工具的实用和阐述自动化成功的必要条件,要取得成功,必须记住,有四个相互关联的组成部分,必须共同工作和相互支持 1)自动化测试基于一点维护和重用的模块 2测试基本组成的事件,任务和进程,立即支持自动化,以及手工软件测试 3)软件测试的生命周期是由许多确定时间点和确定需要取得的成果的阶段构成的 4)公司支持可重用的流程,这个部分是作者作为一个资深的测试工程师和测试架构师经过多次的不同的软件开发过程下讨论确定下的

     

    简介

    这篇文章的目的是解释怎样成功的实施自动化测试,想要使自动化测试成功,大家必须明白必须很多相关的环节一起正确的工作,每个环节必须互相支持。

    这篇文章会阐述锁包含的关键的环节和他们的关系,在这里强调的是哪些是重要的,哪些是有用的,和一些作者在工作中的经验

    自动化不是一个孤立的个体,他需要坚实的测试基础设施和全面的软件测试生命周期的支持和重视的企业文化

    首先,一个自动化测试系统必须是在支持模块重复利用和一点维护,他必须非常的灵活而且易于更新

    测试的一些基础设施包含精细的测试实验,好的bug管理系统,测试用例格式的标准和全面的测试计划

    测试的生命周期是当任务和自动化联系是

    一个公司可以通过运用自动化测试工具有很大的提升,这些益处主要包括,更高的测试覆盖率,更高的可靠性,缩短测试周期,在没有其他的资源损失下去做更多的多用户测试,重要的是提高完成软件的信心

    好消息是,自动化测试所需要的各个组件并不是都需要,这个要根据习惯去决定,哪些是重要的取决于自动化测试和在公司推行自动化测试的理解

    自动化的成功是个实用的业务。在这片文章中剩下的问题就是去解决在自动化测试中两个经常遇到的问题

    1、 怎样才能用快速应用开发环境(Rapid Application Development environment)设计完成一个高效的自动化测试体系接口不停的变换、数据和内容不停地修改和变化

    2、 为什么很多公司的自动化测试最终都失败了

     

    事件1

    第一个问题的解决是利用一个自动化测试系统使用架构原则基于架构的方式创建1)重用的模块和2一点维护

    一个重要的成果就是让自动化测试系统像被测软件一样迅速的,容易的进行改变,从一个公司的角度,这是一个使自动化成功的重要条件

    为了简洁这个目标,自动化测试的设计是基于架构原则建立的,这个可以称为PATS

     

    PATS是如何工作的

    这一节关注自动化测试系统本身,怎么样去建立一个简单,易用,支持重用模块和一点维护,换句话说,就是PATS

     

    工具的选择

    首先需要做工具评估。必须让一个人去使用这个被评估的工具。我的建议是使用两个到三个工具,一个一个的使用,用他们创建简单的和复杂的脚本。基于衡量每个工具的易用性和使用工具重用模块的能力。值得注意的是,每个工具都有他们创建脚本的特性。最重要的一点是不要让工具告诉你怎么去测试。自动化测试策略是独立于工具的,工具是为了支撑和实现测试策略的

    一个马匹会带领你去找到水源,如果你让他去,如果你想围着湖转转这当然非常好,如果你想穿越草甸你就不会认为这是个好主意了。这个类似自动化测试工具。利用捕捉-回放手段,你可以找到野生树林-不是你想去的地方。你的自动化测试系统会最终和一个巨大的混乱交织在一起以至难以持续。这是为什么最重要的是测试方法的架构会与测试工具有关。测试工具是客人而不是主人

     

    自动化测试方法

    可重用模块

    模块的重用用来导航,操纵控制,数据验证,错误识别(软件,硬件),和输出日志。可重用模块基本组成是命令、逻辑,数据,这些必须以归并的方式呈现才有意义。在测试系统中使用通用的模块,比如初始化和安装部分,封装起来命名为体现他主要功能的名字,像“初始化”或者“安装”。其他的更具体的应用,在客户窗口对服务的控制,例如,也封装在一起,并且命名类似

     

    系统架构就是重用的内容被组织起来,经验表明完整的架构是组织主要的重用模块在一个应用窗口,所有的模块被客户窗口调用被组织在一个文件里或者一个libraryqtp有这个library)。这样的话,就是客户界面因为任何原因被修改,更新文件只要更新一个地方。这就使在一个地方更新维护成为现实的原则

     

    这个争论的中心是,如果一个控制语句,例如在客户窗口的列表框,非常类似于清单屏幕,为什么不用一个适合两种情况的重用模块?这个应该比想象的要麻烦,而且复杂程度没有办法保证模块的正确。当一个模块越来越复杂,他将越来越难保持,而且会有很大的可能带来一些bug

     

    测试用例

    下面一个步骤是把我们的方法从模块转化成自动化测试的用例,在这里,自动化测试工程师有一个架构较好的手工测试用例,去把他变为脚本,创建重用模块。目标是有条不紊的创建一个可重用的模块,行动-响应的测试用例演化为可重用模块的脚本。测试用例一般决定可重用模块的粒度,这个模块包含一个行动-响应。这个对于判定自动化项目的范围和成本来说是比较重要的。一个单独的可重用模块需要一到三个小时去做成脚本和做一些单元测试,自动化测试一般需要二三十个可重用模块

    在这种模式下创建的自动化测试用例是一个可预测的结构,一个优点是可以在提早在测试生命周期中开始创建自动化系统

     

    结构化的测试用例格式

    结构化的测试用例是一种动态的自动化测试用例,包含了一系列的行动-响应

     

    测试用例举例

    测试用例id:客户01

    功能:新加一个用户

    数据假设:客户数据库已经恢复

    概述:

    增加一个新的用户通过用户的屏幕,需要确定这个新增加的用户在所有的用户屏幕上显示的都是正确的

    操作

    初始化屏幕

    数据

    期望结果

    1、通过windows桌面图标启动Salse系统

    项目经理

    显示销售程序的首页面

    2、在页面中选择用户

    销售选择首页面

    客户页面正确显示

    3、单击所有用户

    客户页面

    客户窗口正确显示,名称为所有用户

    4、单击增加按钮

    客户所有客户

    增加客户页面显示

    5、输入数据增加新的用户,单击增加按钮

    增加用户

    姓名:john doe

    地址:123main st.

    城市:san Francisco

    (来源于data-sheet

    数据显示在显示区域

    (和data-sheet中定义的一样)

    优点

    1、  易于自动化-所有的都有一样的框架

    2、  数据都需要明确的定义

    3、  精确的导航

    4、  每一步骤的期望结果都很明确-没有需要猜测的结果

     

    可预测的架构

    下一步,我们举例说明什么是可预测的架构,所有测试用例的屏幕名字都指向一个包含可重用模块的文件。例如:如果这个应用程序有三十个不同的屏幕,那么测试系统就会有三十个文件名字相同的可重用模块对应于每一个屏幕。通过执行命令去显示特定的屏幕,第一个测试用例的操作是确定屏幕是否通过桌面打开,(屏幕启用和焦点-取决于正在测试的具体内容),这个是通过索引文件调用重用模块,那么,这个确定的新的屏幕就是我们文件的第一个模块。这个可重用模块知道怎样去1)利用多级动态验证方法动态的确定屏幕的文件名,2)如果验证失败指定一个错误级别3)向日志文件里面写错误信息。注:我建议创建两个日志文件,一个详细日志,另一个日志只记录通过/失败信息

    下面是一个例子一个索引的客户文件调用可重用文件去判断customer screen 是不是正确显示的,这个索引是“VALIDATE

    注释

    操作

    确认客户屏幕是否打开

    CALL "V_CUSTOMER" label "VALIDATE"

    下面是一个可重用模块的例子1)多级验证动态验证客户屏幕2)包含逻辑制定的错误级别 3)向详细日志里面写入两条信息

    注释

    操作

    验证客户屏幕的文件索引

    Label"VALIDATE:"

    为了方便调试向详细日志写入日期信息的测试用例

    Write $CURLOG LOG.CUR_OTL

    通过多级验证的方式验证客户屏幕的文字

    Look text CONSTANTS.CUST_TXT win CUST.TITLE_WIN area wait 1

    验证逻辑

    逻辑错误级别是软件错误

     

    增量软错误计数器-继续向下运行

    回复调用脚本

     

    想日志里写入pass/fail信息

    If no

    >Log $CURLOG "Soft Error: Did not find customer screen"

    >Assign ERROR.SOFT=ERROR.SOFT+"1"

    >Resume

    Otherwise

    >log $CURLOG "Passed: Customer screen is displayed"

    >resume

    把文本字符串中的变量存储在constants.cust_txt,支持一点维护的原则,是一个切合实际的方式存储文本验证字符串所以他们很容易找到并更新

    这增强和深化了一点维护的原则,允许很多跨平台测试,增加了可移植性,通过使用通用的屏幕和应用程序变量的方式,这种技术使得自动化测试系统动态的变化界面,这些界面通常需要RAD环境,这使得系统比较灵活而且减少了维护的时间。

    这种利用重用模块的框架思想继续在测试用例中使用,结果是可预知的,结构是实用并且好用的自动化测试系统,像一个人用砖去建造房子,建立一个有条不紊表示可重复使用的模块测试功能。在最后的分析阶段,这就是构成了实用的自动测试系统(PATS

     

    多级验证

    多级数据验证增加了测试系统的有用性和灵活性,更多层次的数据验证和评价,则测试系统更加灵活,多级的验证和评价使得测试系统拥有这样的能力1)动态的数据验证在不同的级别和2)从系统消息中收集信息,这样其他人可以在将来评估数据

    依照自动化测试工具的动态的数据验证,在控制下取数据,把数据和预期结果进行比较,然后把结果写进日志文件中。测试工具也可以按照输出做出分支的判断。测试工具可以在一个命中混合GET(取数据)和COMPARE(比较),类似LOOK(看)功能,去简化编程

    验证涉及到动态的检查数据,评估涉及到系统的消息,在看到结果后才进行评估

    PATS中,动态的数据验证和消息评估可以被分成七种不同的级别和两种比较场景,包含和不包含

    在精确的指出自动化测试系统不是一个独立的过程,我们下面将列出自动化测试为什么总是失败的原因

     

  • 有用的测试网站收集

    2009-01-16 10:00:13

    http://bdonline.sqe.com/ 一个关于网站测试方面的网页,对这方面感兴趣的人可以参考
    http://citeseer.nj.nec.com/ 一个丰富的电子书库,内容很多,而且提供著作的相关文档参考和下载,是作者非常推荐的一个资料参考网站
    http://groups.yahoo.com/group/LoadRunner 性能测试工具LoadRunner的一个论坛
    http://groups.yahoo.com/grorp/testing-paperannou-nce/messages 提供网站上当前发布的软件测试资料列表
    http://satc.gsfc.nasa.gov/homepage.html 软件保证中心是美国国家航天局(NASA)投资设立的一个软件可靠性和安全性研究中心,研究包括了度量、工具、风险等各个方面
    http://seg.iit.nrc.ca/English/index.html 加拿大的一个研究软件工程质量方面的组织,可以提供研究论文的下载
    http://sepo.nosc.mil 内容来自美国SAN DIEGO的软件工程机构(Sofrware Engineering Process Office)主页,包括软件工程知识方面的资料
    http://www.asq.org/ 是世界上最大的一个质量团体组织之一,有着比较丰富的论文资源,不过是收费的
    http://www.automated-testing.com/ 一个自动化软件测试和自然语言处理研究页面,属于个人网页,上面有些资源可供下载
    http://www.benchmarkresources.com/ 提供有关标杆方面的资料,也有一些其它软件测试方面的资料
    http://www.betasoft.com/ 包含一些流行测试工具的介绍、下载和讨论,还提供测试方面的资料
    http://www.brunel.ac.uk/~csstmmh2/vast/home.html VASTT研究组织,主要从事通过切片技术测试技术和转换技术来验证和分析系统,对这方面技术感兴趣的人是可以在这里参考一些研究的项目及相关的一些主题信息
    http://www.cc.gatech.edu/aristotle/ Aristole研究组织,研究软件系统分析、测试和维护等方面的技术,在测试方面的研究包括了回归测试、测试套最小化、面向对象软件测试等内容,该网站有丰富的论文资源可供下载
    http://www.computer.org/ IEEE是世界上最悠久,也是在最大的计算机社会团体,它的电子图书馆拥有众多计算机方面的论文资料,是研究计算机方面的一个重要资源参考来源
    http://www.cs.colostate.edu/testing/ 可靠性研究网站,有一些可靠性方面的论文资料
    http://www.cs.york.ac.uk/testsig/ 约克大学的测试专业兴趣研究组网页,有比较丰富的资料下载,内容涵盖了测试的多个方面,包括测试自动化、测试数据生成、面向对象软件测试、验证确认过程等
    http://www.csr.ncl.ac.uk/index.html 学校里面的一个软件可靠性研究中心,提供有关软件可靠性研究方面的一些信息和资料,对这方面感兴趣的人可以参考
    http://www.dcs.shef.ac.uk/research/groups/vt/
    学校里的一个验证和测试研究机构,有一些相关项目和论文可供参考
    http://www.esi.es/en/main/ ESI(欧洲软件组织),提供包括CMM评估方面的各种服务
    http://www.europeindia.org/cd02/index.htm 一个可靠性研究网站,有可靠性方面的一些资料提供参考
    http://www.fortest.org.uk/ 一个测试研究网站,研究包括了静态测试技术(如模型检查、理论证明)和动态测试(如测试自动化、特定缺陷的检查、测试有效性分析等)
    http://www.grove.co.uk/ 一个有关软件测试和咨询机构的网站,有一些测试方面的课程和资料供下载
    http://www.hq.nasa.gov/office/codeq/relpract/prcls-23.htm NASA可靠性设计实践资料
    http://www.io.com/~wazmo/ Bret Pettichord的主页,他的一个热点测试页面连接非常有价值,从中可以获得相当大的测试资料,很有价值
    http://www.iso.ch/iso/en/ISOOnline.frontpage 国际标准化组织,提供包括ISO标准系统方面的各类参考资料
    http://www.isse.gmu.edu/faculty/ofut/classes/ 821-ootest/papers.html 提供面向对象和基于构架的测试方面著作下载,对这方面感兴趣的读者可以参考该网站,肯定有价值
    http://www.ivv.nasa.gov/ NASA设立的独立验证和确认机构,该机构提出了软件开发的全面验证和确认,在此可以获得这方面的研究资料
    http://www.kaner.com/ 著名的测试专家Cem Kanner的主页,里面有许多关于测试的专题文章,相信对大家都有用。Cem Kanner关于测试的最著名的书要算Testing Software,这本书已成为一个测试人员的标准参考书
    http://www.library.cmu.edu/Re-search/Engineer- ingAndSciences/CS+ECE/index.html 卡耐基梅陇大学网上图书馆,在这里你可以获得有关计算机方面各类论文资料,内容极其庞大,是研究软件测试不可获取的资料来源之一
    http://www.loadtester.com/ 一个性能测试方面的网站,提供有关性能测试、性能监控等方面的资源,包括论文、论坛以及一些相关链接
    http://www.mareinig.ch/mt/index.html
    关于软件工程和应用开发领域的各种免费的实践知识、时事信息和资料文件下载,包括了测试方面的内容
    http://www.mtsu.ceu/-storm/ 软件测试在线资源,包括提供目前有哪些人在研究测试,测试工具列表连接,测试会议,测试新闻和讨论,软件测试文学(包括各种测试杂志,测试报告),各种测试研究组织等内容
    http://www.psqtcomference.com/ 实用软件质量技术和实用软件测试技术国际学术会议宣传网站,每年都会举行两次
    http://www.qacity.com/front.htm 测试工程师资源网站,包含各种测试技术及相关资料下载
    http://www.qaforums.com/ 关于软件质量保证方面的一个论坛,需要注册
    http://www.qaiusa.com/ QAI是一个提供质量保证方面咨询的国际著名机构,提供各种质量和测试方面证书认证
    http://www.qualitytree.com/ 一个测试咨询提供商,有一些测试可供下载,有几篇关于缺陷管理方面的文章值得参考
    http://www.rational.com/ IBM Rational的官方网站,可以在这里寻找测试方面的工具信息。IBM Rational提供测试方面一系列的工具,比较全面
    http://rexblackconsulting.com/Pages/publicat-ions.htm
    Rex Black
    的个人主页,有一些测试和测试管理方面的资料可供下载
    http://www.riceconsulting.com/ 一个测试咨询提供商,有一些测试资料可供下载,但不多
    http://www.satisfice.com/ 包含James Bach关于软件测试和过程方面的很多论文,尤其在启发式测试策略方面值得参考
    http://www.satisfice.com/seminars.shtml 一个黑盒软件测试方面的研讨会,主要由测试专家Cem KanarJames Bach组织,有一些值得下载的资料
    http://www.sdmagazine.com/ 软件开发杂志,经常会有一些关于测试方面好的论文资料,同时还包括了项目和过程改进方面的课题,并且定期会有一些关于质量和测试方面的问题讨论
    http://www.sei.cmu.edu/ 著名的软件工程组织,承担美国国防部众多软件工程研究项目,在这里你可以获俄各类关于工程质量和测试方面的资料。该网站提供强有力的搜索功能,可以快速检索到你想要的论文资料,并且可以免费下载
    http://www.soft.com/Institute/HotList/ 提供了网上软件质量热点连接,包括:专业团体组织连接、教育机构连接、商业咨询公司连接、质量相关技术会议连接、各类测试技术专题连接等
    http://www.soft.com/News/QTN-Online/ 质量技术时事,提供有关测试质量方面的一些时事介绍信息,对于关心测试和质量发展的人士来说是很有价值的
    http://www.softwaredioxide.com/ 包括软件工程(CMM,CMMI,项目管理)软件测试等方面的资源
    http://www.softwareqatest.com/ 软件质量/测试资源中心。该中心提供了常见的有关测试方面的FAQ资料,各质量/测试网站介绍,各质量/测试工具介绍,各质量/策划书籍介绍以及与测试相关的工作网站介绍
    http://www.softwaretestinginstitute.com 一个软件测试机构,提供软件质量/测试方面的调查分析,测试计划模板,测试WWW的技术,如何获得测试证书的指导,测试方面书籍介绍,并且提供了一个测试论坛
    http://www.sqatester.com/index.htm 一个包含各种测试和质量保证方面的技术网站,提供咨询和培训服务,并有一些测试人员社团组织,特色内容是缺陷处理方面的技术
    http://www.sqe.com/ 一个软件质量工程服务性网站,组织软件测试自动化、STAR-EASESTARWEST等方面的测试学术会议,并提供一些相关信息资料和课程服务
    http://www.stickyminds.com/ 提供关于软件测试和质量保证方面的当前发展信息资料,论文等资源
    http://www.stqemagazine.com/ 软件策划和质量工程杂志,经常有一些好的论文供下载,不过数量较少,更多地需要通过订购获得,内容还是很有价值的
    http://www.tantara.ab.ca/ 软件质量方面的一个咨询网站,有过程改进方面的一些资料提供
    http://www.tcse.org/ IEEE的一个软件工程技术委员会,提供技术论文下载,并有一个功能强大的分类下载搜索功能,可以搜索到测试类型、测试管理、测试分析等各方面资料
    http://www.testing.com/ 测试技术专家Brain Marick的主页,包含了Marick 研究的一些资料和论文,该网页提供了测试模式方面的资料,值得研究。总之,如果对测试实践感兴趣,该网站一定不能错过
    http://www.testingcenter.com/ 有一些测试方面的课程体系,有一些价值
    http://www.testingconferences.com/asiastar/home 著名的AsiaStar测试国际学术会议官方网站,感兴趣的人一定不能错过
    http://www.testingstuff.com/ Kerry Zallar的个人主页,提供一些有关培训、工具、会议、论文方面的参考信息
    http://www-sqi.cit.gu.edu.au/ 软件质量机构,有一些技术资料可以供下载,包括软件产品质量模型、再工程、软件质量改进等
    http://www.csc.ncsu.edu/faculty/xie/softtestingedu.html

    http://www.testingeducation.org/

    http://www.qasoftwaretesting.com/

    http://www.onestoptesting.com/

    http://www.devbistro.com/articles/Testing/ 

    http://www.soft.com/Institute/HotList/index.html

    http://www.softwaretestingwiki.com/doku.php

    http://www.softwareqatest.com/

    http://www.aptest.com/resources.html

    http://www.cc.gatech.edu/classes/AY2005/cs4803epr_spring/ 国外大学的性能测试课程

    http://www.testing-post.com/testing/ 测试论坛

    http://www.stpmag.com/ 国外的软件测试电子杂志

    http://www.workroom-productions.com/papers.html E文文章下载站点

    http://www.informit.com/articles/index.asp?st=41368 E文文章下载站点
    http://www.informit.com/articles/index.asp?st=41271
     E文文章下载站点

    http://testertested.blogspot.com/2007/02/there-is-no-four-and-six-in-testing.html

     

     

  • what is good test case学习笔记

    2009-01-13 13:50:16

    测试用例体现测试思想

    运行测试的收获
    1 发现软件缺陷
    2 找到更多的bug
    3 阻止产品的提前发布
    4 帮助经理做决定(发布or not)
    5 降低技术支持的费用
    6 评估与规格说明书的一致性
    7 符合规律
    8 降低法律诉讼的风险
    9 找到正确的方法使用该产品(找出软件如何工作,不会有bug出现)
    10 评估软件质量
    11 验证产品的正确性
    12 质量保证

    测试的两个目标
    1找出bug
    2使bug修复
     
    好的测试用例
    1、强大的(能找出bug的)
    2  产生重大的结果(经理等决策人需要强制修改问题)
    3  可信的
    4  客户经常使用的功能,触发的事件
    5  比较容易衡量的(容易看到结果的)
    6  发现bug并且可以确定问题所在
    7  可以帮助获得更多的信息
    8  适当的复杂(不能太复杂)
    9  可以帮助测试和程序员改进产品的方面,易用性,或者环境


    测试类型和测试质量
      测试种类
    功能测试
    域测试
    基于规范的测试
    基于风险的测试
    压力测试
    回归测试
    用户测试
    场景测试
    状态模型测试
    大批量自动化测试
    探索性测试

     

    功能测试
    测试系统功能,特点(好的用例关注一个重点)

    域测试(划分等价类?)
    域测试的核心就是取样,关注他们的不同点,每次就一个不同点测试

    基于规范的测试
    基于需求说明书,测试系统

    基于风险的测试
    假设可以使程序失败的方式,然后设计一些用例去测试程序是否会在这种情况下失败
    测试的目的:列出项目的风险

    压力测试

    回归测试
    保存测试用例并且重复用他们,当程序做了修改后运行的测试

    用户测试(接收测试)
    由用户充当测试测试系统

    场景测试
    场景测试是在假设的基础上进行的,在测试中去检查在假设的情况下程序运行的情况

    状态模型测试(状态转换测试)
    可见的行为模式的状态模型及状态模型的转变,验证程序状态转换的正确性

    大并发量自动化测试(并发测试)
    大并发量运行程序,看系统的相应情况,

    探索性测试
    是在按照测试工程师运行和用户的一些指标设计测试用例的基础上,设计新的更好的测试用例去发现问题
    测试必须做一些调查分析,例如,学习熟悉系统,查看缺陷历史分析产品,看代码和查访用户,阅读规格说明书,然后在更新自己的测试用例,对产品的进一步测试

  • 一个关于自动化测试框架的书

    2009-01-08 17:33:54

  • 功能自动化测试工具为我们带来了什么

    2009-01-08 17:31:28

    功能自动化测试工具为我们带来了什么呢?我不知道大家如何看待这个问题,我总觉的很多人把功能的自动化测试工具看的特别的“厉害”,觉得可以完成很多的工作。领导会说,如果我们用工具进行回归测试,会很快的发现问题,然后减少回归测试的时间,提高项目的效率,如此这般公司开始推行自动化工具

    幸运的,我开始成为自动化工具的推广者,曾经用过自动化测试工具selenium进行简单的自动化测试,因为项目是多省系统,进行系统测试时,重复内容比较多,但是程序又相对稳定。于是在测试的间隙,完成自动化测试脚本,在系统测试中运行测试。效果还是比较好的,现在想想当时的脚本真的是非常脆弱而且是简单的,没有任何的控制语句,场景回复,脚本的维护量比较大,一旦出现问题,脚本跑不通,只能人工排查原因,自动化测试的部分只在系统测试中站系统测试百分之五十的工作量,但是在整个测试的工作量中百分之十都不到,大家仿似看到此时自动化测试的甜头,希望在整个公司中推广自动化测试工具,觉得自动化测试是一种趋势,一种必然,于是我站在风头浪尖开始试着完成这项工作

    自动化测试同手工测试一样,都需要有一个计划,测试的覆盖率,评估自动化测试工具是否能带来收益来确定测试的内容,其实,并不是所有项目都适合自动化测试工具的,如果项目周期短,是不适宜做自动化测试的,自动化测试虽然在运行中比较省时间,但是在前期的设计,脚本的编写和维护都会浪费较多的时间,如果自动化测试脚本不能重复利用多次,自动化对于我们只是一种时间的浪费,只会令整个项目延期。如果你要用qtp这种识别gui属性的工具必须要等待页面功能稳定以后才能进行自动化脚本的设计,因为任何一个控件的修改都会导致自动化工具不能识别控件。其次,自动化和手工测试都需要完成用例的设计,手工测试用例有相应的输入输出,自动化脚本也需要,最好能参数化进行。

    自动化测试是否能代替手工测试呢?多少人重复的问这这个问题,答案是不能,自动化测试最大的用处是保证测试的质量,而不是发现问题,而手工测试是发现问题。因为我们每次的回归测试,如果是手工测试的情况由于时间的关系并不能因为一个模块的bug,去测试其他的模块,而自动化测试工具的加入,可以保证所以模块的基本功能,每次回归用手工去发现验证问题,用自动化工具去保证整个软件的基本功能正常运行,自动化的推广是逐步的,首先做一些冒烟测试的自动化,随后把一些主要的功能和测试点也加进来,但是千万不要太细化,到所有手工测试的点,这样,会带来很大的风险,自动化程度越高,风险将越大。

    自动化的另外一个注意点就是管理,引入一项内容,必然就需要花一定的时间对引入的内容做管理,例如用td管理工具,一定有相应的说明文档,使他不依赖于某个人,以至于某个人的离职不会对自动化工作造成太大的打击。

        自动化测试工具带来了什么?带来了质量的保证同时也引入了问题,看你如何规避各种各样的问题,让自动化测试工具为你所用啦  

  • qtp关于DTsheet的一些操作

    2008-12-18 14:50:26

         这两天正在推进自动化测试工具的使用,频繁使用到datatable的一些方法,把一些常用方法放上来,增强一下记忆,呵呵
         

         DTSheet.GetCurrentRow  
         显示当前data sheet参数运行的行数
         例 row = DataTable.GetSheet("MySheet").GetCurrentRow

         DTSheet.GetParameterCount 
         显示当前data sheet的总列数
         例:paramcount = DataTable.GetSheet("MySheet").GetParameterCount

         DTSheet.GetRowCount
         显示当前data sheet的总行数
         例  rowcount = DataTable.GetSheet("MySheet").GetRowCount

         DTSheet.SetCurrentRow(RowNumber) 
         设置当前运行的行数
         例 DataTable.GetSheet("MySheet").SetCurrentRow(2)

  • QTP如何启动应用程序(转)

    2008-12-17 14:35:17

    qtp提供了很多自动启动应用程序的办法,方法如下:
            1)SystemUtil.Run 允许启动新的进程
            格式:SystemUtil.Run file, [params], [dir], [op], [mode]
            下面代码利用SystemUtil对象如何启动进程。

            '启动IE

              SystemUtil.Run "iexplore.exe"
             SystemUtil.Run "iexplore.exe", "http://www.51testing.com/?72" '打开pcl blog
             SystemUtil.Run "iexplore.exe", "http://www.knowledgeinbox.com", , , 3

            '打开电影播放器
             SystemUtil.Run "mplayerc.exe  E:\movie\[2007.12.16]尖峰时刻3[2007成龙动作](帝国出品)\影视帝国(bbs.cnxp.com).尖峰时刻3.Rush.Hour.3.2007.DVDRip.cd1.rmvb  /play"


            2)InvokeApplication 启动应用程序
            格式:InvokeApplication(Command [,StartIn])

            例子:
            '启动ie
               InvokeApplication "IEXPLORE.EXE"
            '启动计算器
               InvokeApplication "calc.exe"

            3) COM - Wsh
               利用Wsh对象进行启动
            例子:

                Dim oShell
               set ōShell= CreateObject ("Wscrīpt.shell")
               oShell.Run "IEXPLORE.EXE"
               Set ōShell = Nothing

            4)Qtp自动启动应用程序
              Qtp打开 Automation-〉Record and Run Settings 下进行设置

            5)录制启动过程

              Dialog("运行").WinEdit("打开(O):").Set "calc"
             Dialog("运行").WinButton("确定").Click

  • 前段时间工作总结

    2008-11-26 21:00:23

       前段时间比较忙刚好赶上电信c网改造,加班,通宵,这段时间的工作只是短暂的支持,没有接触到比较深的测试内容,但是自己再跟客户的沟通上学习了很多东西

       首先,主动向上级回报自己的工作情况,当上级分配了你一项任务,培训,技术支持,一个回归测试,每当完成这些任务应该主动发邮件,沟通,告诉他你在做什么,让他了解你的工作,工作的结果,各方的反馈意见,而不要让他总问,你的工作怎样了。在工作中请采取主动。

        跟领导多沟通了解他让你做每一件事情的意图。我总不喜欢只会下命令的领导,因为这样很可能你做的东西他不满意,你应该知道做这个事情是为了什么,这样你也有安排有计划,心中有个尺度。才可以跟领导保持一致,弄清楚他想从你这里得到什么,你才能做的更加的完美,所以请跟领导多沟通,了解他的意图

        跟客户沟通的技巧,保持愉悦的心情。跟客户沟通也不是特别顺利,总有这样那样的人会使你心情不愉快,但你一定要保持风度,完成自己应该完成的事情,在沟通中了解业务,学习业务。保持愉快的心情,工作的不高兴不要影响自己的生活质量

        完善的测试流程,因为这次的上线任务比较紧急,而且还有许多需要和客户交涉的事情,测试人员分工也不是特别明确,导致测试人员不能集中测试,改版时间的紧急不能写测试用例,上线后反应了很多问题,都是平常漏测的东西。所以下次需要尽量的详细测试,保证质量。

      

  • 性能测试(并发负载压力)测试分析(转载)

    2008-10-11 16:12:55

    分析原则:

     

    • 具体问题具体分析(这是由于不同的应用系统,不同的
    测试目的,不同的性能关注点) 

     

    • 查找瓶颈时按以下顺序,由易到难。

     

              服务器硬件瓶颈

              网络瓶颈(对局域网,可以不考虑)

              服务器
    操作系统瓶颈(参数配置)

              中间件瓶颈(参数配置,
    数据库web 服务器等)

              应用瓶颈(
    SQL 语句、数据库设计、业务逻辑、算法等)

     

        注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。

     

    • 分段排除法 很有效

     

    分析的信息来源:

              • 1 根据场景运行过程中的错误提示信息

              • 2 根据测试结果收集到的监控指标数据

     

    一.错误提示分析

     

    分析实例:

    1     • Error: Failed to connect to server “ 10.10.10 .30:8080 ″ : [10060] Connection

    • Error: timed out Error: Server “ 10.10.10 .30 ″ has shut down the connection prematurely

    分析:

    • A 、应用服务死掉。

    (小用户时:程序上的问题。程序上处理数据库的问题)

    • B 、应用服务没有死

    (应用服务参数设置问题)

     

        例:在许多客户端连接 Weblogic 应用服务器被拒绝,而在服务器端没有错误显示,则有可能是 Weblogic 中的 server 元素的 AcceptBacklog 属性值设得过低。如果连接时收到 connection refused 消息,说明应提高该值,每次增加 25 %

     

    • C 、数据库的连接

     

    (1 、在应用服务的性能参数可能太小了 2 、数据库启动的最大连接数(跟硬件的内存有关) )

     

    2 Error: Page download timeout (120 seconds) has expired

     

    分析:可能是以下原因造成

     

              • A 、应用服务参数设置太大导致服务器的瓶颈

              • B 、页面中图片太多

              • C 、在程序处理表的时候检查字段太大多

     

    二.监控指标数据分析

     

    1 .最大并发用户数:

     

    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。

     

              在方案运行中,如果出现了大于 3 个用户的业务操作失败,或出现了服务器 shutdown 的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。

              如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么 OK 。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。

     

    2 .业务操作响应时间:

     

              • 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。

              • 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?

              • 如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题

     

    3 .服务器资源监控指标:

     

    内存:

     

    1 UNIX 资源监控中指标内存页交换速率( Paging rate ),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。

     

    2
    Windows 资源监控中,如果 Process\Private Bytes 计数器和 Process\Working Set 计数器的值在长时间内持续升高,同时 Memory\Available bytes 计数器的值持续降低,则很可能存在内存泄漏。

     

    内存资源成为系统性能的瓶颈的征兆 :

     

              很高的换页率 (high pageout rate);

              进程进入不活动状态 ;

              交换区所有磁盘的活动次数可高 ;

              可高的全局系统 CPU 利用率 ; 

              内存不够出错 (out of memory errors)

     

    处理器:

     

    1 UNIX 资源监控( Windows 操作系统同理)中指标 CPU 占用率( CPU utilization ),如果该值持续超过 95% ,表明瓶颈是 CPU 。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于 SQL Server, 可接受的最大上限是 80-85% 

     

    合理使用的范围在 60% 至 70% 。

     

    2 Windows 资源监控中,如果 System\Processor Queue Length 大于 2 ,而处理器利用率( Processor Time )一直很低,则存在着处理器阻塞。

     

    CPU 资源成为系统性能的瓶颈的征兆 : 

     

              很慢的响应时间 (slow response time) 

              CPU 空闲时间为零 (zero percent idle CPU) 

              过高的用户占用 CPU 时间 (high percent user CPU) 

              过高的系统占用 CPU 时间 (high percent system CPU) 

              长时间的有很长的运行进程队列 (large run queue size sustained over time)

     

    磁盘 I/O :

     

    1 UNIX 资源监控( Windows 操作系统同理)中指标磁盘交换率( Disk rate ),如果该参数值一直很高,表明 I/O 有问题。可考虑更换更快的硬盘系统。

     

    2 Windows 资源监控中,如果 Disk Time 和 Avg.Disk Queue Length 的值很高,而 Page Reads/sec 页面读取操作速率很低,则可能存在磁盘瓶径。

     

    I/O 资源成为系统性能的瓶颈的征兆 :

     

              过高的磁盘利用率 (high disk utilization) 

              太长的磁盘等待队列 (large disk queue length) 

              等待磁盘 I/O 的时间所占的百分率太高 (large percentage of time waiting for disk I/O) 

              太高的物理 I/O 速率 :large physical I/O rate(not sufficient in itself) 

              过低的缓存命中率 (low buffer cache hit ratio(not sufficient in itself)) 

              太长的运行进程队列,但 CPU 却空闲 (large run queue with idle CPU)

     

    4 .数据库服务器:

     

    SQL Server 数据库:

     

    1 SQLServer 资源监控中指标缓存点击率( Cache Hit Ratio ),该值越高越好。如果持续低于 80% ,应考虑增加内存。

     

    2 如果 Full Scans/sec (全表扫描 / 秒)计数器显示的值比 1 或 2 高,则应分析你的查询以确定是否确实需要全表扫描,以及 SQL 查询是否可以被优化。  

     

    3 Number of Deadlocks/sec( 死锁的数量 / 秒 ) :死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为 0 。

     

    4 Lock Requests/sec( 锁请求 / 秒 ) ,通过优化查询来减少读取次数,可以减少该计数器的值。

     

    Oracle 数据库:

     

    1 如果自由内存接近于 0 而且库快存或数据字典快存的命中率小于 0.90 ,那么需要增加 SHARED_POOL_SIZE 的大小。

     

    快存(共享 SQL 区)和数据字典快存的命中率:  

     

    select(sum(pins-reloads))/sum(pins) from v$librarycache; 

     

    select(sum(gets-getmisses))/sum(gets) from v$rowcache; 

     

    自由内存: select * from v$sgastat where name= ’ free memory ’ ; 

     

    2 如果数据的缓存命中率小于 0.90 ,那么需要加大 DB_BLOCK_BUFFERS 参数的值(单位:块)。

     

    缓冲区高速缓存命中率:

     

    select name,value from v$sysstat where name in (’db block gets’,

     

    ‘ consistent gets’,'physical reads’) ;

     

    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))

     

    3 如果
    日志缓冲区申请的值较大,则应加大 LOG_BUFFER 参数的值。

     

    日志缓冲区的申请情况 :

     

    select name,value from v$sysstat where name = ‘redo log space requests’ ;

     

    4 如果内存排序命中率小于 0.95 ,则应加大 SORT_AREA_SIZE 以避免磁盘排序 。

     

    内存排序命中率 :

     

    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’

     

    注:上述 SQL Server 和 Oracle 数据库分析,只是一些简单、基本的分析,特别是 Oracle 数据库的分析和优化,是一门专门的
    技术,进一步的分析可查相关资料。
  • 自动化测试框架指南(转载)

    2008-09-09 10:31:22

    这是我以前写的一篇文章,用于整理自己对自动化测试的理解。当时写这个文章的目的,是因为刚刚掌握QTP,又使用自动化测试参与公司一个大项目的测试,结果发现原来掌握QTP距离自动化测试还有很遥远的路要走,原来一直以为掌握了QTP的脚本编写、可以写出所有的测试方法脚本则自动化测试就可以大功告成了。但是现实是残酷的,实际和自己所想的相差太远了——实际的情况是需求变化快,甚至有段时间开发还没有需求变化快,自动化测试脚本的维护工作量就可想而知了。

    因此我当时就咨询了一下其他的测试同行,他们都认为测试代码复用是很重要的问题,要搭建一个好的测试框架,这就是我当时写这篇文章的目的。

    但是在写了这篇文章后,因为工作原因没有用实践去验证文章里的思想,直到今天才有时间来温习以前的教训。今天来按实际来做时,发现了一个问题——用什么方式来划分test level service function 的颗粒呢?
    打个比方来说,我要写一个测试函数,实现以下功能:我要测试的是登录一个系统,打开一个页面,然后新建一条记录。
    因为还有其他的测试函数,肯定与这个函数有相同的代码部分,比如登录就是显而易见,但是还有一些代码肯定也是重复,而且是隐藏的,那么用什么方法把它们挖掘出来,细分的原则是什么?我实在想不清楚,需要大家的指点


    文章里的一些内容取自别人的帖子或与同行的交流,所以只能算是半原创

    自动化测试框架指南

    以下只是测试框架的一点设想,需要以后修改;
    这套方案的最终结果是实现测试自动化,但是因为目前人力、实力有限,只能逐步完善设想中的功能;最终的目的是要实现define the driver——定义驱动测试。
    本文的自动化测试以MI公司的QuickTest professional 为例
    1定义:
            Services function :业务函数
            TestCase(测试用例):是能够从头至尾独立执行的最小测试单元
            测试框架的设想

    1.1Services Function 的分类及分类原则
    Service Function的颗粒大小需求不一,靠自己来掌握,总之应该是尽量少的Service Function满足所有Case Function的需要
            Common level¬——所有项目测试都可以使用的函数,比如验证小数精度、写测试结果到报告等等。
    Common level是公用的函数库,不需要经常修改,因此可以编成DLL文件,供所有的测试脚本使用。
    使用语法可以这样:
    ‘------------------------------------
    Set ōbject=createobject(“”)
    Call object.funciton “”
    ‘------------------------------------

            High level¬——各项目专用的测试用例,是为专门的测试项目而设置的,但是这些Services Function不能单独作测试,必须配合更高一级的Test level才能使用
            Test level¬¬——Test level可以这样理解:是对某一个用户来说,为了完成某项工作和业务,时间从头至尾相对连续的一组操作。
            Test level并不是测试用例,但是它的颗粒大小却决定了其复用程度,因此需要仔细分析每个TestCase的业务逻辑,将相同的Test Level services function 总结出来。
            Test level的组成:
    Function
    Step          ‘测试所要进行的操作
    Validation     ‘验证测试的结果
    Return result   ‘返回测试的结果,validation的验证结果也应该通过这一部分的函数写入到result report中
    End function

    1.2 Test case 和Test suite
            Test Case:测试用例。可以这样理解:是一组人为了完成某项工作和业务,时间从头至尾相对连续的一组操作
            Test suite: 是一个相同工作性质的工作部门人员,为了完成某项工作和业务,时间从头至尾相对连续的一组操作。
            Test case和Test suite的意义:
    1、大量的Case,肯定是分模块存放的。否则就难以查询和维护、修改。
    2、Test Case和Test level \high level service function的互相调用关系可以通过insight sources这个工具来查询。
    3、Suite相当于一个Case模块,里面包含很多个Case;比如测试用户管理的,都放在一个Suite里,测试设备管理的,放在另一个suite里。
    1.3TestCase的分类原则
            一般复杂Case,要牵扯到好多个模块的功能的,但是要看它的主要测试点是什么,然后按这个测试点所属模块,来确定这个Case归属哪个模块的。
            有依赖关系的Case,是合并成一个Case,还是保留独立?运行起来有依赖关系,倾向于合并成一个Case,合并的好处是运行方便,但是出错时要再区分是那个小Case的错误;分开的话,就相反,运行不方便,但出错时比较明确哪个错了。
            如果A是建10万个用户,要花1小时的时间,那你还会放在一块嘛,肯定是倾向分开成小Case,不然B出错了,你还得再重头跑ABCD,测试人员会气死的!所以运行麻烦、容易出错、时间较长的小case,还是保持独立,只要跟测试人员写好说明文档,让他们知道正确的运行方法,就可以了
            如果合成一个case,我应该把它放到哪个suite里呢 因为它横跨了几个页面,都是测试点,不好划分啊。放在那个Suite里啊,那都可以啊,或者你想独立一个suite也可以啊,无所谓的,只要你运行结果有正确记录,不会漏掉丢失就可以了。
            测试环境可以通过重新导入数据来恢复,这样就可以将一部分运行时间长、但是又有依赖关系的Test case分离出来,避免总是要从开头进行测试。
            一个Test suite里的用到的lib和OR都是相同的。




    1.4测试用例和Services Function命名规则
    类型        名称
    Test case        项目名_TC_name
    test level services function        项目名_TL_name
    high level services function        项目名_HL_name
    common level services function        CL_name(不应包括项目名,因为此类函数是公用的)
    2工作方式
    并非所有的测试用例都可以用自动化来完成,因此需要对用例进行挑选,选择合适的用例作为自动化测试用例。记住!自动化测试的成本是巨大的,一般来说,一个脚本运行6~7次才算收回成本,因此不可寄予自动化测试过高期望。
    2.1选择自动化测试用例
    2.1.1不适合自动化测试用例的情况
            定制型项目(一次性的)。为客户定制的项目,维护期由客户方承担的,甚至采用的开发语言、运行环境也是客户特别要求的,即公司在这方面的测试积累就少,这样的项目不适合作自动化测试。
            项目周期很短的项目。项目周期很短,测试周期很短,就不值得花精力去投资自动化测试,好不容易建立起的测试脚本,不能得到重复的利用是不现实的。
            业务规则复杂的对象。业务规则复杂的对象,有很多的逻辑关系、运算关系,工具就很难测试。
            美观、声音、易用性测试。人的感观方面的:界面的美观、声音的体验、易用性的测试,也只有人来测试。
            测试很少运行。测试很少运行,对自动化测试就是一种浪费。自动化测试就是让它不厌其烦的、反反复复的运行才有效率。
            软件不稳定。软件不稳定,则会由于这些不稳定因素导致自动化测试失败。只有当软件达到相对的稳定,没有界面性严重错误和中断错误才能开始自动化测试。
            涉及物理交互。工具很难完成与物理设备的交互,比如刷卡的测试等。
    2.1.2适合自动化测试的情况
    自动化测试之所以能在很多大公司实施起来,就是有它适合自动化测试的特点和高的投资回报率。
            产品型项目。产品型的项目,每个项目只改进少量的功能,但每个项目必须反反复复的测试那些没有改动过的功能。这部分测试完全可以让自动化测试来承担, 同时可以把新加入的功能的测试也慢慢地加入到自动化测试当中。
            增量式开发、持续集成项目。由于这种开发模式是频繁的发布新版本进行测试,也就需要频繁的自动化测试,以便把人从中解脱出来测试新的功能。
            能够自动编译、自动发布的系统。要能够完全实现自动化测试,必须具有能够自动化编译,自动化发布系统进行测试的功能。 当然,不能达到这个要求也可以在手工干预的情况下进行自动化测试。
            回归测试。回归测试是自动化测试的强项,它能够很好的验证你是否引入了新的缺陷,老的缺陷是否修改过来了。在某种程度上可以把自动化测试工具叫做回归测试工具。
            多次重复、机械性动作,将烦琐的任务转化为自动化测试。自动化测试最适用于多次重复、机械性动作,这样的测试对它来说从不会失败。比如要向系统输入大量的相似数据来测试压力和报表。
            需要频繁运行测试。在一个项目中需要频繁的运行测试,测试周期按天算,就能最大限度的利用测试脚本,提高工作效率。
    2.2编写Test case和Test level
    分析Test Case的业务,将Test Level services function 的颗粒从Test Case中识别出来,尽量做到用少的Service function来实现测试业务。
    2.3搭建测试框架
    依据测试框架,在下一节中提到。依次填入测试框架的内容。
    2.4执行测试并记录bug
    这时就可以开始执行测试。测试结果应该自动被记录在测试报告中,而不应该一遇到BUG就停止——除非必须停止。这里注意以下几点
            测试报告功能应该在Common level中实现,这样所有的测试都可以共用。
            测试框架应该具有一定的判断功能,一旦某个测试失败。测试框架可以决定停止测试,或者转入不受影响的新测试用例,Test suite分类也应该注意这一点,因为同一个Test suite一般来说是互相影响的。
            测试框架可以具有某种还原测试环境的功能——即测试结束清理的功能,这样就可以自动恢复到不受影响的测试环境中。
    2.5维护测试脚本
    这是一项工作量很大的工作。维护脚本的难度很大程度上与团队活动有关,相关信息参考第4节。
    3测试框架的构想
    3.1Test Driver
    测试框架的核心叫Test driver,它具有以下一些东西
            全局参数。
            所要测试的用例集,也许叫Test suite集更合适;包括测试所要用到的参数。
            对于用例的描述。
            lib and tsr。
            能够判断测试结果,并且决定是否调用其它的测试用例,或者停止测试。
            自动生成测试报告。以及需要输出的路径。
            每个测试脚本的初始设置路径
    4团队开展自动化测试要点
    单人自动化测试与团队开展自动化测试有很大不同,因为不同的对象名、不同的函数会造成每个人的测试脚本不同,并难以合并成一个完整、统一的脚本。为了解决这个问题,应该注意以下几点:
            团队成员在编写脚本时应该多使用对象库,尽量少使用描述性编程。
            统一对象名称,规定网页元素对象命名的统一规定,这样才可能在合并对象库时统一。
            统一函数命名规定。
            统一函数书写格式。
            统一对同一类型操作的处理方式——应该定期举行会议,沟通各种操作的处理方法,共同提高对系统的认识水平。
    5测试配置
    测试配置应该尽量自动完成,减少工作量。
    测试配置包括如下内容:
            测试工具的配置
            测试环境,如数据、数据库结构
    6测试初始设置
    一些测试用例相互依赖,本应该把它们合成一个测试用例;但是如果单个测试用例颗粒很大,那么在回归测试或再现缺陷时就会使人发疯,并且浪费了大量的测试时间。最好最可靠的解决办法看来只有一种,那就是将颗粒大的测试用例分离出来,同时为这个测试用例预备测试初始设置——将客户端所需要的数据库结构和数据库备份,并且作为测试初始设置保存管理。
    这里的测试初始设置并非只针对自动化测试,手工测试也被包括进来。
    6.1测试初始设置的命名办法
    TE+测试用例编号
    如测试用例为TC1.2,则TE为TE1.2
    6.2测试初始设置的保存
    测试初始设置应保存在单独的文件夹内,初始设置的路径被链接到Test driver上。
  • 一篇关于session的好文章,写的很详细(转载)

    2008-09-03 16:37:45

    一、术语session
    二、HTTP协议与状态保持
    三、理解cookie机制
    四、理解session机制
    五、理解javax.servlet.http.HttpSession
    六、HttpSession常见问题
    七、跨应用程序的session共享
    八、总结
    参考文档

    一、术语session
    在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。

    session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。

    然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者 “一个POP3 session”③。

    而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。

    鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。
    在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥

    二、HTTP协议与状态保持
    HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。

    然而聪明(或者贪心?)的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。

    让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
    1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。
    2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。
    3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

    由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

    三、理解cookie机制
    cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。

    正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如Javascrīpt或者VBscrīpt也可以生成cookie。

    而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

    cookie的内容主要包括:名字,值,过期时间,路径和域。
    其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。
    路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。
    路径与域合在一起就构成了cookie的作用范围。
    如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

    存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascrīpt的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。

    下面就是一个goolge设置cookie的响应头的例子
    HTTP/1.1 302 Found
    Location: http://www.google.com/intl/zh-CN/
    Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
    Content-Type: text/html

    这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分

    浏览器在再次访问goolge的资源时自动向外发送cookie

    使用Firefox可以很容易的观察现有的cookie的值
    使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。

    IE也可以设置在接受cookie前询问

    这是一个询问接受cookie的对话框。

    四、理解session机制
    session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

    当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

    保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

    由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
    为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

    另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单
    <form name="testform" action="/xxx">
    <input type="text">
    </form>
    在被传递给客户端之前将被改写成
    <form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text">
    </form>
    这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。
    实际上这种技术可以简单的用对action应用URL重写来代替。

    在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

    恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

    五、理解javax.servlet.http.HttpSession
    HttpSession是Java平台对session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。

    首先,Weblogic Server提供了一系列的参数来控制它的HttpSession的实现,包括使用cookie的开关选项,使用URL重写的开关选项,session持久化的设置,session失效时间的设置,以及针对cookie的各种设置,比如设置cookie的名字、路径、域, cookie的生存时间等。

    一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。

    复制严格说来不算持久化保存,因为session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。

    cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。

    cookie的路径对于web应用程序来说是一个非常重要的选项,Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。

    关于session的设置参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869

    六、HttpSession常见问题
    (在本小节中session的含义为⑤和⑥的混合)


    1、session在何时被创建
    一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。

    由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

    2、session何时被删除
    综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)

    3、如何做到在浏览器关闭时删除session
    严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascrīpt代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

    4、有个HttpSessionListener是怎么回事
    你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

    5、存放在session中的对象必须是可序列化的吗
    不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。

    6、如何才能正确的应付客户端禁止cookie的可能性
    对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见[6]
    http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

    7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session
    参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。

    8、如何防止用户打开两个浏览器窗口操作导致的session混乱
    这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascrīpt window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。

    9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue
    做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。

    10、为什么session不见了
    排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。
    出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。

    七、跨应用程序的session共享

    常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。

    然而按照Servlet规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。

    首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。

    根据这个特性,我们可以推测Tomcat中session的内存结构大致如下。

    笔者以前用过的iPlanet也采用的是同样的方式,估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器,解决的思路很简单,实际实行起来也不难。要么让所有的应用程序共享一个session id,要么让应用程序能够获得其他应用程序的session id。

    iPlanet中有一种很简单的方法来实现共享一个session id,那就是把各个应用程序的cookie路径都设为/(实际上应该是/NASApp,对于应用程序来讲它的作用相当于根)。
    <session-info>
    <path>/NASApp</path>
    </session-info>

    需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面加上应用程序的前缀,使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo"),以防止命名空间冲突,导致互相覆盖。


    在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还可以有一些手段来共享session。对于版本4以上的Tomcat,目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段。

    我们再看一下Weblogic Server是如何处理session的。 

    从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/,这是不是意味着在Weblogic Server中默认的就可以共享session了呢?然而一个小实验即可证明即使不同的应用程序使用的是同一个session,各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下

    对于这样一种结构,在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端 cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,

    应用程序A
    context.setAttribute("appA", session);

    应用程序B
    contextA = context.getContext("/appA");
    HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");

    值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。

    那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。

    八、总结
    session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。
    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答

  • Web服务器如何做负载均衡

    2008-09-02 11:18:39

    Web应用服务器集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样。为了均衡集群服务 器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理。从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性。

      一、计算WEB服务器负载量的两种方法

      web应用服务器集群系统,是由一群同时运行同一个web应用的服务器组成的集群系统,在外界看来,就像是一个服务器一样。为了均衡集群服务器的负载,达到优化系统性能的目的,集群服务器将众多的访问请求,分散到系统中的不同节点进行处理。从而实现了更高的有效性和稳定性,而这也正是基于Web的企业应用所必须具备的特性。

      高可靠性可以看作为系统的一种冗余设定。对于一个特定的请求,如果所申请的服务器不能进行处理的话,那么其他的服务器能不能对之进行有效的处理呢?对于一个高效的系统,如果一个Web服务器失败的话,其他的服务器可以马上取代它的位置,对所申请的请求进行处理,而且这一过程对用户来说,要尽可能的透明,使用户察觉不到!

      稳定性决定了应用程序能否支持不断增长的用户请求数量,它是应用程序自身的一种能力。稳定性是影响系统性能的众多因素的一种有效的测量手段,包括机群系统所能支持的同时访问系统的最大用户数目以及处理一个请求所需要的时间。

      在现有众多的均衡服务器负载的方法中,广泛研究并使用的是以下两个方法:

      DNS负载平衡的方法RR-DNS(Round-Robin Domain Name System)

      负载均衡器

      以下,我们将就这两种方法进行讨论。

      二、DNS轮流排程的优势及缺点

      域名服务器(Domain Name Server)中的数据文件将主机名字映射到其IP地址。当你在浏览器中键入一个URL时(例如:www.loadbalancedsite.com),浏览器则将请求发送到DNS,要求其返回相应站点的IP地址,这被称为DNS查询。当浏览器获得该站点的IP地址后,便通过该IP地址连接到所要访问的站点,将页面展现在用户面前。

      域名服务器(DNS)通常包含一个单一的IP地址与该IP地址所映射的站点的名称的列表。在我们上面所假象的例子中,www.loadbalancedsite.com 这个站点的映射IP地址为203.24.23.3。

      为了利用DNS均衡服务器的负载,对于同一个站点来讲,在DNS服务器中同时拥有几个不同的IP地址。这几个IP地址代表集群中不同的机器,并在逻辑上映射到同一个站点名。通过我们的例子可以更好的理解这一点,www.loadbalancedsite.com将通过下面的三个IP地址发布到一个集群中的三台机器上:

      203.34.23.3

      203.34.23.4

      203.34.23.5

      在本例中,DNS服务器中包含下面的映射表:

      www.loadbalancedsite.com 203.34.23.3

      www.loadbalancedsite.com 203.34.23.4

      www.loadbalancedsite.com 203.34.23.5

      当第一个请求到达DNS服务器时,返回的是第一台机器的IP地址203.34.23.3;当第二个请求到达时,返回的是第二台机器的IP地址203.34.23.4,以此类推。当第四个请求到达时,第一台机器的IP地址将被再次返回,循环调用。


  • 系统架构

    2008-08-28 11:36:43

        说起这个问题,应该是上次去华为面试, 面试官问我你现在系统的架构是什么?我突然不知道如何回答,不知道应该回答什么内容,网上搜索了一些东西也没有什么收获,关键不知道从测试的角度如何去理解这个问题,近期在看微软的perfmance test guide,终于弄清楚了是怎么回事,在这里记一下

         系统的架构包括逻辑架构和物理架构,对于逻辑架构一般包括

    Client tier (the user’s machine) – presents requested data.(客户端)
    Presentation tier (the Web server) – handles all business logic and serves data to the client(s).(网络服务器)
    Data storage tier (the database server) – maintains data used by the system, typically in a relational database.(数据库服务器)

    对于复杂的逻辑架构会包括更多的层,而区分每个层,主要是按照每个层的相对独立的逻辑功能

    对于系统的物理架构主要是系统包含的硬件和软件,

    系统架构主要包含了该系统的逻辑架构和物理架构,我们只要把两张图和在一起就可以产生对性能测试非常有用的系统架构图,帮助我们分析性能瓶颈

  • 感冒了。。。

    2008-08-20 17:27:22

          感冒了,公司狭小的空间里弥漫着感冒的空气,好多人都生病了,好难受啊,今天用了快一卷卫生纸。。。。不生病多好。
  • 学计算机等于修电脑嘛~

    2008-08-19 17:44:19

         昨天回家晚了,本来安排的满满的时间,还打算晚上抽空看看奥运会,结果被老爸打乱了,要给别人看看电脑出现什么问题了,都不是一回了,想起来就有点郁闷,上次碰见了个强人(老爸朋友),让我教他学打字,我说要不你先学拼音吧,他说我不会,我说还有方式就是背五笔的字根,用五笔。他说这两个我都弄不了啊,年龄大了背也背不住,记也记不得,你有没有办法把我教会呢。。。。。我

         第二次帮助那个人从网上打印发货单,因为那人的打印人员没在,我说我教你吧,很简单,在我摸索怎么操作那个网页的时候,结果人家直接去看电视了。。。。我就跟小秘似的给人家干活。。。。也没把他教会

        这会这个,就是QQ游戏上不去,我看了电脑很干净,进程也比较正常,就是网络链接慢,我根本没有办法判断原因,就是上网慢。。。。杀毒软件和防火墙也很正常。我觉得应该是电信宽带的问题吧。结果人家非得让我给重装电脑,说什么也不信。。。。。我真的无语了,跟不懂电脑的人说电脑真的很痛苦,另外学计算机并不学这些啊。。。。哎。。。。

  • qtp实例网易免费邮登陆

    2008-08-18 13:41:21

    Dim b
    Browser("网易").Page("网易").Link("免费邮箱").Click
     
     Browser("网易163免费邮--中文邮箱第一品牌").Page("网易163免费邮--中文邮箱第一品牌").WebEdit("username").Set DataTable("user_name", dtGlobalSheet)
     Browser("网易163免费邮--中文邮箱第一品牌").Page("网易163免费邮--中文邮箱第一品牌").WebEdit("password").SetSecure DataTable("password", dtGlobalSheet)
     Browser("网易163免费邮--中文邮箱第一品牌").Page("网易163免费邮--中文邮箱第一品牌").WebButton("登录邮箱").Click

     If   Browser("网易163免费邮--中文邮箱第一品牌").Dialog("Microsoft Internet Explorer").Exist(1) Then
     error_message=Browser("网易163免费邮--中文邮箱第一品牌").Dialog("Microsoft Internet Explorer").Static("请输入您的用户名 ?").GetROProperty("regexpwndtitle")
     b=DataTable("check_message", dtGlobalSheet)
                                       If   (b=error_message)  Then
                           Browser("网易163免费邮--中文邮箱第一品牌").Dialog("Microsoft Internet Explorer").WinButton("确定").Click
                           reporter.ReportEvent micdone ,"成功:","执行与预期一致!"
                                                    Else  reporter.ReportEvent micFail ,"错误:","第"&i&"个用例实际执行结果与预期不一致!"
                                End If
      else
    Browser("网易163免费邮--中文邮箱第一品牌").Page("网易电子邮箱 - 极速3.0正式版").Sync
    Browser("网易163免费邮--中文邮箱第一品牌").Page("网易电子邮箱 - 极速3.0正式版").Check CheckPoint("网易电子邮箱 - 极速3.0正式版")
    reporter.ReportEvent micDone,"成功:","可以正常登陆"
    end if

    Browser("网易163免费邮--中文邮箱第一品牌").Close
    Browser("网易").Page("网易").Sync
    Browser("网易").Close

    主要实现了脚本和数据的分离,第一次试验,脚本会根据参数的函数运行三遍,每遍用不同的参数

251/212>
Open Toolbar