偶是测试新手,希望前辈们能多多指教。

发布新日志

  • LoadRunner 监控Unix系统

    gcm_xp 发布于 2011-11-15 15:38:48

    LR里面add measurement,填写linux机器的IP,出现所有unix/linux的计数器,包括cpu的,mem的,disknetwork的。介绍几个常用的:


    average load :
    上一分钟同时处于“就绪”状态的平均进程数

    应该小于( CPU个数 * 核心数 * 0.7)

     

    cpu utilization:cpu的使用率,

    如果在75%以上,则可以考虑换CPU


    disk traffic:disk传输率

     

    Paging rate

    每秒钟读入物理内存或写入页面文件的页数,如果持续在几百,可能要加大内存了

    Swap-in rate

    正在交换的进程数 

    Swap-out rate

    正在交换的进程数

    Context switches rate

    每秒钟在进程或线程之间的切换次数

    System mode CPU utilization

    在系统模式下使用 CPU 的时间百分比

    User mode CPU utilization

    在用户模式下使用 CPU 的时间百分比

    Interrupt rate

    每秒内的设备中断数 

     

    Page-in rate

    每秒钟读入到物理内存中的页数

    Page-out rate

    每秒钟写入页面文件和从物理内存中删除的页数 

    LoadRunner采集的数据中,内存的使用情况是没有的,可以装sar,然后用sar来观察:

    可以使用该命令sar -n DEV -u -r 3 120 > perform.log

    这个命令3秒采样一次,共采样120 360秒=6分钟,可以根据自己的需要调整 3 120 这两个值。perform.log是保存的文件名

     

     

    Collision rate

    每秒钟在以太网上检测到的冲突数

    Disk rate

    磁盘传输速率

     

    Incoming packets error rate

    接收以太网数据包时每秒钟接收到的错误数 

    Incoming packets rate

    每秒钟传入的以太网数据包数 

    Outgoing packets errors rate

    发送以太网数据包时每秒钟发送的错误数 

    Outgoing packets rate

    每秒钟传出的以太网数据包数

    下列默认度量可用于 UNIX 计算机:

     

  • LoadRunner使用遇到的问题集锦

    msnshow 发布于 2011-11-12 23:58:14

    1、把HTML的内容输出到LOG中的方法

      1、在脚本要记录HTML的URL前面加入函数:web_create_html_param("MyHtml", "<html>", "");;

      2、在脚本要记录HTML的URL后面加入函数:lr_output_message("###the HTML is %s", lr_eval_string(" {MyHtml}"));;

      3、在Controller中设置Run-Time Settings,把log设置为Always Send Message;

      4、在Controller中设置Run-Time Settings,把Miscellaneous设置为在发生错误时继续运行(在这里不是必须);

      5、在Controller中设置Run-Time Settings,把Preferences设置为Enable image and text check;(在这里不是必须);

      6、在Controller的日志文件RES中可以查看到每个虚拟用户的LOG;

    2、如何在Controller中添加系统资源检测

      今天早上突然想把Windows的性能监视放到LR中,达到方便快捷的目的,下面的是具体的步骤:

      1、使用192.168.0.159作为监控的对象,开通Remote Procedure Call和Remote Registry两个服务,Remote Registry一般都是给禁止的,可以改为手动并启动;

      2、在159中右击我的电脑,选择管理->共享文件夹->共享 在这里面要有C$这个共享文件夹;

      3、在159中使用命令netstat /ano查看445端口是否被打开;

      4、输入\\192.168.0.159\c$,再输入用户名和密码,如果能进入c盘,那就说明有控制权了;

      5、在Controller的Run中找到Windows Resources,对图点击右键中的Add Measurements,添加计数器;

      6、需注意159机上的BlackIce;

      7、对Windows Resources Graph的技巧使用,可以冻结窗体,导出HMTL,显示某个计数器等;

    3、对ANALYSIS中不能导出页面细分下的子项的问题的处理方法?

      1、问题描述:对ANALYSIS的导出WORD功能中只能导出树中的图表,在页面细分中点击不同的节点会有不同的图表,但是却无法把所有节点的图表一起导出;

      2、如果想生成Time to First Buffer Breakdown下面Login事务和Loading事务下的图表都导出来,方法就是新建两张Time to First Buffer Breakdown图表,在不同的下面点击图表,并修改名称;

      3、在导出列表中选中要导出的图表:Time to First Buffer Breakdown-All && Time to First Buffer Breakdown-Login && Time to First Buffer Breakdown-Loading;

      4、总结:虽然这样做有点麻烦,但是比之前点击每个图再导出一个WORD来有用的多,但是LR可以做到在导出列表中以树的形式显示可以导出的图表,不过LR要解决图表没有名称的问题;

    4、在中文版Analysis中显示系统资源图的原因与解决

      1、是否可以通过修改ACCESS记录来修改这个BUG?

      2、不知道它添加图表的列表是不是通过数据库LOAD的?迄今还没有找到这些记录,只找到资源图表数据;

      3、解决办法1:是用VNC截图,但是这样只能看到计数器曲线,没什么意义;

      4、解决办法2:在Controller中导出系统资源数据,里面有量化数据,比较真实,不过每个场景都要导出一次就很麻烦,并且不好管理,无法对数据进行帅选和合并,如果打开导出的页面有乱码,那就在编码方式选择"自动选择";

      5、解决办法3:使用英文版生成的ANALYSIS,再拿到中文版下面,是可以看到系统资源这个图表的,其实我应该早想到这样的,因为在中文版下无法显示不是Analysis的错,而是Controller的错,Analysis里面是包括ACCESS和其它包含系统资源的记录的,所以在中文版是能显示的;

    5、终于使用LR实现了不同虚拟用户使用不用的帐号登陆,实行不同用户并发的问题

      1、在脚本设计中添加参数,参数名称为LoginUserName,选择参数类型为FILE;

      2、很关键的一步就是:选者UNIQUE和EACH ITERATION/ONCE;

      3、在脚本中把登陆名改为参数名;

      4、使用Controller进行测试,在运行时设置LOG记录;

      5、查看LOG,可以看到每个虚拟用户是使用不同的帐号登陆的;

      6、总结:使用SEQUENTIAL会使得参数每次出现的地方的值都不一样;如何想使用更多用户的登陆可以使用参数数据库化;

    (参考:LoadRunner参数化)

    6、 LR参数数据库化(姑且这么叫,就是参数的来源于数据库)实践

      1、以XQP登陆帐号为例,把bw_Users表中的UserName做为参数LoginUserName的值;

      2、过程都比较简单,需要注意的是使用FILE参数类型,参数值列表中的值只有100个,其它的可以通过Edit with Notepad查看;

      3、在Update Value on 中有以下几个选项:

      Each Occurrence:在运行时,每遇到一次该参数,便会取一个新的值;

      Each iteration:运行时,在每一次循环中都取相同的值;

      Once:运行时,在每次循环中,该参数只取一次值;

      可以看出,是按照从脚本小范围到大范围的选择;

      4、在Select next row 有以下几种选择:

      Sequential:按照顺序一行行的读取。每一个虚拟用户都会按照相同的顺序读取;

      Random:在每次循环里随机的读取一个,但是在循环中一直保持不变;

      Unique :唯一的数。注意:使用该类型必须注意数据表有足够多的数;

      Same Line As 某个参数(比如Name):和前面定义的参数Name 取同行的记录;通常用在有关联性的数据上面;

      可以看出,是和循环(迭代)很有关系的;

    7、 发现可以对参数数据库化的数据进行作弊,作弊方法如下:

      1、使用数据库管理器导出想要的数据为EXCEL;再保存为dat文件,再参数设置里面引用该文件;

      2、在脚本文件夹中找到[参数名].dat文件;

      3、对[参数名].dat文件进行编辑,把EXCEL中的数据拷贝到dat文件中;

      4、进入脚本编辑,查看参数,可以见到刚刚拷贝的数据;

      总结:虽然这个方法没什么很大用处,但是在无法使用VUGenerator连接数据库的时候就非常有用;

    8、当在此函数中,查找的text="中文"时,LR硬是报错,换成英文字体便成功。后来,查了好久,发觉是Record-Options 中我勾选了support charset中的UTF-8,可能是录制过程中LR捕捉到的是中文,而回放过程中此函数在HTML原文件中查找到的却是乱码?总而言之,把此选项去除之后,重新录制脚本,回放能够成功了!

     

    9LoadRunner场景执行时出现错误:“load generator is currently running the maximum number of vuser of this type”

    解决方法:

    Loadruuner默认场景并发最大用户数=1000,所以需要设置load generator->Details->Vuser limits->Other Vusers更换参数值即可,如10000;当然需要你的序列号是支持,目前最大支持6.2w的序列号。

  • 【转】使用LoadRunner监视Win XP服务器设置步骤

    msnshow 发布于 2010-04-01 21:42:46

    1 监视连接前的准备工作

    1)  在被监控WinXP主机上修改访问模式,办法是:安全策略在作怪(管理工具 -> 本地安全策略 -> 安全选项 -> "网络访问:本地帐户的共享和安全模式")。默认情况下,XP的访问方式是"仅来宾"的方式,那么你访问它,当然就固定为Guest来访问,而guest账户没有监控的权限,所以要把访问方式改为经典模式,这样就可以以administrator的身份登陆了。
    注意:一定需要设置密码,否则在MonitorConfiguration中添加 Measurements仍然会提示拒绝登录。
    2) 保证被监视的winXP系统开启以下三个服务Remote Procedure Call(RPC) Remote Registry Service Remote Registry其中Remote Procedure Call (RPC) Locator的登陆选项中要输入当前主机帐户和密码,然后重启该服务,其他服务设置不变。
    注意:网上有些写着只要开启两个服务Remote Procedure Call(RPC) Remote Registry Service就可以,不确认其监视的Windows版本,但是Win XP必须开启Remote Registry这个服务。

    3) 确认安装Controller的机器可以连接到被监视的WinXP机器。如果监控失败,并且 LoadRunner 找不到指定的服务器,请确认指定的服务器是否可用。在 Controller 或优化控制台计算机命令行中键入 ping <server_name>(或ip执行 “ping” 操作。


    4) 验证可以正常连接之后,如果有其他问题,可以参见下表解决:

    问题


    解决方案


    无法监控其他域中的 Windows 计算机,或者访问被拒绝


    要获得对远程计算机的管理权限,请在命令提示符下执行以下命令:


    %net use \\<计算机名>/用户:[<>\<远程计算机名>]


    提示输入密码时,输入远程计算机的密码。


    无法监控 NT/Win 2000 计算机(发出一条错误消息:未找到计算机名无法连接到主机


    要监控的 NT/Win 2000 计算机仅允许具有管理员权限的用户进行监控。要允许非管理员用户进行监控,必须授予用户对特定文件和注册表项的读取权限(Microsoft 技术说明编号 Q158438)。需要执行下列步骤:


    a. 使用浏览器或文件管理器,授予用户对下列项的读取权限:
           %windir%\system32\PERFCxxx.DAT


           %windir%\system32\PERFHxxx.DAT


        其中 xxx 是系统的基本语言 ID
       
    例如,英语的 ID 009。这些文件可能
       
    已丢失或损坏。如果对此有怀疑,请从
       
    安装 CD 中提取这些文件。


    b. 使用 REGEDT32,授予用户对下列项的读取权限:
       HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib
       
    以及该项的所有子项。


    c. 使用 REGEDT32,至少授予用户对下列项的读取权限:
        HKEY_LOCAL_MACHINE\System\CurrentControlSet\    Control\SecurePipeServers\winreg


    无法从 NT 计算机监控某些 Win 2000 计数器。


    Win 2000 计算机上运行 Controller 或优化控制台。


    某些 Windows 默认计数器生成错误


    删除有问题的计数器,并使用添加度量对话框添加相应计数器。


    无法从被监控的计算机上获得 SQL Server 6.5 版的性能计数器。


    这是 SQL Server 6.5 版的一个错误。解决方法为:在被监控的计算机上使用 regedt32,授予用户对以下注册表项的读取权限:


    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer


    Microsoft 技术说明编号 Q170394


    选定度量未显示在图中。


    确保已注册显示文件和 online.exe。要在不执行完全安装的情况下注册监控器的 dll,请运行LoadRunner\bin中的set_mon.bat批处理文件。


    监控 Windows 计算机时,图中不显示任何度量。


    检查内置的 Windows 性能监控器。如果该监控器不能正常工作,则可能是通信设置有问题。


    监控 UNIX 计算机时,图中不显示任何度量。


    确保rstatd正在 UNIX 计算机上运行(请参阅系统资源监控)。


    无法监控下列 Web 服务器之一:MS IISMS ASP ColdFusion


    请参阅上面的问题无法监控 Windows 计算机


    无法监控 WebLogic (JMX) 服务器


    打开<LoadRunner 根文件夹>\dat\monitors\WebLogicMon.ini文件,并搜索:
    [WebLogicMonitor]
    JVM=javaw.exe
    javaw.exe 更改为 java.exe。将打开一个包含跟踪信息的窗口。


    5) 确认并打开共享文件。首先,在被监视的WINXP机器:右击我的电脑,选择管理->共享文件夹->共享 在这里面要有C$这个共享文件夹。该文件可能存在,也可能不存在,没有的话,需要手动增加。然后,在安装LR的机器上使用运行,输入\\被监视机器IP\C$ 然后输入管理员帐号和密码,如果能看到被监视机器的C盘了,就说明你得到了那台机器的管理员权限,可以使用LR去连接了。
    注意:这两步必须都进行操作,否则即使该共享文件已经存在但未在LR机器中进行连接,也可能无法正常使用。
    2LR监视windows的步骤

    具体步骤参见LoadRunner Controller User’s Guild > Working with Firewalls >Monitoring Over a Firewall>Configuring Server Monitor Properties
  • HP LoadRunner 11 下载及license

    msnshow 发布于 2011-11-11 22:18:00

    LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。通过使用 LoadRunner,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。

    使用迅雷下载
    HP LoadRunner 11下载地址
    http://www.genilogix.com/downloads/loadrunner/loadrunner-11.iso

    Load generator(HP,Linux,Solaris)下载
    http://www.genilogix.com/downloads/loadrunner/loadrunner-11-load-generator.iso


    LoadRunner11破解
    破解方法和以前版本相同,我用的是LR8.0的破解文件,同样实用。就是将LR8.0中的以下两个文件替换到LR11安装目录的bin目录下:C:\Program Files\HP\LoadRunner\bin 
    需要替换的两个文件名:lm70.dll   mlr5lprg.dll
    HP.LoadRunner.破解文件和说明..zip

    点击进入下载-HP.LoadRunner.破解文件和说明..zip


    点击configuration
    点击new license,输入“AEAMAUIK-YAFEKEKJJKEEA-BCJGI”

    这时会弹出窗口:
    此时需要使用loadrunner注册表删除工具来删除此程序注册表中的license,注意要先将LR关闭。运行程序:
    运行程序弹出窗口:
    点击“是”
    点击“确定”
    LoadRunner注册表清理工具下载地址:
    lr删除注册表.rar


    8.重新启动LoadRunner,点击“New License”,首先输入globa-100的注册码:AEAMAUIK-YAFEKEKJJKEEA-BCJGI
    成功。
    继续点击“New License”,输入web-10000的注册码:AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB。
    成功。

    至此,完成安装和破译。


    LoadRunner11的license问题:
    提供一个超级license 最高支持6.5w个并发:AEACFSJI-YJKJKJJKEJIJD-BCLBR
  • 自动化测试一点思考

    mexia 发布于 2010-04-07 10:21:58

        最近也在考虑自动化测试。以下是一些对自动化测试的思考。

        自动化测试首先要有自动化测试用例。自动化测试用例应该在需求完成后与功能测试用例一起由专门的人员来负责编写。如果项目不是太大的话,当然也可以测试人员即写功能测试用例,又写自动化测试用例。但是,有一点,就是自动化测试用例必须单独提取出来。自动化,首先要在有测试用例的基础上才能进行。如果连测试用例都没有,那就不要做了。自动化测试用例的选择,可以是一些通用功能。如登录,查询功能。也可以是一些主要业务,要求准确度高的。这个就根据项目的自动化程度来决定了。不过对于初次自动化的项目,可以做一些通用功能的测试用例。

        其次,自动化测试的测试环境。因为程序发布时肯定有测试环境,也有开发环境。开始我认为自动化只是在测试环境,不能在开发环境进行。但后来一件事情改变了我的看法。今天正式环境发现查询的下拉列表数据出不来。其实,这个正式环境的问题就可以用自动化测试来解决。我们也可以在正式环境中做一些通用的,但不做业务操作的自动化测试。

        再一个问题,就是自动化测试的实施。自动化测试应该是在系统每次上线时都对其他已有的功能进行一遍自动化测试,确保程序的稳定。对一些需要长期投入人力开发的项目,自动化测试还是很有用的。但对一些短期项目,自动化测试就作用不大了。

        再剩下的问题就是自动化测试框架了。这个框架我也没有研究过。不过对于自动化一开始就实施框架,我觉得不是太好。也许应该等到公司自动化实施一段时间,时机成熟了,再实施框架会好一些。以上是一些想法,不对的地方还请大家多指教。

  • 妙用QTP里的“对象浏览器(语法自动提示)”

    songfun 发布于 2009-09-15 00:01:02

    哦,在QTP里写程序也能有自动提示?这可不是什么新闻(老火星了),QTP里有个Complete Word功能,其实它就是“对象浏览器”(请不要把对象浏览器和对象识别器混淆,这是两码事),在expert view中编程时可以用快捷键ctrl+space激活它。

    但是这个快捷键的设计很失败,因为这个快捷键和输入法快捷键冲突了,所以一般情况下你很难把这个方便的对象浏览器激活,怎么办呢?

    一种办法是你把输入法的快捷键改掉,让它们不冲突(怎么设置就不说了吧,懂windows的不可能不会),当然在QTP10中可以方便的解决这个问题,因为它toolbar的自定义(customize)可以直接把这个功能拖出来(怎么拖应该不至于要我手把手的教吧,自己DIY吧),下面是截图,我就这么用。呵呵

     

    OK,现在在QTP里敲入字母M试试看,怎么样,所有提示都看到了,爽吧?

     

    注:写完才发现跟别人的撞车了(http://blog.csdn.net/zzxxbb112/archive/2009/08/31/4503585.aspx),不过没所谓,写文章就是为了分享;P

  • 和老徐聊天,谈今后的学习之路(转载)

    愚人 发布于 2009-07-07 23:10:12

    7月1日那天,掐指一算,年已过半,

    好像年底就在眼前了,这半年又学了些什么呢,进步总是太慢。

    突然想起了,老徐,想向他咨询下今后如何学习、发展

    最后约定今天晚上海底捞聚一下,老徐请客喽。。。

    还是不虚此行哦,解决了我当前的几个困惑:

    1.关于Loadrunner CPC认证

    老徐是早就拿证了的,按他的话说,他当时考的时候,人数少,含金量高,现在,意义不大,除非 , 1 ,你看中了一家公司,而且,明确要求有Loadrunner CPC ,2, 别家公司一看有这个证,马上会高薪要你,现实不是这样的。

    考虑一下事情是否值得投入精力去做。

    2.我马上接着问了第二个疑问:那我应该学习什么哦?

    老徐问了我对Oracle、中间件了解多少,显然,我知道的连皮毛都算不上。

    老徐的建议是:数据库,只管Oracle,不管其他,中间件:常见的三个,Weblogic Websphere Tecxdo

    三个月内,要会对数据库、中间件进行监控、定位,会分析,提出建议,对于调试,可以采用不同的配置,然后进行实际检验,给出不同配置下,不同的性能表现数据。

    要一直看一本书:软件工程。

    3.java:自己编写脚本进行测试

    老徐当初学java的方法,就是自己编写一个java论坛

    4.要自己创造学习条件,学习环境

    在我们自己学习的情况下,有很多情况,问题,是不会遇到的,这样,那方面的知识,你也就不会学到。

    老徐当初是自己,用vb编写了一个程序,练习cs模式的测试

    ------如何自学,要自己创造问题,不能老是看教程,要做试验,要在实践中学习。

    5.拼命挣钱的含义:拼命只是挣钱的一个条件,拼命了,钱不一定挣得到

    6.老板愿意给什么样员工加薪:

      (1)那些具有不可替代性的(技术)员工
      (2)能够鼓舞士气,带动大家,是大家勤奋工作榜样的员工——效率可能不高,但是具有一定的正面榜样意义

    7.关于目标:

      清楚的定下今天、明天的目标,并坚持实现它。
      能够清楚的定下一周的目标,坚持实现

    8.老徐的量力而为,了解自己的能力和性格,做自己擅长的事

    目标。态度。方法

    坚持。。。

  • 性能测试点滴

    pangxiong 发布于 2009-07-20 22:15:17

    • 性能测试的目的是验证被测软件的性能达到性能指标的要求,性能测试是验证性的测试。只要被测软件的性能满足了性能指标的要求,就说明软件的性能满足了需求。
    • 性能测试包含客户端和服务端的性能,而一般的性能测试主要测试服务端的性能。性能测试的一般做法是模拟若干客户端的行为对服务器端施加压力以测试服务器的性能。性能测试一般需要借助工具进行测试,使用商用的工具或者自己开发的工具。
    • 当存在多个被测的服务器时,首先需要对单个服务器设计单独的场景进行测试,还需要设计综合场景进行多个服务器的联合测试,以测试服务器之间的影响,最后要设计整个系统的场景,测试整个系统的性能。
    • 性能测试指标主要包含几个方面:响应时间,并发用户数,吞吐量,在线用户数等。
    • 在性能测试过程中,需要对服务器进行监控,监控的性能计数器主要包含:CPU,内存,硬盘,网络,进程等。
    • 为了降低性能测试的随机性影响,一个性能测试用例要至少执行3次,3次测试取平均值。
    • 性能测试环境要尽量与系统运行环境保持一致,从软件到硬件,以保证性能测试的有效性。
    • 性能测试工具:使用测试工具前评估测试工具的适用性,有效性和正确性,使用的测试工具应该能得到委托方的认可。
    • 测试用例要根据实际的使用情况进行设计,要考虑几个方面:系统的总用户数,平常在线的用户数,用户的操作频率,用户的操作持续时间,各个业务的使用次数,客户端发送的消息或者上传下载附件的尺寸和数目,数据库的数据量等。
    • 性能测试用例应该能持续一段时间,一般不少于30分钟。
    • 性能测试工具:Loadrunner,Jmeter等
    • 网络监控工具:Sniffer等
    • 注:本文性能测试指的是狭义的性能测试
  • 软件测试,从零开始:测试新手入门必读

    ricle 发布于 2007-08-15 22:17:44

    来源:网络

     

    1、测试准备工作

     

     在测试工作伊始,软件测试工程师应该搞清楚软件测试工作的目的是什么。如果你把这个问题提给项目经理,他往往会这样回答: " 发现我们产品里面的所有 BUG ,这就是你的工作目的 " 。作为一名软件测试新手,如何才能发现所有的 BUG ?如何开始测试工作?即便面对的是一个很小的软件项目,测试需要考虑的问题也是方方面面的,包括硬件环境、操作系统、产品的软件配置环境、产品相关的业务流程、用户的并发容量等等。该从何处下手呢?

     

    2、向有经验的测试人员学习

     

     如果你进入的是一家运作规范的软件公司,有独立的软件测试部门、规范的软件测试流程、软件测试技术有一定的积累,那么,恭喜你!你可以请求测试经理委派有经验的测试人员作为你工作上的业务导师,由他列出软件测试技术相关书籍目录、软件测试流程相关文档目录、产品业务相关的文档目录,在业务导师的指导下逐步熟悉软件测试的相关工作。其实,在很多运作规范的软件公司,已经把上述的师父带徒弟的方式固化到流程中。

     

     如果你进入的是一个软件测试一片空白的软件企业,那么,也恭喜你!你可以在这里开创一片自己的软件测试事业,当然,前提是老板确实认识到软件测试的重要性,实实在在需要提高产品的质量。这时候,可以到国内的软件测试论坛和相关网站上寻找软件测试资源,这种情况下,自学能力和对技术的悟性就至关重要了。

     

    3 阅读软件测试的相关书籍

     

     现在,中文版的软件测试书籍越来越多,有的是国人自己写的,有的是翻译国外经典之作。可以到www.chinapub.com 或者www.cnforyou.com 等网络购书的站点查找软件测试相关的书籍。目前,从国外引入的软件测试书籍有很多经典之作,但是,翻译成中文后,翻译质量对阅读效果有很大的影响。推荐一个英语网站http://www.devbistro.com/articles/Testing/ 

     

    4 走读缺陷跟踪库中的问题报告单

     

     如果您所在的公司已经有软件缺陷跟踪库了,无论采用的是商用工具,如 ClearQuest TestDirecter 等工具,还是采用的 Bugzilla Mantis 等开源工具,这都无关紧要,缺陷跟踪库中的缺陷报告单才是有价值的。缺陷跟踪库中的问题报告单是软件测试工程师工作绩效的集中体现,同时也是软件产品问题的集中体现。一般来说,缺陷报告单中最关键的几个部分包括:第一部分是发现缺陷的环境,包括软件环境、硬件环境等;第二部分是缺陷的基本描述;第三部分是开发人员对缺陷的解决方法。通过对上述缺陷报告单的三个部分作仔细分析,不知不觉你已经吸收了其他软件测试人员的工作经验,并掌握了软件产品常见的基本问题。这是迅速提高软件测试经验的好方法。

     

    5、走读相关产品的历史测试用例

     

     如果你所在的公司有测试用例管理系统,那么,走读相关产品的软件测试用例是迅速提高测试用例设计水平的一条捷径。走读测试用例也是有技巧的。测试用例写作一般会包括测试用例项和根据测试用例项细化的测试用例,下面举例说明。 " 测试用户登录的功能 " 是一个测试项,该测试项的目的是测试用户登录功能是否正确,是否能够完成正常的登录功能,是否能够对非法用户名和密码做异常处理等等。因此,根据该用例项,可以设计出若干个测试用例,大多数情况下,测试用例项和测试用例是一对多的关系。

     

     通过走读测试用例项目,你可以掌握应该从哪些功能点着手未来的测试工作;通过走读软件测试用例,你可以了解如何根据被测试的功能点开展软件测试用例的设计工作,包括如何确定测试用例的输入、测试用例的操作步骤和测试用例的输出结果等。

     

     总之,走读其他软件测试人员设计的优秀软件测试用例,是提高自身用例设计水平的好方法。

     

    6、学习产品相关的业务知识

     

     软件测试人员不仅要掌握软件测试技术相关知识,对产品相关的业务知识也要学习。这很好理解,如果从事财务软件的测试工作,一定要学习财务知识;如果从事通讯产品测试工作,那么相关的通讯理论知识也是必须的;如果从事银行软件的测试,银行的业务流程也是不可或缺的知识点。

     

     因此,在学习软件测试技术的同时,千万不要忽略产品相关业务知识的学习。如果你是一个软件测试技术专家,但是对产品业务知识一无所知,那么也只能测试出来纯粹的软件缺陷,而面对眼前出现的产品业务相关的缺陷,很可能是视而不见,如此这般,软件测试的效果会大打折扣。

     

     7、识别测试需求

     

     识别测试需求是软件测试的第一步。如果开发人员能够提供完整的需求文档和接口文档,那固然好。可以根据需求文档中描述的每个功能项目的输入、处理过程和输出,来设计测试用例。如果开发人员没有提供软件需求文档,那该如何是好?下面给出几个有效的方法:

     

    8 主动获取需求

     

     开发人员通常不会更好地考虑软件测试,如果没有开发流程的强制规定,他们通常是不愿意提供任何开发文档,即便有强制规定,需求文档也未必能够真正指导软件系统测试工作。因此,需要测试人员发挥主观能动性,与相关的软件开发项目经理和软件开发人员保持沟通,了解软件实现的主要功能是什么,并记录得收集到的信息。一般来说,开发人员即便没有提供相关需求文档,也会保存一些简单的过程文档,主动向开发人员索要这些文档,可以作为测试的参考。此外,可以与公司的技术支持人员交流,技术支持人员是最贴近用户的人,因此,通过交流可以获取第一手的用户使用感受,在测试的过程中会更加贴近用户。

     

     当拿到相关的资料后,从哪些方面分析需求?如何与开发人员交流需求?其实,只要把握需求分析的几个关键的点就可以解决问题:输入、处理过程、输出、性能要求、运行环境,下面针对每一个项目逐一分析:

     

     软件输入: 与该需求相关的一切可能输入,可以从这几方面考虑,输入来源、输入参数的数量、输入参数的度量单位、输入参数的时间要求、输入参数的精度和输入参数的有效输入范围。在测试用例设计中,这部分内容作为测试用例输入的依据。

     

     处理过程: 描述对输入数据所执行的所有操作和如何获得输出的过程。测试人员了解处理过程即可,在测试过程中发现 BUG 时候,如果对处理过程了解的深入,对定位问题根源有很大的帮助。

     

     软件输出: 描述每个需求的输出结果,包括输出的位置(如计算机显示器、打印机,文件),输出参数的数量、输出参数的度量单位、输出参数的时序、输出参数精确度、输出参数的有效输出范围、错误消息。在测试用例设计中,这部分内容作为测试用例的预期输出。

     

     性能要求: 与该需求相关的性能要求,比如 " 插入 ATM 取款卡后, 3 秒钟内弹出提示用户取款的图形界面 " 3 秒钟这一限制,就是对需求的基本性能要求。

     

     运行环境: 软件的运行所需的环境,包括硬件平台的要求、操作系统的要求、数据库的要求,以及其它相关支撑软件的要求。

     

     9 确认需求的优先级

     

     确认需求的优先级是很必要的,如果在产品进度比较紧的情况下,测试人员可以考虑优先测试优先级高的需求项,如果进度允许,那么在测试优先级低的需求项,如果进度不允许,那么就放弃测试优先级低的需求项。如果软件公司有规范的流程支撑,开发人员在提供软件需求文档的时候,应该在文档中确定需求的优先级。但是,如果开发人员连基本的软件需求文档都没有提供,又怎能指望他们确定软件需求的优先级?如果是这样,需求的优先级只能由测试人员完成了。

     

     10 加入开发小组的邮件群组

     

     测试人员需要通晓被测试产品,但是,产品在开发的过程中往往是不断变化的。如果软件开发团队有一套变更控制流程,测试人员会对产品的变更了如指掌。如果没有变更控制,那就要采用其他的土方法了。如果公司里面有自动化办公系统,也许采用的是 Lotus Notes 系统,也许使用的是 E-mail 系统,测试人员应该加入到开发人员的邮件群组中。当开发人员通过邮件讨论问题、通知召开技术会议的时候,测试人员可以及时知晓,如果必要,可以参加开发人员的技术会议。即便公司里面有了软件变更控制流程,加入到开发邮件群组也是一个很好的习惯。

     

     11 与开发人员为邻

     

     建议测试人员与开发人员为邻。我所在的测试组曾经与开发组是在相邻的写字间里,开发人员与测试人员的关系非常融洽,抛去同事关系,大家还是不错的朋友。不管开发人员有什么样的活动,测试人员都能第一时间获得信息。无论从事软件测试工作,还是从事其它的工作,与工作中上下游环节的同事保持良好的个人关系对工作有很大便利。一般的公司内部都存在部门墙,良好的人际关系是打通部门墙的手段之一。向领导建议测试人员与开发人员为邻,这很必要。

     

     12 测试用例设计

     

     测试需求收集完毕后,开始测试设计。测试用例是什么?测试用例就是一个文档,描述输入、动作、或者时间和一个期望的结果,其目的是确定应用程序的某个特性是否正常的工作。设计测试用例需要考虑以下问题:

     

     13 测试用例的基本格式

     

     软件测试用例的基本要素包括测试用例编号、测试标题、重要级别、测试输入、操作步骤、预期结果,下面逐一介绍。

     

     用例编号: 测试用例的编号有一定的规则,比如系统测试用例的编号这样定义规则: PROJECT1-ST-001 ,命名规则是项目名称+测试阶段类型(系统测试阶段)+编号。定义测试用例编号,便于查找测试用例,便于测试用例的跟踪。

     

     测试标题: 对测试用例的描述,测试用例标题应该清楚表达测试用例的用途。比如 " 测试用户登录时输入错误密码时,软件的响应情况 "

     

     重要级别: 定义测试用例的优先级别,可以笼统的分为 " " " " 两个级别。一般来说,如果软件需求的优先级为 " " ,那么针对该需求的测试用例优先级也为 " " ;反之亦然,

     

     测试输入: 提供测试执行中的各种输入条件。根据需求中的输入条件,确定测试用例的输入。测试用例的输入对软件需求当中的输入有很大的依赖性,如果软件需求中没有很好的定义需求的输入,那么测试用例设计中会遇到很大的障碍。

     

     操作步骤: 提供测试执行过程的步骤。对于复杂的测试用例,测试用例的输入需要分为几个步骤完成,这部分内容在操作步骤中详细列出。

     

     预期结果: 提供测试执行的预期结果,预期结果应该根据软件需求中的输出得出。如果在实际测试过程中,得到的实际测试结果与预期结果不符,那么测试不通过;反之则测试通过。

     

     软件测试用例的设计主要从上述 6 个域考虑,结合相应的软件需求文档,在掌握一定测试用例设计方法的基础上,可以设计出比较全面、合理的测试用例。具体的测试用例设计方法可以参见相关的测试书籍,白盒测试方法和黑盒测试方法在绝大多数的软件测试书籍中都有详细的介绍,这里不作赘述。

     

    14 重用同类型项目的测试用例

     

     如果我看得远,那是因为我站在巨人的肩上 --牛顿。

     

     一般来说,每个软件公司的项目可以分为固定的几大类。可以按业务类型划分,比如 ERP 软件、产品数据管理软件、通信软件、地理信息系统软件等等;可以按软件结构来划分,比如 B/S 架构的软件、 C/S 架构的软件、嵌入式软件等等。参考同类别软件的测试用例,会有很大的借鉴意义。如果,公司中有同类别的软件系统,千万别忘记把相关的测试用例拿来参考。如果,系统非常接近,甚至经过对测试用例简单修改就可以应用到当前被测试的软件。 " 拿来主义 " 可以极大的开阔测试用例设计思路,也可以节省大量的测试用例设计时间。

     

     15 利用已有的软件 Checklist

     

     在上面一个小节中,按照不同的规则划分了不同的软件类型。每种类型的软件都有一定的测试规范,比如, WEB 软件系统在系统测试过程中,会有一系列的范式,比如针对 Cookie 就会有很多测试点。在设计测试用例的时候,不妨到网上去搜索相关的 Checklist ,不过国内外的网站很少有这方面的资料,即便有,也不是特别系统。可以先找一份粗糙的 Checklist ,然后,在设计测试用例的时候不断的去完善它,以作为下次测试用例设计的基础。

     

     16 加强测试用例的评审

     

     测试用例设计完毕后,最好能够增加评审过程。同行评审是 CMM3 级的一个 KPA ,如果因为公司没有通过 CMM3 级,就不开展同行评审是不恰当的。测试用例应该由产品相关的软件测试人员和软件开发人员评审,提交评审意见,然后根据评审意见更新测试用例。如果认真操作这个环节,测试用例中的很多问题都会暴露出来,比如用例设计错误、用例设计遗漏、用例设计冗余、用例设计不充分等等;如果同行评审不充分,那么,在测试执行的过程中,上述本应在评审阶段发现的测试用例相关问题,会给测试执行带来大麻烦,甚至导致测试执行挂起。

     

     17 定义测试用例的执行顺序

     

     在测试用例执行过程中,你会发现每个测试用例都对测试环境有特殊的要求,或者对测试环境有特殊的影响。因此,定义测试用例的执行顺序,对测试的执行效率影响非常大。比如某些异常测试用例会导致服务器频繁重新启动,服务器的每次重新启动都会消耗大量的时间,导致这部分测试用例执行也消耗很多的时间。那么在编排测试用例执行顺序的时候,应该考虑把这部分测试用例放在最后执行,如果在测试进度很紧张的情况下,如果优先执行这部分消耗时间的异常测试用例,那么在测试执行时间过了大半的时候,测试用例执行的进度依然是缓慢的,这会影响到测试人员的心情,进而导致匆忙地测试后面的测试用例,这样测试用例的漏测、误测就不可避免,严重影响了软件测试效果和进度。因而,合理地定义测试用例的执行顺序是很有必要的。

     

     18 测试用例执行

     

     测试用例设计完毕后,接下来的工作是测试执行,测试执行中应该注意以下几个问题:

     

     * 搭建软件测试环境,执行测试用例

     

     测试用例执行过程中,搭建测试环境是第一步。一般来说,软件产品提交测试后,开发人员应该提交一份产品安装指导书,在指导书中详细指明软件产品运行的软硬件环境,比如要求操作系统系统是 Windows 2003 pack2 版本,数据库是 Sql Server 2000 等等,此外,应该给出被测试软件产品的详细安装指导书,包括安装的操作步骤、相关配置文件的配置方法等等。对于复杂的软件产品,尤其是软件项目,如果没有安装指导书作为参考,在搭建测试环境过程中会遇到种种问题。

     

     如果开发人员拒绝提供相关的安装指导书,搭建测试中遇到问题的时候,测试人员可以要求开发人员协助,这时候,一定要把开发人员解决问题的方法记录下来,避免同样的问题再次请教开发人员,这样会招致开发人员的反感,也降低了开发人员对测试人员的认可程度。

     

     测试环境搭建之后,根据定义的测试用例执行顺序,逐个执行测试用例。在测试执行中需要注意以下几个问题:

     

      全方位的观察测试用例执行结果:测试执行过程中,当测试的实际输出结果与测试用例中的预期输出结果一致的时候,是否可以认为测试用例执行成功了?答案是否定的,即便实际测试结果与测试的预期结果一致,也要查看软件产品的操作日志、系统运行日志和系统资源使用情况,来判断测试用例是否执行成功了。全方位观察软件产品的输出可以发现很多隐蔽的问题。以前,我在测试嵌入式系统软件的时候,执行某测试用例后,测试用例的实际输出与预期输出完全一致,不过在查询 CPU 占用率地时候,发现 CPU 占用率高达 90 %,后来经过分析,软件运行的时候启动了若干个 1ms 的定时器,大量的消耗的 CPU 资源,后来通过把定时器调整到 10ms CPU 的占用率降为 7 %。如果观察点单一,这个严重消耗资源的问题就无从发现了。

     

     加强测试过程记录:测试执行过程中,一定要加强测试过程记录。如果测试执行步骤与测试用例中描述的有差异,一定要记录下来,作为日后更新测试用例的依据;如果软件产品提供了日志功能,比如有软件运行日志、用户操作日志,一定在每个测试用例执行后记录相关的日志文件,作为测试过程记录,一旦日后发现问题,开发人员可以通过这些测试记录方便的定位问题。而不用测试人员重新搭建测试环境,为开发人员重现问题。

     

     及时确认发现的问题:测试执行过程中,如果确认发现了软件的缺陷,那么可以毫不犹豫的提交问题报告单。如果发现了可疑问题,又无法定位是否为软件缺陷,那么一定要保留现场,然后知会相关开发人员到现场定位问题。如果开发人员在短时间内可以确认是否为软件缺陷,测试人员给予配合;如果开发人员定位问题需要花费很长的时间,测试人员千万不要因此耽误自己宝贵的测试执行时间,可以让开发人员记录重新问题的测试环境配置,然后,回到自己的开发环境上重现问题,继续定位问题。

     

     与开发人员良好的沟通:测试执行过程中,当你提交了问题报告单,可能被开发人员无情驳回,拒绝修改。这时候,只能对开发人员晓之以理,做到有理、有据,有说服力。首先,要定义软件缺陷的标准原则,这个原则应该是开发人员和测试人员都认可的,如果没有共同认可的原则,那么开发人员与测试人员对问题的争执就不可避免了。此外,测试人员打算说服开发人员之前,考虑是否能够先说服自己,在保证可以说服自己的前提下,再开始与开发人员交流

     

     19 及时更新测试用例

     

     测试执行过程中,应该注意及时更新测试用例。往往在测试执行过程中,才发现遗漏了一些测试用例,这时候应该及时的补充;往往也会发现有些测试用例在具体的执行过程中根本无法操作,这时候应该删除这部分用例;也会发现若干个冗余的测试用例完全可以由某一个测试用例替代,那么删除冗余的测试用例。

     

     总之,测试执行的过程中及时地更新测试用例是很好的习惯。不要打算在测试执行结束后,统一更新测试用例,如果这样,往往会遗漏很多本应该更新的测试用例。

     

     20 提交一份优秀的问题报告单

     

     软件测试提交的问题报告单和测试日报一样,都是软件测试人员的工作输出,是测试人员绩效的集中体现。因此,提交一份优秀的问题报告单是很重要的。软件测试报告单最关键的域就是 " 问题描述 " ,这是开发人员重现问题,定位问题的依据。问题描述应该包括以下几部分内容:软件配置、硬件配置、测试用例输入、操作步骤、输出、当时输出设备的相关输出信息和相关的日志等。

     

     软件配置: 包括操作系统类型版本和补丁版本、当前被测试软件的版本和补丁版本、相关支撑软件,比如数据库软件的版本和补丁版本等。

     

     硬件配置: 计算机的配置情况,主要包括 CPU 、内存和硬盘的相关参数,其它硬件参数根据测试用例的实际情况添加。如果测试中使用网络,那么网络的组网情况,网络的容量、流量等情况。硬件配置情况与被测试产品类型密切相关,需要根据当时的情况,准确翔实的记录硬件配置情况。

     

     测试用例输入 操作步骤 输出: 这部分内容可以根据测试用例的描述和测试用例的实际执行情况如实填写。

     

     输出设备的相关输出信息: 输出设备包括计算机显示器、打印机、磁带等等输出设备,如果是显示器可以采用抓屏的方式获取当时的截图,其他的输出设备可以采用其它方法获取相关的输出,在问题报告单中提供描述。

     

     日志信息: 规范的软件产品都会提供软件的运行日志和用户、管理员的操作日志,测试人员应该把测试用例执行后的软件产品运行日志和操作日志作为附件,提交到问题报告单中。

     

     根据被测试软件产品的不同,需要在 " 问题描述 " 中增加相应的描述内容,这需要具体问题具体分析。

     

     21 测试结果分析

     

     软件测试执行结束后,测试活动还没有结束。测试结果分析是必不可少的重要环节, "

  • WEB安全性测试

    yanming_huo 发布于 2009-06-28 09:05:12

    WEB安全性测试
     

    一个完整的WEB安全性测试可以从部署与基础结构、输入验证、身份验证、授权、配置管理、敏感数据、会话管理、加密。参数操作、异常管理、审核和日志记录等几个方面入手。


    1.安全体系测试


    1)       部署与基础结构


    u       网络是否提供了安全的通信


    u       部署拓扑结构是否包括内部的防火墙


    u       部署拓扑结构中是否包括远程应用程序服务器


    u       基础结构安全性需求的限制是什么


    u       目标环境支持怎样的信任级别


    2)       输入验证


    u       如何验证输入


    u       是否清楚入口点


    u       是否清楚信任边界


    u       是否验证Web页输入


    u       是否对传递到组件或Web服务的参数进行验证


    u       是否验证从数据库中检索的数据


    u       是否将方法集中起来


    u       是否依赖客户端的验证


    u       应用程序是否易受SQL注入攻击


    u       应用程序是否易受XSS攻击


    u       如何处理输入


    3)身份验证


    u       是否区分公共访问和受限访问


    u       是否明确服务帐户要求


    u       如何验证调用者身份


    u       如何验证数据库的身份


    u       是否强制试用帐户管理措施


    4)授权


    u       如何向最终用户授权


    u       如何在数据库中授权应用程序


    u       如何将访问限定于系统级资源


    5)配置管理


    u       是否支持远程管理


    u       是否保证配置存储的安全


    u       是否隔离管理员特权


    6)敏感数据


    u       是否存储机密信息


    u       如何存储敏感数据


    u       是否在网络中传递敏感数据


    u       是否记录敏感数据


    7)会话管理


    u       如何交换会话标识符


    u       是否限制会话生存期


    u       如何确保会话存储状态的安全


    8)加密


    u       为何使用特定的算法


    u       如何确保加密密钥的安全性


    9)参数操作


    u       是否验证所有的输入参数


    u       是否在参数过程中传递敏感数据


    u       是否为了安全问题而使用HTTP头数据


    10)异常管理


    u       是否使用结构化的异常处理


    u       是否向客户端公开了太多的信息


    11)审核和日志记录


    u       是否明确了要审核的活动


    u       是否考虑如何流动原始调用这身份


    2.应用及传输安全


    WEB应用系统的安全性从使用角度可以分为应用级的安全与传输级的安全,安全性测试也可以从这两方面入手。


    应用级的安全测试的主要目的是查找Web系统自身程序设计中存在的安全隐患,主要测试区域如下。


    1.       注册与登陆:现在的Web应用系统基本采用先注册,后登录的方式。


    u       必须测试有效和无效的用户名和密码


    u       要注意是否存在大小写敏感


    u       可以尝试多少次的限制


    u       是否可以不登录而直接浏览某个页面等。


    2.       在线超时:Web应用系统是否有超时的限制,也就是说,用户登陆一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。


    3.       操作留痕:为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进入了日志文件,是否可追踪。


    4.       备份与恢复:为了防范系统的意外崩溃造成的数据丢失,备份与恢复手段是一个Web系统的必备功能。备份与恢复根据Web系统对安全性的要求可以采用多种手段,如数据库增量备份、数据库完全备份、系统完全备份等。出于更高的安全性要求,某些实时系统经常会采用双机热备或多级热备。除了对于这些备份与恢复方式进行验证测试以外,还要评估这种备份与恢复方式是否满足Web系统的安全性需求。传输级的安全测试是考虑到Web系统的传输的特殊性,重点测试数据经客户端传送到服务器端可能存在的安全漏洞,以及服务器防范非法访问的能力。一般测试项目包括以下几个方面。


    5.       HTTPSSSL测试:默认的情况下,安全HTTPSoure HTTP)通过安全套接字SSLSource Socket Layer)协议在端口443上使用普通的HTTPHTTPS使用的公共密钥的加密长度决定的HTTPS的安全级别,但从某种意义上来说,安全性的保证是以损失性能为代价的。除了还要测试加密是否正确,检查信息的完整性和确认HTTPS的安全级别外,还要注意在此安全级别下,其性能是否达到要求。


    6.       服务器端的脚本漏洞检查:存在于服务器端的脚本常常构成安全漏洞,这些漏洞又往往被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。


    7.       防火墙测试:防火墙是一种主要用于防护非法访问的路由器,在Web系统中是很常用的一种安全系统。防火墙测试是一个很大很专业的课题。这里所涉及的只是对防火墙功能、设置进行测试,以判断本Web系统的安全需求。
  • http和https的区别

    ilaria 发布于 2009-06-07 23:03:19

    在URL前加https://前缀表明是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。

    Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。
    http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    http的连接很简单,是无状态的,...

    HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
    要比http协议安全
     
    详细介绍:
     
    HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
    它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
    它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。

    HTTPS和HTTP的区别:
    https协议需要到ca(CA即证书管理机构)申请证书,一般免费证书很少,需要交费。
    http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
    http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
    http的连接很简单,是无状态的
    HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全

    HTTPS解决的问题:
    1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server.
    2 . 通讯过程中的数据的泄密和被窜改
    1. 一般意义上的https, 就是 server 有一个证书.
    a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.
    b) 服务端和客户端之间的所有通讯,都是加密的.
    i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.
    ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然窜改也就没有什么意义了.

    2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.
    a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份.
    b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体.

    HTTPS 一定是繁琐的.
    a) 本来简单的http协议,一个get一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返.
    i. 任何应用中,过多的round trip 肯定影响性能.
    b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密.
    i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.
    ii. 加密后数据量的影响. 所以,才会出现那么多的安全认证提示
    trackback:http://www.51testing.com/?uid-77325-action-spacelist-type-blog-view-track
  • Web系统的测试方法

    小刀 发布于 2008-06-30 17:24:52

      一、功能测试

      1、链接测试

      链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

      链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试

      2、表单测试

      当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

      3Cookies测试

      Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。

      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。

      4、设计语言测试

      Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如JavaJavascrīpt ActiveXVBscrīptPerl等也要进行验证。

      5、数据库测试

      在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。

    在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试

      二、性能测试

      1、连接速度测试

      用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。

      另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。

      2、负载测试

      负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

      3、压力测试

      负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。

      进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。

      压力测试的区域包括表单、登陆和其他信息传输页面等。

      三、可用性测试

      1、导航测试

      导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?

      在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。

      导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。

      Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。

      2、图形测试

      在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:

      (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。

      (2)验证所有页面字体的风格是否一致。

      (3)背景颜色应该与字体颜色和前景颜色相搭配。

      (4)图片的大小和质量也是一个很重要的因素,一般采用JPGGIF压缩。

      3、内容测试

      内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。

      信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"

      4、整体界面测试

      整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?



      对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

      对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。

      四、客户端兼容性测试

      1、平台测试

      市场上有很多不同的操作系统类型,最常见的有WindowsUnixMacintoshLinux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。

      因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试

      2、浏览器测试

      浏览器是 查看(1277) 评论(0) 收藏 分享 管理

  • 从一个局长使用BS系统的无奈看测试点

    zte_boy 发布于 2009-06-04 16:38:18


    一个局长使用B/S系统的无奈(此局长纯属虚构,如有雷同尚请见谅):
      今天我点名买了个B/S系统,听说只要有浏览器就能用。我最讨厌装客户端了,用浏览器就是方便啊。
      下面就是我使用这个系统碰到的麻烦事:
      我登录失败的时候没有任何提示,这没什么,反正提示也只是说失败……
      进去后发现颜色变更很强烈刺得我一眨眼,不过多看几次就习惯了。
      点击某个链接的时候出现错误页面,刷新后就好了,难道是随机错误?
      保存文字的时候没有成功提示,不过能成功保存就算了。
      浏览记录的时候竟然出现错误页面,原来我没有选记录就浏览了,我自己操作不规范嘛。
      删除记录的时候发现选错了,想取消的时候却提示删除成功,都没有确认提示,只能下次看仔细点了。
      查询时字母键被茶杯压住了多输了点字符,竟然出现错误页面,下次把东西整理好。
      无聊随便点点几个链接,竟然没有反应,既然不用,那就不要做出来嘛。
      看看自己上传的图片效果如何,这个怎么不显示?多试几次发现名字不包含中文就好了,下次注意下。
      改改字体字号颜色美化环境嘛,怎么格式那里不显示正确的字体字号呢,将就用吧。
      这里的记录条数怎么这么多啊?原来是没有删除按钮,看来下次不能随便加了。
      这个结束时间怎么在开始时间前啊?原来没有进行控制,下面的人执行时……还是自己改过来吧。
      上次我在这里看见的图片呢?刷新后就出来了,怎么和我玩捉迷藏呢?
      多输了点内容,保存时候提示太多了,点确定后发现被清空了,我一个小时的工作啊!
      这张图片真不错,但是按钮呢,按钮呢?按钮被挤掉了我怎么编辑啊。
      听说F5是刷新点一下看看。怎么好像变成了登录界面?
      刚学了怎么用TAB键,确实很方便。TAB一下。跑哪去了,怎么一片空白啊???
      玩游戏的人点击速度那么快,我也来试试。怎么一双击就出错了?
      我找错别字是很厉害的,这不就发现“同意”写成了“统一”。
      这里提示只能输入1-100,我偏要输入9999……保存看看,怎么系统不能用了?
      这里一点击就出现IE错误,硬是不弹出我需要的窗口。
      这个查询按钮怎么灰掉了?这么多记录让我一页一页翻过去找啊。
      上传第二个附件的时候怎么把第一个挤掉了啊,会挤掉也要提示一下嘛。
      一个页面上打开的记录太多了,变体都用…省略了,要是鼠标放上去浮动显示完整标题就方便多了。
      这几条记录有依存关系,删了一条其他就没了,提示都没有,早知道我就用编辑了……
      这条记录怎么好像是昨天的,我记得今天更新了啊?原来编辑后的记录没有传到引用的地方。
      最最奇怪的是昨天上传时候正常的图片今天就不能显示了。我记得没有只能显示一天的功能啊???
      这里怎么没有任何按钮呢,看手册才知道竟然要用右键进行操作,怎么突然冒出个异类啊???
      这里怎么能增加两条相同的记录呢?不控制一下天知道手下那些愣头青会做出什么来。
      这里的菜单一层一层又一层,足足有五层,把我头都绕晕了……我记得哪里说过最好不要超过三层的。
      这个界面看起来怎么这么别扭啊,是字体太大了,是按钮太小了,还是功能太多了,……
      怎么不是管理员登录进来也能管理啊,那我这个管理员的身份不是多此一举吗?
      删除的时候提示Error,幸亏我英语水平好,可是你换成中文不行吗?
      这条记录不是删除了吗,怎么还能引用啊,到时候出错了怎么办,难道还要我记住删了那些记录?
      经过精心编辑,我发了一条通知,怎么用普通用户查看的时候是默认的字体字号啊???
      这几个页面上的当前日期怎么是固定不变的啊,这都是去年的日期了,不会是开发时候的吧。
      ……
      各位还有还有什么烦心事呢,一起来交流吧
  • 翻页功能测试用例设计

    chop123 发布于 2009-05-25 21:37:57

     

    翻页功能我们常碰到的一般有以下几个功能:

      1、首页、上一页、下一页、尾页。

      2、总页数,当前页数

      3、指定跳转页

      4、指定每页显示条数

      当然,有一些是少于多少页,全部以数字的形式显示,多于多少页后,才出现下一页的控件。本文暂且用以上四点来做为通用的用例来设计吧。

      对于1翻页链接或按钮的测试,主要要检查的测试点有:

      1、有无数据时控件的显示情况

      2、在首页时,首页和上一页是否能点击

      3、在尾页时,下一页和尾页是否能点击

      4、在非首页和非尾页时,四个按钮功能是否正确

      5、翻页后,列表中的记录是否仍按照指定的排序列进行了排序http://www.mscto.com

      对于2总页数,当前页数,主要要检查的测试点有:

      1、总页数是否等于总的记录数/指定每页条数

    软件开发网

      2、当前页数是否正确

      对于3指定跳转页,主要要检查的测试点有:

      1、是否能正常跳转到指定的页数

      2、输入的跳转页数非法时的处理

      对于4指定每页显示条数,主要要检查的测试点有:

      1、是否有默认的指定每页显示条数

      2、指定每页的条数后,列表显示的记录数,页数是否正确

      3、输入的每页条数非法时的处理

     

      分析完上面的测试点,应该可以进行用例的设计了。

  • 我要瘦脸!

    rejoicexu 发布于 2007-03-20 10:58:13

       
    1 大声喊“啊”
    面对镜子,嘴呈“啊”字张开,下巴往下持续约10秒,动作重复3次。
    这一姿势能够很好地锻炼下巴及脸颊肌肉。
    2 左右撇嘴
    双唇轻闭,嘴唇先往右边撇,保持10秒,再往左边撇同样10秒,两边轮流3次以上。刚开始如果不习惯,不妨配合眼神一起左右转换。这一小动作可以强化脸颊及嘴角肌肉,帮助胖嘟嘟的小腮帮快速消失掉。
    3 舌尖咕嘟
    舌尖在嘴巴内部由左右上下,顺时针刺激嘴唇内侧的穴位,连续3次以上。舌尖刺激嘴唇内侧的肌肉,可以帮助消除法令纹,让你不再“吊脸颊”!
    4 嘴角牵动
    轻松放平双肩,嘴唇轻闭,然后嘴角略施力往两侧牵动。再张开嘴巴露齿,牙齿要咬合,让唇瓣肌肉略微用力保持约10秒,如此重复5次以上。这一运动可以调整牙齿的咬合,让平时咀嚼不到的肌肉也有机会参与新陈代谢。
    5 狮子龇牙
    眼睛直视前方,两手分开摆在脸颊两侧,想象自己是只小狮子。下巴稍微往下倾,嘴角往外侧牵动,动作约持续10秒,重复5次以上。狮子表情促进了整个脸颊肌肉的扩张,对消除地心引力所造成的脸颊赘肉十分有效。


    二、消除双下巴的运动:

       进行双下巴提升运动之前,我们可以选用一些简单的食品做一个祛双下巴面膜。选用一个新鲜鸡蛋的蛋清,一汤勺牛奶以及蜂蜜,液体樟脑及薄荷浸液各一茶勺,以快速动作加以混合,再将此乳脂状物涂敷在下颚及下巴底区域。


      提升运动:


      A、仰面横躺在床上。用肩部支撑着,并把头悬在床沿以外,然后慢慢抬起再下落,反复进行10次。


      B、不移动肩膀,只将颈部前伸尽可能的远,坚持6秒钟,然后慢慢将你的下巴尽可能地向下拉到颈部,将此动作保持6秒钟后放松下来,再重复多次。


      除了日常自我面部提升运动锻炼外,对于已形成双下巴的人可以到美容院做特效祛双下巴护理,通过特效去脂精华液,渗透到下巴的脂肪层,分解、消除脂肪,从而改善双下巴的状况。


    三、“水胖脸型”的瘦脸技巧
      
        1、不要长时间听低重音的音乐,使身体长期处于紧张状态,交感神经更加兴奋,而无法放松。所以休息时,应该尽量听些轻快的歌曲。
      
        2、夜间照明避免过度光亮,因为长期处在光线下,副交感神经无法进行有效的活动,身体就会产生紧张感。良好的睡眠,是水胖脸型的瘦脸最佳良方。
      
        3、洗澡时不要泡过热的水,因为水温过热刺激交感神经的活动更加激烈。此外,晚上8点以后,避免喝含咖啡因的刺激性饮料。 这种类型的人在进行瘦脸时,必须针对脸部肌肉给予按摩,它可以使肌肉柔软、体内循环畅通,达到瘦脸目的。

    四、化妆瘦脸法
         如果你觉得运动按摩太辛苦,又觉得吸脂手术太痛苦,就用这种方法好了,除了比较麻烦外,效果也是不错的!
        
       1、第一步要学会打粉底,在较突出的T字部位使用白色粉底,强调五官的立体效果,并能造成视觉上的集中。而在两颊使用肤色粉底,而在脸部周围使用比肤色深一点的修容饼或蜜粉,更能修饰脸部的线条。


      2、强调高高的眉峰,如果眉毛画得太长或太短,会使脸部轮廓看起来短而宽。最理想的眉毛长度,是眉尾不超过一条从鼻翼经过眼尾到眉尾的45度延长线。眉峰则在眼珠外侧3-5毫米处。


      3、用接近肤色但比肤色稍深的腮红从脸颊斜斜地往太阳穴刷去,不要将腮红涂成圆形,在颧骨以下斜斜地涂,腮红应上下晕开。将刷子蘸上腮红后轻轻刷于纸巾之上,调匀后再涂上脸颊。


      4、用唇线笔描绘立体唇形,并选择和肤色接近的口红色系,再搽上具有集中光线、强调唇部立体感的唇彩,如此一来,利用唇部和脸部的落差所造成的视觉效果,脸便好像变小了一般。


      先用手指将唇色涂于嘴唇中央,使唇峰突出,嘴角色浅呈粉红色。把涂在嘴唇中央的唇色用手指轻轻向两侧晕开,使唇形富于立体感。使用唇刷将唇彩涂于嘴唇中部,自然立体的唇形就诞生了。


    五、瘦脸的食物

         要想快速地在短短两个星期瘦脸成功,MM在平日的食物挑选上,就应该多多注意摄取含高钾质的食材,因为钾质能够促进体内代谢功能,排除因为不当饮食或生活习惯所产生的脸部肿胀问题;此外,高纤维质的海藻类、豆腐、豆干及青菜、水果,都是小脸的好朋友。
            菠菜:小小一把的菠菜就含有丰富的钾及维他命A和C,但是须特别注意烹调方式,因为菠菜是相当容易流失营养的食材。
            豆苗:绿色的豆苗菜含有相当丰富的营养,其中当然少不了有利消除水肿的钾,而且豆苗菜也可以强化咀嚼效果,是兼具营养价值及促进口腔活动的优质食品喔。
            红萝卜:相当营养的红萝卜相信是许多人在小时候所不喜欢吃的东西,小芹也不例外,但是知道红萝卜的小脸功效后,小芹就爱上了红萝卜的滋味,每天早上喝一杯现榨的蜂蜜红萝卜汁,养颜又美容喔!
            西洋芹:和以上食物一样,西洋芹具有营养价值及促进口腔活动的功能,不论拿来作为食材,或是在夏天最顺口、简单的生吃,西洋芹都是十分可口又健康的饮食呢!
            纳豆:容易保存的纳豆是日式早餐的必需品之一,虽然有很多年轻人不喜欢纳豆的口味,但是含有丰富钾的纳豆,可说是日本人健康、长寿的食物之一。

    六、比较有效的瘦脸护肤品

    1.如果你的面部脂肪较多

      虽然脸部的脂肪含量不多,但随着身体脂肪的增加,脸部脂肪细胞仍会出现胀大的问题。你可以选择针对面部脂肪的紧致瘦脸产品,此外,还需要戒掉口味重的食物和频繁嚼口香糖的习惯。保养品的成效绝不可能数天内达到,至少要坚持使用两个月以上才有可能看出效果。

      推荐:

      1. 娇韵诗纤美紧容露 580元 有效抑制面部脂肪,重塑纤容。

      2. 迪奥10°紧致塑性凝乳 440元 特别针对圆脸女性,快速渗透肌肤,修饰脸庞下半部分。

      3. 兰蔻纤妍紧肤精华露 550元 独特的成分强效收紧肌肤,重塑脸部、颈部轮廓。

      2.如果你的面部肿胀

      那种只要多喝点水,或是熬夜、血液循环不佳时,便难逃面部浮肿,属于代谢较差的人,可以选择改善并加强肌肤血液循环或水分代谢为主的保养品,成分以咖啡因、葡萄柚、天竺葵等为主,通过保养品恢复微循环正常的运作,让血液运送的水分量与被回收的水分达到平衡,脸蛋自然看起来就能较紧缩。

      推荐:

      4. VICHY弹力修纹紧肤晚霜 238元 增强皮肤弹性,防止第二天醒来皮肤浮肿,抚平幼纹和细纹。

      5. DHC纤容精华液 200元 对于摄水过多造成的水肿以及收紧脸部线条效果明显。

      6. CHANEL完美修护精华液 1120元 紧致肌肤,收紧脸部轮廓,实现纤瘦的面颊。


      每天练习发“a e i o u”这几个英文单词,可以达到修饰面部线条的效果。

       指压消肿法:

    使脸颊消肿的穴道有"听会穴"、"大迎穴"、"颊车穴"等。由于这些穴道比较难记难找,我们可以按照下面的方法进行按摩指压,以达到按压穴道的作用。
    a.大拇指指腹贴近颧骨下方,稍用力垂直往下轻压2公分左右,指力往上轻抬即可,再缓缓将指力放松。
    b.中指、无名指并拢,沿颧骨下缘指力平行往下轻压至2公分处,再往上顶。
    c.四指并拢,在脸颊的穴道上轻拍数下。
    d.画圆圈:四指并拢,轻触脸颊上,似碰未碰。顺时针方向,由内往外画圆圈。
    注意:以上的指压按摩动作,适合两天做一次。过于频繁或用力过度的按摩,都有可能造成神经传导迟钝或肌肉松垮、挫伤。



  • SoapUI--WebService性能测试工具介绍

    gcm_xp 发布于 2009-04-21 11:14:20

       soapUI把工作组织成项目。每个项目主要由需要测试的接口来识别。在这里,接口是指另外一端的指向一个暴露了Web service方法的站点的URI(统一资源标识)。你可以很快地创建一个基本的项目结构;soapUI能接受一个文件的WSDL或者一个Web service终点传输的WSDL。

      项目被有层次结构地组织,并且包含一个或多个TestSuite,TestSuite包含一个或多个TestCase,TestCase包含一个或多个测试步骤。真正的工作 – 发送请求、接受响应、分析结果、改变测试执行流程 – 发生在测试步骤这个层面。TestCase收集和组织需要执行某个对目标的特定操作的步骤。TestSuite汇总那些发生在某个特定区域的Web service的TestCase(例如订购一本书所需要的操作)。你可以通过右键点击项目树中的父节点并选择上下文菜菜单中的“New”菜单,来创建新的TestSuite、TestCase和测试步骤。

      soapUI通过检查附加给测试响应的断言来判断测试是通过还是失败。有大量的断言可供选择,从“simple contains”测试 – 如果某个提供的字符串匹配则表示成功 – 到“XPath matching”,对响应信息执行复杂的XPath表达式匹配成功则表示测试通过。

      测试步骤与程序代码很类似。目前,soapUI定义了6个测试步骤类型,最普遍的是请求(Request),发送一个HTTP请求给目标地址,并接收一个响应。可插入条件跳转测试步骤(Conditonal GoTo)来控制流程。一个或多个检查最近的响应的Xpath表达式是必不可少的。第一个表达式的成功会导致相关测试步骤分支的执行。

      soapUI最强大的是Groovy测试步骤。Groovy是类Java的轻量级脚本语言。一个Groovy测试步骤可以是任何Groovy代码,也就是说基本上Groovy能做的事情,在测试步骤中也能做。测试步骤中的Groovy代码可以访问soapUI框架。例如,一个Groovy测试步骤可以通过JDBC读取数据库的信息,与前一个测试步骤的响应信息进行比较,并响应地修改执行的流程 – 甚至执行另外一个TestCase。

        除了功能测试外,soapUI还能对Web service进行压力测试。每个压力测试包含一个或多个TestCase的执行,并且可以调整用于模拟各种各样的场景。你可以指定测试执行一定量的时间长度,或者一定量的迭代周期,指定以并发的方式执行还是随时间线性变化的方式。

      当压力测试完成后,一个压力测试编辑器会为每个TestCase提供大量的统计数据:执行的次数,最大、最小、平均执行时间等。还可以在统计图表页以图表的形式查看这些数据。

     

  • 负载测试、压力测试和性能测试的异同

    超越自我 发布于 2008-12-19 14:08:23


     负载测试(Load testing)、压力测试(Stress Test,应称为强度测试)和性能测试,这三个概念常常引起混淆,难以区分,从而造成不正确的理解和错误的使用。之前,也有不少讨论,比较有名的,应归为Grig Gheorghiu's的两篇博客:

    Performance vs. load vs. stress testing
    More on performance vs. load testing
         负载测试、压力测试和性能测试的测试目的不同,但其手段和方法在一定程度上比较相似,通常会使用相同的测试环境和测试工具,而且都会监控系统所占用资源的情况以及其它相应的性能指标,这也是造成人们容易产生概念混淆的主要原因。
         我们知道,软件总是运行在一定的环境下,这种环境包括支撑软件运行的软硬件环境和影响软件运行的外部条件。为了让客户使用软件系统感到满意,必须确保系统运行良好,达到高安全、高可靠和高性能。其中,系统是否具有高性能的运行特征,不仅取决于系统本身的设计和程序算法,而且取决于系统的运行环境。系统的运行环境会依赖于一些关键因素,例如:

    系统架构,如分布式服务器集群还是集中式主机系统等。
    硬件配置,如服务器的配置,CPU、内存等配置越高,系统的性能会越好。
    网络带宽,随着带宽的提高,客户端访问服务器的速度会有较大的改善。
    支撑软件的选定,如选定不同的数据库管理系统(Oracle、MySQL等)和web应用服务器(Tomcat、GlassFish、Jboss、WebLogic等),对应用系统的性能都有影响。
    外部负载,同时有多少个用户连接、用户上载文件大小、数据库中的记录数等都会对系统的性能有影响。一般来说,系统负载越大,系统的性能会降低。
         从上面可以看出,使系统的性能达到一个最好的状态,不仅通过对处在特定环境下的系统进行测试以完成相关的验证,而且往往要根据测试的结果,对系统的设计、代码和配置等进行调整,提高系统的性能。许多时候,系统性能的改善是测试、调整、再测试、再调整、……一个持续改进的过程,这就是我们经常说的性能调优(perormance tuning)。
        在了解了这样一个背景之后,就比较容易理解为什么在性能测试中常常要谈负载测试。从测试的目的出发、从用户的需求出发,就比较容易区分性能测试、负载测试和压力测试。性能测试是为了获得系统在某种特定的条件下(包括特定的负载条件下)的性能指标数据,而负载测试、压力测试是为了发现软件系统中所存在的问题,包括性能瓶颈、内存泄漏等。通过负载测试,也是为了获得系统正常工作时所能承受的最大负载,这时负载测试就成为容量测试。通过压力测试,可以知道在什么极限情况下系统会崩溃、系统是否具有自我恢复性等,但更多的是为了确定系统的稳定性。
         那么,如何给负载测试、压力测试下个定义呢?根据上述讨论,我们可以给出如下的定义:

    负载测试是模拟实际软件系统所承受的负载条件的系统负荷,通过不断加载(如逐渐增加模拟用户的数量)或其它加载方式来观察不同负载下系统的响应时间和数据吞吐量、系统占用的资源(如CPU、内存)等,以检验系统的行为和特性,以发现系统可能存在的性能瓶颈、内存泄漏、不能实时同步等问题。负载测试更多地体现了一种方法或一种技术。
    压力测试是在强负载(大数据量、大量并发用户等)下的测试,查看应用系统在峰值使用情况下操作行为,从而有效地发现系统的某项功能隐患、系统是否具有良好的容错能力和可恢复能力。压力测试分为高负载下的长时间(如24小时以上)的稳定性压力测试和极限负载情况下导致系统崩溃的破坏性压力测试。
         压力测试可以被看作是负载测试的一种,即高负载下的负载测试,或者说压力测试采用负载测试技术。通过压力测试,可以更快地发现内存泄漏问题,还可以更快地发现影响系统稳定性的问题。例如,在正常负载情况下,某些功能不能正常使用或系统出错的概率比较低,可能一个月只出现一次,但在高负载(压力测试)下,可能一天就出现,从而发现有缺陷的功能或其它系统问题。通过负载测试,可以证明这一点,某个电子商务网站的订单提交功能,在10个并发用户时错误率是零,在50个并发用户时错误率是1%,而在200个并发用户时错误率是20%。
        负载测试是为了发现系统的性能问题,负载测试需要通过系统性能特性或行为来发现问题,从而为性能改进提供帮助,从这个意义看,负载测试可以看作性能测试的一部分。但它们两者的目的是不一样的,负载测试是为了发现缺陷,而性能测试是为了获取性能指标。因为性能测试过程中,也可以不调整负载,而是在同样负载情况下改变系统的结构、改变算法、改变硬件配置等等来得到性能指标数据,从这个意义看,负载测试可以看作是性能测试所c的一种技术,即性能测试使用负载测试的技术、使用负载测试的工具。性能测试要获得在不同的负载情况下的性能指标数据。
        通过负载测试和压力测试都可以获得系统正常工作时的极限负载或最大容量。容量测试,自然也是采用负载测试技术来实现,而在破坏性的压力测试中,容量的确定可以看作是一种副产品——间接结果。
        综合所述,负载测试、压力测试和性能测试的概念可以概括如下:

    负载测试是通过改变系统负载方式、增加负载等来发现系统中所存在的性能问题。负载测试是一种测试方法,可以为性能测试、压力测试所采用。负载测试的加载方式也有很多种,可以根据测试需要来选择。
    性能测试是为获取或验证系统性能指标而进行测试。多数情况下,性能测试会在不同负载情况下进行。
    压力测试通常是在高负载情况下来对系统的稳定性进行测试,更有效地发现系统稳定性的隐患和系统在负载峰值的条件下功能隐患等。


     

  • web应用程序性能测试(摘录)

    超越自我 发布于 2008-12-29 15:34:26

    给一个web应用做性能测试,你要知道至少两样东西:

    在不同并发用户数或者HTTP连接数情况下的负载预期值*

    可接受的响应时间

    当你知道你的目标后,你就可以开始使用对系统持续增加负载的方法来观察系统的瓶颈所在。重新拿web应用系统来做例子,这些瓶颈可存在于多个层次,你可以使用多种工具来查明它们的所在:


    在应用层,开发人员可以通过profilers来发现低效率的代码,比如说较差的查找算法
    在数据库层,开发人员和数据库管理员(DBA)可以通过特定的数据库profilers及事件探查器(query optimizers)
    在操作系统层,系统工程师可以使用一些工具如在Unix类的操作系统中的top,vmstat,iostat,在Windows系统中的PerfMon来监控CPU,内在,swap,磁盘I/O等硬件资源;专门的内核监控软件也可以在这一层面上被使用。
    在网络层上,网络工程师可以使用报文探测器(如tcpdump),网络协议分析器(如ethereal),还有其它的工具(如netstat,MRTG,ntop,mii-tool)

    下面就是一些在应用程序代码*之外仍可以提高WEB应用系统性能的例子:

    使用WEB缓存装制,如Squid提供的装置
    将高访问量的网页静态化,以避免这些高访问量对数据库进行大量的调用
    通过负载平衡的方法来水平缩放WEB服务器的结构
    在水平缩放数据库群及将它们分为读写服务器和只读服务器后,还要对只读服务器群负载平衡。
    通过增加更多的硬件资源(CPU,内存,磁盘等)纵向的缩放WEB及数据库服务器群
    增加网络的带宽

    负载测试

    我们都已经在性能测试调试的过程中,见识过负载测试了。在那种环境中,它意味着通过自动化工具来持续对系统增加负载。但对于WEB应用来讲,负载则是并发用户或者HTTP连接的数量。

    术语“负载测试”在测试文献资料中通常都被定义为给被测系统加上它所能操作的最大任务数的过程。负载测试有时也会被称为“容量测试”,或者“耐久性测试/持久性测试”

    容量测试的例子:

    通过编辑一个巨大的文件来测试文字处理软件
    通过发送一个巨大的作业来测试打印机
    通过成千上万的用户邮箱来测试邮件服务器
    有一种比较特别的容量测试是叫作“零容量测试”,它是给系统加上空任务来测试的。
    耐久性测试/持久性测试的的例子:

    在一个循环中不停的运行客户端超过一个扩展时间段。
    负载测试的目的:

    找到一些在测试流程中前面的阶段所进行的粗略测试中没有被找出的bugs,例如,内存管理bugs,内存泄露,缓冲器溢出等等。
    保证应用程序达到性能测试中确定的性能基线。这个可以在运行回归试验时,通过加载特定的最大限度的负载来实现。
    尽管性能测试和负载测试似乎很像,但他们的目的还是有差异的。一方面,性能测试使用负载测试的技术,工具,以及用不同的负载程度来测度和基准化系统。在另一方面来讲,负载测试是在一些已经定义好的负载程度上进行测试的,通常对系统加上最大负载之后,系统应该仍然可以提供全部功能。这里需要明确一点,负载测试并不是要对系统加载上过度的负载而使系统不能工作,而是要使系统像一个上满了油的机器嗡嗡叫。

    在负载测试的相关内容中,我想应该非常重要的是要有十分充足的数据来进行测试。从我的经验中得知,假若不用非常大的数据*去测的话,有很多严重的bug是不会的到的。比如说,LDAP/NIS/Active Directory数据库中成千上万的用户,邮件服务器中成千上万的邮箱,数据库中成G成G的表,文件系统中很深的文件或者目录的层次,等等。显然,测试人员就需要使用自动化工具来产生这些庞大的数据集,比较幸运的是任何优秀的脚本语言都可以胜任这些工作。

    压力测试

    压力测试是指通过对系统加载过度的资源或者例系统没有应该具有的令系统可以正常运作的资源,来使系统崩溃(在某些情况的时候,它又可以叫做负面测试)。进行这个疯狂行为的主要目的是为了保证系统出故障及可以适当的恢复,而这个恢复得怎么样的特性则是叫做可恢复性。

    当性能测试需要的是一个可控制的环境和不断的测度的时候,压力测试则是令为欢喜的引起混乱及不可预测性(译者按:从这一点可以看出作者是一个很优秀的测试人员)。还是举WEB应用系统为例,下面是一些对系统可行的压力测试方法:

    两倍的已经基线的并发用户数或者HTTP连接数
    随机的关闭及重开连接到服务器上的网络上集线器/路由器的端口(例如,可以通过SNMP命令来实现)
    把数据库断线然后再重启
    当系统还在运行的时候,重建一个RAID阵列
    WEB和数据库服务器上运行消耗资源(如CPU,内存,磁盘,网络)的进程

     

  • 消除内存泄漏

    超越自我 发布于 2008-12-25 17:00:10

    摘要

      虽然Java虚拟机(JVM)及其垃圾收集器(garbage collector,GC)负责管理大多数的内存任务,Java软件程序中还是有可能出现内存泄漏。实际上,这在大型项目中是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何发生的。本文介绍了编写Java代码的一些常见的内存泄漏陷阱,以及编写不泄漏代码的一些最佳实践。一旦发生了内存泄漏,要指出造成泄漏的代码是非常困难的。因此本文还介绍了一种新工具,用来诊断泄漏并指出根本原因。该工具的开销非常小,因此可以使用它来寻找处于生产中的系统的内存泄漏。

    垃圾收集器的作用

      虽然垃圾收集器处理了大多数内存管理问题,从而使编程人员的生活变得更轻松了,但是编程人员还是可能犯错而导致出现内存问题。简单地说,GC循环地跟踪所有来自“根”对象(堆栈对象、静态对象、JNI句柄指向的对象,诸如此类)的引用,并将所有它所能到达的对象标记为活动的。程序只可以操纵这些对象;其他的对象都被删除了。因为GC使程序不可能到达已被删除的对象,这么做就是安全的。

      虽然内存管理可以说是自动化的,但是这并不能使编程人员免受思考内存管理问题之苦。例如,分配(以及释放)内存总会有开销,虽然这种开销对编程人员来说是不可见的。创建了太多对象的程序将会比完成同样的功能而创建的对象却比较少的程序更慢一些(在其他条件相同的情况下)。

      而且,与本文更为密切相关的是,如果忘记“释放”先前分配的内存,就可能造成内存泄漏。如果程序保留对永远不再使用的对象的引用,这些对象将会占用并耗尽内存,这是因为自动化的垃圾收集器无法证明这些对象将不再使用。正如我们先前所说的,如果存在一个对对象的引用,对象就被定义为活动的,因此不能删除。为了确保能回收对象占用的内存,编程人员必须确保该对象不能到达。这通常是通过将对象字段设置为null或者从集合(collection)中移除对象而完成的。但是,注意,当局部变量不再使用时,没有必要将其显式地设置为null。对这些变量的引用将随着方法的退出而自动清除。

      概括地说,这就是内存托管语言中的内存泄漏产生的主要原因:保留下来却永远不再使用的对象引用。

    典型泄漏

      既然我们知道了在Java中确实有可能发生内存泄漏,就让我们来看一些典型的内存泄漏及其原因。

    全局集合

      在大的应用程序中有某种全局的数据储存库是很常见的,例如一个JNDI树或一个会话表。在这些情况下,必须注意管理储存库的大小。必须有某种机制从储存库中移除不再需要的数据。

      这可能有多种方法,但是最常见的一种是周期性运行的某种清除任务。该任务将验证储存库中的数据,并移除任何不再需要的数据。

      另一种管理储存库的方法是使用反向链接(referrer)计数。然后集合负责统计集合中每个入口的反向链接的数目。这要求反向链接告诉集合何时会退出入口。当反向链接数目为零时,该元素就可以从集合中移除了。

    缓存

      缓存是一种数据结构,用于快速查找已经执行的操作的结果。因此,如果一个操作执行起来很慢,对于常用的输入数据,就可以将操作的结果缓存,并在下次调用该操作时使用缓存的数据。

      缓存通常都是以动态方式实现的,其中新的结果是在执行时添加到缓存中的。典型的算法是:

    • 检查结果是否在缓存中,如果在,就返回结果。
    • 如果结果不在缓存中,就进行计算。
    • 将计算出来的结果添加到缓存中,以便以后对该操作的调用可以使用。

      该算法的问题(或者说是潜在的内存泄漏)出在最后一步。如果调用该操作时有相当多的不同输入,就将有相当多的结果存储在缓存中。很明显这不是正确的方法。

      为了预防这种具有潜在破坏性的设计,程序必须确保对于缓存所使用的内存容量有一个上限。因此,更好的算法是:

    • 检查结果是否在缓存中,如果在,就返回结果。
    • 如果结果不在缓存中,就进行计算。
    • 如果缓存所占的空间过大,就移除缓存最久的结果。
    • 将计算出来的结果添加到缓存中,以便以后对该操作的调用可以使用。

      通过始终移除缓存最久的结果,我们实际上进行了这样的假设:在将来,比起缓存最久的数据,最近输入的数据更有可能用到。这通常是一个不错的假设。

      新算法将确保缓存的容量处于预定义的内存范围之内。确切的范围可能很难计算,因为缓存中的对象在不断变化,而且它们的引用包罗万象。为缓存设置正确的大小是一项非常复杂的任务,需要将所使用的内存容量与检索数据的速度加以平衡。

      解决这个问题的另一种方法是使用java.lang.ref.SoftReference类跟踪缓存中的对象。这种方法保证这些引用能够被移除,如果虚拟机的内存用尽而需要更多堆的话。

    ClassLoader

      Java ClassLoader结构的使用为内存泄漏提供了许多可乘之机。正是该结构本身的复杂性使ClassLoader在内存泄漏方面存在如此多的问题。ClassLoader的特别之处在于它不仅涉及“常规”的对象引用,还涉及元对象引用,比如:字段、方法和类。这意味着只要有对字段、方法、类或ClassLoader的对象的引用,ClassLoader就会驻留在JVM中。因为ClassLoader本身可以关联许多类及其静态字段,所以就有许多内存被泄漏了。

    确定泄漏的位置

      通常发生内存泄漏的第一个迹象是:在应用程序中出现了OutOfMemoryError。这通常发生在您最不愿意它发生的生产环境中,此时几乎不能进行调试。有可能是因为测试环境运行应用程序的方式与生产系统不完全相同,因而导致泄漏只出现在生产中。在这种情况下,需要使用一些开销较低的工具来监控和查找内存泄漏。还需要能够无需重启系统或修改代码就可以将这些工具连接到正在运行的系统上。可能最重要的是,当进行分析时,需要能够断开工具而保持系统不受干扰。

      虽然OutOfMemoryError通常都是内存泄漏的信号,但是也有可能应用程序确实正在使用这么多的内存;对于后者,或者必须增加JVM可用的堆的数量,或者对应用程序进行某种更改,使它使用较少的内存。但是,在许多情况下,OutOfMemoryError都是内存泄漏的信号。一种查明方法是不间断地监控GC的活动,确定内存使用量是否随着时间增加。如果确实如此,就可能发生了内存泄漏。

    详细输出

      有许多监控垃圾收集器活动的方法。而其中使用最广泛的可能是使用-Xverbose:gc选项启动JVM,并观察输出。

    [memory ] 10.109-10.235: GC 65536K->16788K (65536K), 126.000 ms

     箭头后面的值(本例中是16788K)是垃圾收集所使用的堆的容量。

    控制台

      查看连续不断的GC的详细统计信息的输出将是非常乏味的。幸好有这方面的工具。JRockit Management Console可以显示堆使用量的图示。借助于该图,可以很容易地看出堆使用量是否随时间增加。

    图1. JRockit Management Console

      甚至可以配置该管理控制台,以便如果发生堆使用量过大的情况(或基于其他的事件),控制台能够向您发送电子邮件。这明显使内存泄漏的查看变得更容易了。

    内存泄漏检测工具

      还有其他的专门进行内存泄漏检测的工具。JRockit Memory Leak Detector可以用来查看内存泄漏,并可以更深入地查出泄漏的根源。这个强大的工具是紧密集成到JRockit JVM中的,其开销非常小,对虚拟机的堆的访问也很容易。

    专业工具的优点

      一旦知道确实发生了内存泄漏,就需要更专业的工具来查明为什么会发生泄漏。JVM自己是不会告诉您的。这些专业工具从JVM获得内存系统信息的方法基本上有两种:JVMTI和字节码技术(byte code instrumentation)。Java虚拟机工具接口(Java Virtual Machine Tools Interface,JVMTI)及其前身Java虚拟机监视程序接口(Java Virtual Machine Profiling Interface,JVMPI)是外部工具与JVM通信并从JVM收集信息的标准化接口。字节码技术是指使用探测器处理字节码以获得工具所需的信息的技术。

      对于内存泄漏检测来说,这两种技术有两个缺点,这使它们不太适合用于生产环境。首先,它们在内存占用和性能降低方面的开销不可忽略。有关堆使用量的信息必须以某种方式从JVM导出,并收集到工具中进行处理。这意味着要为工具分配内存。信息的导出也影响了JVM的性能。例如,当收集信息时,垃圾收集器将运行得比较慢。另外一个缺点是需要始终将工具连在JVM上。这是不可能的:将工具连在一个已经启动的JVM上,进行分析,断开工具,并保持JVM运行。

      因为JRockit Memory Leak Detector是集成到JVM中的,就没有这两个缺点了。首先,许多处理和分析工作是在JVM内部进行的,所以没有必要转换或重新创建任何数据。处理还可以背负(piggyback)在垃圾收集器本身上而进行,这意味着提高了速度。其次,只要JVM是使用-Xmanagement选项(允许通过远程JMX接口监控和管理JVM)启动的,Memory Leak Detector就可以与运行中的JVM进行连接或断开。当该工具断开时,没有任何东西遗留在JVM中,JVM又将以全速运行代码,正如工具连接之前一样。

    趋势分析

      让我们深入地研究一下该工具以及它是如何用来跟踪内存泄漏的。在知道发生内存泄漏之后,第一步是要弄清楚泄漏了什么数据--哪个类的对象引起了泄漏?JRockit Memory Leak Detector是通过在每次垃圾收集时计算每个类的现有对象的数目来实现这一步的。如果特定类的对象数目随时间而增长(“增长率”),就可能发生了内存泄漏。


    图2. Memory Leak Detector的趋势分析视图

      因为泄漏可能像细流一样非常小,所以趋势分析必须运行很长一段时间。在短时间内,可能会发生一些类的局部增长,而之后它们又会跌落。但是趋势分析的开销很小(最大开销也不过是在每次垃圾收集时将数据包由JRockit发送到Memory Leak Detector)。开销不应该成为任何系统的问题——即使是一个全速运行的生产中的系统。

      起初数目会跳跃不停,但是一段时间之后它们就会稳定下来,并显示出哪些类的数目在增长。

    找出根本原因

      有时候知道是哪些类的对象在泄漏就足以说明问题了。这些类可能只用于代码中的非常有限的部分,对代码进行一次快速检查就可以显示出问题所在。遗憾地是,很有可能只有这类信息还并不够。例如,常见到泄漏出在类java.lang.String的对象上,但是因为字符串在整个程序中都使用,所以这并没有多大帮助。

      我们想知道的是,另外还有哪些对象与泄漏对象关联?在本例中是String。为什么泄漏的对象还存在?哪些对象保留了对这些对象的引用?但是能列出的所有保留对String的引用的对象将会非常多,以至于没有什么实际用处。为了限制数据的数量,可以将数据按类分组,以便可以看出其他哪些对象的类与泄漏对象(String)关联。例如,String在Hashtable中是很常见的,因此我们可能会看到与String关联的Hashtable数据项对象。由Hashtable数据项倒推,我们最终可以找到与这些数据项有关的Hashtable对象以及String(如图3所示)。


    图3. 在工具中看到的类型图的示例视图

    倒推

      因为我们仍然是以类的对象而不是单独的对象来看待对象,所以我们不知道是哪个Hashtable在泄漏。如果我们可以弄清楚系统中所有的Hashtable都有多大,我们就可以假定最大的Hashtable就是正在泄漏的那一个(因为随着时间的流逝它会累积泄漏而增长得相当大)。因此,一份有关所有Hashtable对象以及它们引用了多少数据的列表,将会帮助我们指出造成泄漏的确切Hashtabl。


    图4. 界面:Hashtable对象以及它们所引用数据的数量的列表

      对对象引用数据数目的计算开销非常大(需要以该对象作为根遍历引用图),如果必须对许多对象都这么做,将会花很多时间。如果了解一点Hashtable的内部实现原理就可以找到一条捷径。Hashtable的内部有一个Hashtable数据项的数组。该数组随着Hashtable中对象数目的增长而增长。因此,为找出最大的Hashtable,我们只需找出引用Hashtable数据项的最大数组。这样要快很多。


    图5. 界面:最大的Hashtable数据项数组及其大小的清单

    更进一步

      当找到发生泄漏的Hashtable实例时,我们可以看到其他哪些实例在引用该Hashtable,并倒推回去看看是哪个Hashtable在泄漏。


    图 6. 这就是工具中的实例图

      例如,该Hashtable可能是由MyServer类型的对象在名为activeSessions的字段中引用的。这种信息通常就足以查找源代码以定位问题所在了。


    图7. 检查对象以及它对其他对象的引用

    找出分配位置

      当跟踪内存泄漏问题时,查看对象分配到哪里是很有用的。只知道它们如何与其他对象相关联(即哪些对象引用了它们)是不够的,关于它们在何处创建的信息也很有用。当然了,您并不想创建应用程序的辅助构件,以打印每次分配的堆栈跟踪(stack trace)。您也不想仅仅为了跟踪内存泄漏而在运行应用程序时将一个分析程序连接到生产环境中。

      借助于JRockit Memory Leak Detector,应用程序中的代码可以在分配时进行动态添加,以创建堆栈跟踪。这些堆栈跟踪可以在工具中进行累积和分析。只要不启用就不会因该功能而产生成本,这意味着随时可以进行分配跟踪。当请求分配跟踪时,JRockit 编译器动态插入代码以监控分配,但是只针对所请求的特定类。更好的是,在进行数据分析时,添加的代码全部被移除,代码中没有留下任何会引起应用程序性能降低的更改。


    图8. 示例程序执行期间String的分配的堆栈跟踪

    结束语

      内存泄漏是难以发现的。本文重点介绍了几种避免内存泄漏的最佳实践,包括要始终记住在数据结构中所放置的内容,以及密切监控内存使用量以发现突然的增长。

      我们都已经看到了JRockit Memory Leak Detector是如何用于生产中的系统以跟踪内存泄漏的。该工具使用一种三步式的方法来找出泄漏。首先,进行趋势分析,找出是哪个类的对象在泄漏。接下来,看看有哪些其他的类与泄漏的类的对象相关联。最后,进一步研究单个对象,看看它们是如何互相关联的。也有可能对系统中所有对象分配进行动态的堆栈跟踪。这些功能以及该工具紧密集成到JVM中的特性使您可以以一种安全而强大的方式跟踪内存泄漏并进行修复。

    参考资料

Open Toolbar