发布新日志

  • 有用的测试网站收集

    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

     

     

  • 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-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地址将被再次返回,循环调用。


  • 理解Load Average做好压力测试(转载)

    2008-08-05 14:25:26

    收集的东西觉得很好                

    发布时间: 2008-8-01 16:42    作者: 文初    来源: CSDNBlog

    SIP的第四期结束了,因为控制策略的丰富,早先的的压力测试结果已经无法反映在高并发和高压力下SIP的运行状况,因此需要重新作压力测试。跟在测试人员后面做了快一周的压力测试,压力测试的报告也正式出炉,本来也就算是告一段落,但第二天测试人员说要修改报告,由于这次作压力测试的同学是第一次作,有一个指标没有注意,因此需要修改几个测试结果。那个没有注意的指标就是load average,他和我一样开始只是注意了CPU,内存的使用状况,而没有太注意这个指标,这个指标与他们通常的限制(10左右)有差别。重新测试的结果由于这个指标被要求压低,最后的报告显然不如原来的好看。自己也没有深入过压力测试,但是觉得不搞明白对将来机器配置和扩容都会有影响,因此去问了DBA和SA,得到的结果相差很大,看来不得不自己去找找问题的根本所在了。

      通过下面的几个部分的了解,可以一步一步的找出Load Average在压力测试中真正的作用。

      CPU时间片

      为了提高程序执行效率,大家在很多应用中都采用了多线程模式,这样可以将原来的序列化执行变为并行执行,任务的分解以及并行执行能够极大地提高程序的运行效率。但这都是代码级别的表现,而硬件是如何支持的呢?那就要靠CPU的时间片模式来说明这一切。程序的任何指令的执行往往都会要竞争CPU这个最宝贵的资源,不论你的程序分成了多少个线程去执行不同的任务,他们都必须排队等待获取这个资源来计算和处理命令。先看看单CPU的情况。下面两图描述了时间片模式和非时间片模式下的线程执行的情况:

                            图 1 非时间片线程执行情况

                            图 2 非时间片线程执行情况

      在图一中可以看到,任何线程如果都排队等待CPU资源的获取,那么所谓的多线程就没有任何实际意义。图二中的CPU Manager只是我虚拟的一个角色,由它来分配和管理CPU的使用状况,此时多线程将会在运行过程中都有机会得到CPU资源,也真正实现了在单CPU的情况下实现多线程并行处理。

      多CPU的情况只是单CPU的扩展,当所有的CPU都满负荷运作的时候,就会对每一个CPU采用时间片的方式来提高效率。

      在Linux的内核处理过程中,每一个进程默认会有一个固定的时间片来执行命令(默认为1/100秒),这段时间内进程被分配到CPU,然后独占使用。如果使用完,同时未到时间片的规定时间,那么就主动放弃CPU的占用,如果到时间片尚未完成工作,那么CPU的使用权也会被收回,进程将会被中断挂起等待下一个时间片。

      CPU利用率和Load Average的区别

      压力测试不仅需要对业务场景的并发用户等压力参数作模拟,同时也需要在压力测试过程中随时关注机器的性能情况,来确保压力测试的有效性。当服务器长期处于一种超负荷的情况下运行,所能接收的压力并不是我们所认为的可接受的压力。就好比项目经理在给一个人估工作量的时候,每天都让这个人工作12个小时,那么所制定的项目计划就不是一个合理的计划,那个人迟早会垮掉,而影响整体的项目进度。

      CPU利用率在过去常常被我们这些外行认为是判断机器是否已经到了满负荷的一个标准,看到50%-60%的使用率就认为机器就已经压到了临界了。CPU利用率,顾名思义就是对于CPU的使用状况,这是对一个时间段内CPU使用状况的统计,通过这个指标可以看出在某一个时间段内CPU被占用的情况,如果被占用时间很高,那么就需要考虑CPU是否已经处于超负荷运作,长期超负荷运作对于机器本身来说是一种损害,因此必须将CPU的利用率控制在一定的比例下,以保证机器的正常运作。

      Load Average是CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。为什么要统计这个信息,这个信息的对于压力测试的影响究竟是怎么样的,那就通过一个类比来解释CPU利用率和Load Average的区别以及对于压力测试的指导意义。

      我们将CPU就类比为电话亭,每一个进程都是一个需要打电话的人。现在一共有4个电话亭(就好比我们的机器有4核),有10个人需要打电话。现在使用电话的规则是管理员会按照顺序给每一个人轮流分配1分钟的使用电话时间,如果使用者在1分钟内使用完毕,那么可以立刻将电话使用权返还给管理员,如果到了1分钟电话使用者还没有使用完毕,那么需要重新排队,等待再次分配使用。

                            图 3 电话使用场景

      上图中对于使用电话的用户又作了一次分类,1min的代表这些使用者占用电话时间小于等于1min,2min表示使用者占用电话时间小于等于2min,以此类推。根据电话使用规则,1min的用户只需要得到一次分配即可完成通话,而其他两类用户需要排队两次到三次。

      电话的利用率 =  sum (active use cpu time)/period

      每一个分配到电话的使用者使用电话时间的总和去除以统计的时间段。这里需要注意的是是使用电话的时间总和(sum(active use cpu time)),这与占用时间的总和(sum(occupy cpu time))是有区别的。(例如一个用户得到了一分钟的使用权,在10秒钟内打了电话,然后去查询号码本花了20秒钟,再用剩下的30秒打了另一个电话,那么占用了电话1分钟,实际只是使用了40秒)

      电话的Average Load体现的是在某一统计时间段内,所有使用电话的人加上等待电话分配的人一个平均统计。

      电话利用率的统计能够反映的是电话被使用的情况,当电话长期处于被使用而没有的到足够的时间休息间歇,那么对于电话硬件来说是一种超负荷的运作,需要调整使用频度。而电话Average Load却从另一个角度来展现对于电话使用状态的描述,Average Load越高说明对于电话资源的竞争越激烈,电话资源比较短缺。对于资源的申请和维护其实也是需要很大的成本,所以在这种高Average Load的情况下电话资源的长期“热竞争”也是对于硬件的一种损害。

      低利用率的情况下是否会有高Load Average的情况产生呢?理解占有时间和使用时间就可以知道,当分配时间片以后,是否使用完全取决于使用者,因此完全可能出现低利用率高Load Average的情况。由此来看,仅仅从CPU的使用率来判断CPU是否处于一种超负荷的工作状态还是不够的,必须结合Load Average来全局的看CPU的使用情况和申请情况。

      所以回过头来再看测试部对于Load Average的要求,在我们机器为8个CPU的情况下,控制在10 Load左右,也就是每一个CPU正在处理一个请求,同时还有2个在等待处理。看了看网上很多人的介绍一般来说Load简单的计算就是2* CPU个数减去1-2左右(这个只是网上看来的,未必是一个标准)。

      补充几点:

      1.对于CPU利用率和CPU Load Average的结果来判断性能问题。首先低CPU利用率不表明CPU不是瓶颈,竞争CPU的队列长期保持较长也是CPU超负荷的一种表现。对于应用来说可能会去花时间在I/O,Socket等方面,那么可以考虑是否后这些硬件的速度影响了整体的效率。

      这里最好的样板范例就是我在测试中发现的一个现象:SIP当前在处理过程中,为了提高处理效率,将控制策略以及计数信息都放置在Memcached Cache里面,当我将Memcached Cache配置扩容一倍以后,CPU的利用率以及Load都有所下降,其实也就是在处理任务的过程中,等待Socket的返回对于CPU的竞争也产生了影响。

      2.未来多CPU编程的重要性。现在服务器的CPU都是多CPU了,我们的服务器处理能力已经不再按照摩尔定律来发展。就我上面提到的电话亭场景来看,对于三种不同时间需求的用户来说,采用不同的分配顺序,我们可看到的Load Average就会有不同。假设我们统计Load的时间段为2分钟,如果将电话分配的顺序按照:1min的用户,2min的用户,3min的用户来分配,那么我们的Load Average将会最低,采用其他顺序将会有不同的结果。所以未来的多CPU编程可以更好的提高CPU的利用率,让程序跑的更快。

      以上所提到的内容未必都是很准确或者正确,如果有任何的偏差也请大家指出,可以纠正一些不清楚的概念。

     

Open Toolbar