软件测试两年经验,感觉这两年成长还是不错的,主攻性能测试,望有相关 共同理想的朋友一起探讨交流职业路~

发布新日志

  • 系统管理员必须熟记的几个Linux命令

    2010-11-07 21:41:58

    摘要:我们在使用Linux操作系统的时候有许多命令需要我们掌握,但是在众多的命令之中也有轻重之分。那么那些是作为一个系统管理员最应该掌握的命令呢?这些命令又要如何使用呢?看完下文你会有所启发。

      Linux 中的所有管理任务都可以在终端中完成。许多情况下,使用终端比使用图形化的程序更快捷,而且还可能实现额外的功能。不仅如此,所有的终端任务都可以写到脚本中,这样就可以自动执行。为了真正地驾驭您的 Linux 环境,您将希望掌握如何在终端中工作。如果您曾经使用过 DOS/Windows,本文将引导您开始使用 Linux 终端。

      进入终端

      如果您的系统引导进入文本模式(为了降低服务开销,服务器通常是这样配置的),那么您在以文本形式登录后就已经在终端中了。在典型的 Linux 系统中,通过组合键 Ctrl + Alt + (F1 - F6) 您可以切换到另外的终端。每一个终端是系统中一个完全独立的会话,不同的用户可以同时使用。

      这一多终端的特点与 Windows 中的多桌面不同。在 Linux 中,每一个终端可以分别由完全不同的用户来控制。例如,您可能在终端 1 中以 root身份登录,而在终端 2 中以 joeuser 身份登录。两个终端在各自的用户空间中运行不同的程序。与此类似,不同的用户可以远程登录到同一个 Windows 系统中。就这一点来说,Linux 更像是主机而不是简单的服务器或工作站。

      如果您是在图形模式下,那么您可以打开一个 虚拟终端 (terminal)以进入终端窗口。通常在桌面的任务条上会有终端的按钮。您也可以从上下文菜单(在桌面上单击右键)打开终端 。

      命令

      在终端中可以使用的命令很多。其中有一些实际上只在编写脚本时才会用到。这里介绍一些您最可能用到的命令。不要忘记,所有的命令和选项都区分大小写。 -R 与 -r不同,会去执行不同的操作。终端命令几乎全都是小写的。

      ◆cd

      使用我们所熟悉的 cd 命令可以在目录间切换。一定注意的是在 Linux 中用的是正斜杠 (/),而不是您所熟悉的反斜杠 (\)。反斜杠也用到了,但只是用来说明命令需要换行继续,这样可以提高比较长的命令的可读性。

      ◆ls

      ls 命令用于列出一个目录下的所有文件。可以使用许多不同的开关更改列表的表示形式:

      ls -l 以长格式列出文件,包括文件大小、日期和时间、属性

      ls -t 对文件以时间排序

      ls -S 对文件以大小排序

      ls -r 与一个排序开关组合起来使用,逆序排列。

      ls -t 将最新的文件显示在列表的顶部。

      ls -t 将最新的文件显示在底部。

      ls -h 易读格式。使用 k、M、G 等来标识文件的大小,而不是以字节为单位。

      ls -a 显示目录中所有的文件,包括隐藏文件

    ◆cp

      使用 cp 命令来复制文件。这个命令与 DOS 下的 copy 命令基本一样。基本的开关如下:

      cp -R 递归地复制文件;当需要复制整个目录时会用到

      cp -f 强制复制并覆盖已有的文件,不询问用户

      cp -l 链接文件,而不是复制;见下面的说明

      ◆mv

      使用 mv 命令来移动和重命名文件。这个命令的工作方式基本上与 DOS 中的 move 命令一样,不过它可以移动整个目录结构及所有文件。

      ◆cat

      使用 cat 命令来查看文件的内容。它相当于 DOS 中的 type 命令。它将把文件的内容转储到另一个文件、屏幕或者其他命令。 cat 是concatenate 的简写,还可以将一系列的文件合并为一个大文件。

      ◆more

      使用命令 more 可以以分页的方式查看文件。它基本上与 DOS 中的 more 命令相同。

      ◆less

      less 命令也是用来查看文件,但是它支持上下滚屏以及在文档中进行文本搜索。

      ◆vi

      有一些人可能会说 vi 表示“virtually impossible”。它是 Unix 中的一个历史悠久的文本编辑器。 vi 并不真正直观,但是现在几乎所有的类 Unix 环境中都有 vi 。对于 Linux 中安装的版本有一个内置的教程,一旦您熟悉了 vi ,只需几次击键就可以完成不可思议的任务。说实话,没有任何编辑器能够取代 vi 来编辑密码和配置文件。

      ◆man

      使用 man 命令来查看命令的文档。man 是 manual 的缩写。几乎每一个命令都有相应的文档。要深入了解 man ,请输入以下命令:

      man man

      ◆info

      info 命令与 man 命令类似,不过它提供了超链接文本,可以更方便地浏览文档。

      链接

      Linux 文件系统最重要的特点之一是它的文件链接。链接是对文件的引用,这样您可以让文件在文件系统中多处被看到。不过,在 Linux 中,链接可以如同原始文件一样来对待。链接可以与普通的文件一样被执行、编辑和访问。对系统中的其他应用程序而言,链接就是它所对应的原始文件。当您通过链接对文件进行编辑时,您编辑的实际上是原始文件。链接不是副本。有两种类型的链接:硬链接和符号链接(软链接)。

      硬链接只能引用同一文件系统中的文件。它引用的是文件在文件系统中的物理索引(也称为 inode)。当您移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于文件的安全。如果您删除的文件有相应的硬链接,那么这个文件依然会保留,直到所有对它的引用都被删除。

      符号链接(软链接)是一个指针,指向文件在文件系统中的位置。符号链接可以跨文件系统,甚至可以指向远程文件系统中的文件。符号链接只是指明了原始文件的位置,用户需要对原始文件的位置有访问权限才可以使用链接。如果原始文件被删除,所有指向它的符号链接也就都被破坏了。它们会指向文件系统中并不存在的一个位置。

      两种链接都可以通过命令 ln 来创建。ln 默认创建的是硬链接。使用 -s 开关可以创建符号链接。

  • 转:JVM调优机制

    2010-11-02 00:07:08

    JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用。下面是本人一些JVM调优的实践经验,希望对读者能有帮助,环境LinuxAS4,resin2.1.17,JDK6.0,2CPU,4G内存,dell2950服务器。

      JVM调优

      一:JVM调优之串行垃圾回收

      也就是默认配置,完成10万request用时153秒。JVM参数配置如下:

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server  

    -Xms2048M-Xmx2048M-Xmn512M
    -XX:PermSize=256M-XX:MaxPermSize=256M 

    -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19 

    -Xnoclassgc-Xloggc:log/gc.log
    -XX:+PrintGCDetails-XX:+PrintGCTimeStamps";

      这种配置一般在resin启动24小时内似乎没有大问题,网站可以正常访问,但查看日志发现,在接近24小时时,FullGC执行越来越频繁,大约每隔3分钟就有一次FullGC,每次FullGC系统会停顿6秒左右,作为一个网站来说,用户等待6秒恐怕太长了,所以这种方式有待改善。MaxTenuringThreshold=7表示一个对象如果在救助空间移动7次还没有被回收就放入年老代,GCTimeRatio=19表示java可以用5%的时间来做垃圾回收,1/(1+19)=1/20=5%。

      二:JVM调优之并行回收

      完成10万request用时117秒,配置如下:

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xmx2048M 
    -Xms2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M
    -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails 
    -XX:+PrintGCTimeStamps-XX:+UseParallelGC-XX:ParallelGCThreads=20
    -XX:+UseParallelOldGC-XX:MaxGCPauseMillis=500
    -XX:+UseAdaptiveSizePolicy-XX:MaxTenuringThreshold=7
    -XX:GCTimeRatio=19";

      并行回收我尝试过多种组合配置,似乎都没什么用,resin启动3小时左右就会停顿,时间超过10秒。也有可能是参数设置不够好的原因,MaxGCPauseMillis表示GC最大停顿时间,在resin刚启动还没有执行FullGC时系统是正常的,但一旦执行FullGC,MaxGCPauseMillis根本没有用,停顿时间可能超过20秒,之后会发生什么我也不再关心了,赶紧重启resin,尝试其他回收策略。

      三:JVM调优之并发回收

      完成10万request用时60秒,比并行回收差不多快一倍,是默认回收策略性能的2.5倍,配置如下:

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server 
    -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M
    -XX:MaxPermSize=256M-XX:+UseConcMarkSweepGC 
    -XX:MaxTenuringThreshold=7-XX:GCTimeRatio=19
    -Xnoclassgc-Xloggc:log/gc.log-XX:+PrintGCDetails 
    -XX:+PrintGCTimeStamps-XX:+UseCMSCompactAtFullCollection 
    -XX:CMSFullGCsBeforeCompaction=0";

      这个配置虽然不会出现10秒连不上的情况,但系统重启3个小时左右,每隔几分钟就会有5秒连不上的情况,查看gc.log,发现在执行ParNewGC时有个promotionfailed错误,从而转向执行FullGC,造成系统停顿,而且会很频繁,每隔几分钟就有一次,所以还得改善。UseCMSCompactAtFullCollection是表是执行FullGC后对内存进行整理压缩,免得产生内存碎片,CMSFullGCsBeforeCompaction=N表示执行N次FullGC后执行内存压缩。

    四:JVM调优之增量回收

      完成10万request用时171秒,太慢了,配置如下:

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server 
    -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M
    -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7
    -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log 
    -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Xincgc";

      似乎回收得也不太干净,而且也对性能有较大影响,不值得试。

      五:JVM调优之并发回收的I-CMS模式

      和增量回收差不多,完成10万request用时170秒。配置如下:

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server 
    -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M
    -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7
    -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log 
    -XX:+PrintGCDetails-XX:+PrintGCTimeStamps 
    -XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode 
    -XX:+CMSIncrementalPacing 
    -XX:CMSIncrementalDutyCycleMin=0
    -XX:CMSIncrementalDutyCycle=10-XX:-TraceClassUnloading";

      采用了sun推荐的参数,回收效果不好,照样有停顿,数小时之内就会频繁出现停顿,什么sun推荐的参数,照样不好使。

      六:JVM调优之递增式低暂停收集器

      又叫什么火车式回收,完成10万request用时153秒,配置如下:

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server 
    -Xms2048M-Xmx2048M-Xmn512M-XX:PermSize=256M
    -XX:MaxPermSize=256M-XX:MaxTenuringThreshold=7
    -XX:GCTimeRatio=19-Xnoclassgc-Xloggc:log/gc.log 
    -XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+UseTrainGC";

      该配置效果也不好,影响性能,所以没试。

      七:相比之下,还是并发回收比较好,性能比较高,只要能解决ParNewGC(并行回收年轻代)时的promotionfailed错误就一切好办了,查了很多文章,发现引起promotionfailed错误的原因是CMS来不及回收(CMS默认在年老代占到90%左右才会执行),年老代又没有足够的空间供GC把一些活的对象从年轻代移到年老代,所以执行FullGC。CMSInitiatingOccupancyFraction=70表示年老代占到约70%时就开始执行CMS,这样就不会出现FullGC了。SoftRefLRUPolicyMSPerMB这个参数也是我认为比较有用的,官方解释是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferenced.Thedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap,我觉得没必要等1秒,所以设置成0。配置如下

    $JAVA_ARGS.="-Dresin.home=$SERVER_ROOT-server-Xms2048M 
    -Xmx2048M-Xmn512M-XX:PermSize=256M-XX:MaxPermSize=256M
    -XX:SurvivorRatio=8-XX:MaxTenuringThreshold=7
    -XX:GCTimeRatio=19-Xnoclassgc-XX:+DisableExplicitGC 
    -XX:+UseParNewGC-XX:+UseConcMarkSweepGC 
    -XX:+CMSPermGenSweepingEnabled 
    -XX:+UseCMSCompactAtFullCollection 
    -XX:CMSFullGCsBeforeCompaction=0
    -XX:+CMSClassUnloadingEnabled-XX:-CMSParallelRemarkEnabled 
    -XX:CMSInitiatingOccupancyFraction=70
    -XX:SoftRefLRUPolicyMSPerMB=0-XX:+PrintClassHistogram 
    -XX:+PrintGCDetails-XX:+PrintGCTimeStamps 
    -XX:+PrintGCApplicationConcurrentTime 
    -XX:+PrintGCApplicationStoppedTime 
    -Xloggc:log/gc.log";

      上面这个配置内存上升的很慢,24小时之内几乎没有停顿现象,最长的只停滞了0.8s,ParNewGC每30秒左右才执行一次,每次回收约0.2秒,看来问题应该暂时解决了。

      参数不明白的可以上网查,本人认为比较重要的几个参数是:

      -Xms-Xmx-XmnMaxTenuringThresholdGCTimeRatioUse

      ConcMarkSweepGCCMSInitiatingOccupancyFractionSoftRefLRUPolicyMSPerMB

      eclipse中配置JVM参数:-Xmx1024M-Xms1000M-server-XX:PermSize=64M-XX:MaxPermSize=128m

  • 转:性能测试的3+1原则

    2010-10-21 00:02:33

    性能测试中有很多的总结,其中大部分是性能测试工具的使用,对于测试设计总结偏少,且这些总结和具体行业关系较为紧密,导致跨行业测试人员比较难于理解。笔者根据多年测试经验,整理出对性能测试设计、测试执行以及数据分析的3+1原则(3+1原则是指量、全、深+快)。笔者认为只要在测试过程中紧紧把握住3+1原则,就具体了做好性能测试的基础。对于性能测试新手而言把握住这些原可以快速入门,性能测试老手则可以作为参考,对性能测试更深入的理解。

    关键词:性能测试 测试分析 测试设计 测试用例 测试报告

      一、性能测试中“量”原则

      测试设计是测试工作的重点,在性能测试设计中通常要考虑很多的因素,如果测试设计遗漏往往会导致重测。笔者根据多年测试经验总结出一个核心,就是“量”。性能测试和功能测试的最基本区别也就是性能测试有一定规模的“量”,比如系统有一定数量的用户,有一定的负荷。

      在测试设计中,对“量”的分析上,可以从系统范围和局部范围两个维度进行思考。系统范围是指将整个产品作为被测对象,主要根据产品实际的使用环境来分析涉及的“量”,然后在测试环境中进行模拟,可以模拟实际环境相同中的“量”,也可以根据测试目的按照一定的算法扩大“量”。局部范围是指以产品中某一个局部模块或者功能等为范围,主要靠测试人员的分析得到,根据系统外部输入的量,分析出被测局部范围有哪些“量”,然后再针对此局部范围有针对性的进行测试,这种方法可以弥补系统范围的不足,但需要对系统有较深入的了解。

      针对不同的被测对象,涉及到“量”的测试点也不相同,下面根据笔者工作经验和相关文档整理而成,读者可以根据实际情况进一步扩展或细化,这些是性能测试的基础,建议联合有经验的测试人员和开发人员做一次全面的梳理,并形成文档在后续测试工作中使用和检查。

      业务量:一个系统往往可以处理多种业务类型,这里的量就是指系统支持的业务类型数量。在产品实际使用时这些业务是并发的,所以在测试过程中也要同时进行模拟。相对于其他类型的“量”而言,业务类型量是比较少的,但可以说是最关键的。比如在交换机系统中可以提供语音电话、短消息等业务,这些业务是可以并发的,因此测试时就需要同时模拟这两种业务。

      负荷量:这里的量是指系统处理的流量,系统能够提供多种业务或者功能,且可以并发,在实际的使用环境中不同业务的用户数不同,因此其对系统产生的负荷也不一样。在测试时,对于系统范围的测试通常是由外部用户的行为决定的,数据来自于现场收集或根据现状进行的趋势分析。比如登陆网站的用户中,同时进行软件下载的用户有500个,同时进行网页浏览的用户有1000个。对于局部范围的测试,通常是将外部的负荷转化为对应的局部负荷,然后通过工具进行模拟得到。比如直接通过测试桩的方式进行测试,而不需要模拟外部用户的行为。

      ……………………

      查看全文请点击下载:http://www.51testing.com/html/07/n-221707.html

      三、性能测试中“深”原则

      这里的“深”包括两个维度,一是对系统的了解要“深”,二是对缺陷的分析要“深”。

      性能测试通常都是黑盒测试,如果是大的系统,大的公司,分工更细,性能测试人员对系统的理解就更加肤浅。《软件测试经验与教训》中有个观点“黑盒测试并不是基于无知的测试””,笔者在多年测试中深有体会。要想做好性能测试,首先要深入理解系统的架构,系统的机制,其次是根据系统的实际情况,可以有针对性相关产品的知识,因为通常一个系统的组成部分都不会是某个公司自己开发的,都是使用了其他公司的一些产品,这样对这些产品知识的了解也比较重要。

      通常性能测试中发现的缺陷都是系统中深层次的问题,这些问题对于开发人员来说,定位比较困难,有些缺陷甚至很难重现。因此测试人员要对测试过程进行仔细观察以及对测试结果数据进行初步分析。这里的分析要有一定的深度,当然不是深入到发现缺陷的跟因,但分析结果能够引导开发人员进行问题的定位。笔者多年的经验中感觉到通常开发人员也搞不清楚哪个地方出了问题,在判断大的方向上测试更占优势。

      ……

  • 【转】:软件测试职业发展三步曲之二 - 如何做优秀的测试工程师

    2010-10-16 11:59:48

    想必能浏览此文的朋友也该是软件测试从业人员了吧,不管您今天的职位、年限、收入如何,大抵上,也必然是从软件测试工程师做起的吧!这么多年过去了,当了N久的测试工程师,今天不妨跟叶某人一起反思一下,如何才能当个出色的测试工程师呢?

        这里不谈工程师的级别,什么初级、中级、高级、资深等;这种东西是每个公司内部自己评定的,没有标准。我想说的是,既然入了软件测试这一行,就有必要想想,咋样才能爱上这行呢?如果您抬杠说根本不爱这行,那何必进入这一行呢?是你自作孽,是对自己人生的漠视和不负责任!如果还没爱真正爱上而是渐渐适应的地步,那有必要一起来分享此文了!

    【软件测试知识体系】

        叶某在2006年写过一个小结,来说明该话题。

    我的相关日志:
    2009-08-18 | 软件测试从业者职业发展助手

        本人从事的一直是WEB系统的行业软件测试,所以该列表总结的也是针对电信、通信、物流、保险、金融、ERP等这种行业软件,其它领域如游戏、手机、嵌入式软件的测试,恕本人无知了。

    我想,关于通用软件测试的知识体系,大概分成以下几类:

    1. 软件测试理论与方法
    2. 行业知识
    3. 外语
    4. 自动化测试技能
    5. 性能测试技能
    6. 开发编程技能
    7. 数据库、中间件、网络知识
    8. 测试辅助工具使用技能

        首先是软件测试理论与方法。这些就不用多说了,就像盖房子,得知道砖、水泥、锹、铲的作用和用法一样。但是,我想额外提醒的是,我们不该把眼光只关注在测试用例设计、缺陷跟踪报告、白盒/黑盒测试概念上,而应该拓展视野,花些时间理解CMM、CMMI、RUP、Agile、BPT等,从软件工程整体角度去思考测试工作,这也是想升职做测试经理的必备。

        然后是行业知识。一般来说,当你不想把自己塑造成一个典型的技术类人才,而又没有升职做管理者的意愿,那么在我所谓的制造、电信、通信、物流、保险、金融、ERP等里从事业务测试工作,还是个不错选择。而如果连公司所在行业的业务知识都不懂的话,那可真难为你了!因为连最基本的测试用例设计、手工测试执行你都可能不合格!如此,公司解雇你或将你转岗只是迟早的事情了。也许你觉得夸张,但是我觉得很正常。理论上讲,软件测试是处于软件工程这条产业链的下游环节,所以很多时候处于被动角色,正如很多朋友慨叹:我们不掌握项目的时间、任务、资源、需求,却要保证质量,这不是天方夜谭嘛!的确,现实就是这么严苛!我们不能硬着脖子和老板说“测试人员不是用来保证质量的!”或“需求要么不明确要么没有,让我们测试乜?”,因为如果对话能解决问题,就不至于钓鱼岛问题至今未决,巴以冲突至今如滔滔江水--连绵不绝了!这就是个强权社会,谁的拳头大谁说的算!在行业软件供应商的产业链里,就是客户说的算!所以,优秀的测试工程师就是能在最短的时间里设计出最有效的用例,覆盖软件尽可能多的路径来验证软件最有价值的特性!别忘了任何工程学科谈到“质量”概念的时候,都是与时间、成本三维图示出现的,这是个天经地义的事情!而软件测试里也有名言说“没有穷举的测试”和“测试是在有限的时间里发现尽可能多的缺陷”等。那么如何做到呢?答曰:需要雇佣最了解需求的测试人员!因为除了制定需求的业务分析师,就是具有行业背景和知识的测试人员了!尤其在制造、电信、通信、物流、保险、金融、ERP、互联网等这些行业里。纵有天大的本事、熟练使用各种测试设计方法的人,在特定的行业软件面前不懂业务,也很难设计出优秀的用例。因为太多的企业和个人经验告诉我们,对于不掌握终端用户实际使用行为的测试覆盖,都只是学院派+浮光掠影式测试!相反,如果能做个出色的业务测试人员,在这样的企业里还是蛮有竞争力的嘛!举例来说,一个赤身裸体的求职者想在这些典型的行业软件领域里从事测试工作,掌握测试基本原理及方法论只是穿上了“内衣”而已;要出去见人,还要把穿上“行业知识”这层外套;现实就是这么残酷,这世道不包装怎么过活!而如果想光明正大的穿梭于熙来攘往的人潮而不摔倒或拒进某餐厅吃饭,就要掌握如下的一些绝技了!!!

        接着是外语能力,我想是行业所趋。谁都知道计算机这种高科技的东西是西方人先搞起来的,就算咱在国内的本土公司做测试工作,也不得不学习一些新技术新理念。围绕着软件工程行业的不断革新,咱做测试的自然也要与时俱进去吸收新的营养;那么看英文资料就不可避免了!如果您已经在外企工作,自然要掌握足够的听说读写能力来应付项目进度的安排,需求的变更和测试文档的编写了。

        接下来是大家常谈的自动化测试、性能测试等技能。我在本系列文章的第一曲中做过详细说明。想在技术路线有所突破的朋友,或许可从这几个技能类型去设计自己的未来蓝图。

        记得2006年写此文的时候,我就预计未来会有专职的自动化测试与性能测试工种出现在软件测试行业里。而今天,很多外企、国企也验证了此设想。随着行业的细分,每个工程师都有必要掌握这2种技能或之一,以面对未来软件测试行业发展所带来人才需求变化。不然,可能真的是想跳槽都不敢跳喽!

        然后是软件开发编程的技能。按照软件质量模型,一个软件具有六大特性、二十七个子特性需要测试;但这是学术层面,而根据现实中软件企业对软件质量的要求,无非三大类:功能、性能、安全性;所以软件测试也分成功能测试、性能测试、安全性测试三大类。按照对该三类软件测试类型的实现手段来说,功能测试主要分白盒测试和黑盒测试;性能测试和安全性测试虽也有白盒要求,但主要还是黑盒的系统层面,然后根据测试出来的性能问题或安全问题去通过技术手段解决。因此,无论是黑盒功能性自动化测试,还是纯粹的白盒功能测试,还是性能测试、安全性测试,都需要一定的编程能力。很多人凭兴趣学习了一些工具后突然发现难以进一步提高自己或在企业实际应用,多数情况就是因为作为测试人员,开发编程能力欠缺!不了解被测试系统的开发技术,不能写程序或脚本去使用各种用例设计方法去实现测试,你的竞争力何在呢?

        再次是数据库、中间件及计算机底层平台知识,包括操作系统、网络、拓扑设计等。如今的行业软件大抵上都是WEB系统或与CS架构结合的双模式,但是作为悬浮于计算机系统的应用软件来说,基本上都是要靠上述这些基础架构来实现的。那么要对其进行充分的测试,不懂这些技术怎么行呢?当然根据不同的职位需求,掌握的深入也不尽相同。对于常规的功能测试,掌握数据库基本操作、中间件基本安装配置也够了,例如可以通过独立搭建被测试系统的测试环境来验证自己的这方面技能,然后根据需要深入学习下去。而对于专业的性能测试和安全性测试人员来说,这些知识要尽量深入学习和挖掘下去;即使今天你感觉自己在这方面的技能还好,那么未来的软件系统的设计模式进化,也会驱使你继续下去,例如云计算、WEB3.0等。

        最后是一些辅助工具的使用经验,如需求管理工具、测试管理工具、缺陷管理工具、配置管理工具等。这些东西是我们做测试工作的日常平台,使用上说来简单,但是我觉得通过学习这些工具的设计思想来提高自身对软件测试过程及整体软件开发流程的改进相当有用,尤其那些使用广泛、成熟的商业工具。

    【软件测试工程师非智力素质】

        大家都知道,成功人士的成功秘诀是30%的智力因素加上70%的非智力因素。上边说了作为软件测试工程师的基本技能,这里来谈谈那些情商素质。人类文明的发展到到今,以追求经济增长为唯一目的的国家崛起或企业发展,都是建立在对地球资源的无情攫取基础上的;尤其这20年,计算机行业的竞争异常激烈,激烈到每个从业者稍不留神就可能丢掉饭碗!也许你说这太夸张,但是由于软件测试行业在中国仅有十余年历史,最老资格的测试人员也无非30多岁,所以行业的起步晚使我们多数人还没意识到未来这行也会象其它传统行业一样撕破脸皮的去争去夺一个就业机会!相信关注时事的人从近年的国际金融危机和中国大学生就业难、公务员考试等社会问题中,或可知晓,软件测试行业对从业者的要求也是愈加苛刻;而若干年后,我们这批没有竞争力的测试工程师们或被迫改行或被迫转岗的日子必将如期到来!这样合理吗?我也觉得不合理!但是地球人口的持续增长而又没有战争、饥荒等手段来缓解人类的贪婪、享受等欲望,那么自然会出现劳动力过剩、行业竞争大进而生存压力大、贫富差距大等现象!看看美国、日本天天用各种卑鄙伎俩来搞中国就可想而知,政治的背后就是他们对利益攫取的驱使!当然中国也好不到哪里去,富者怕失去富裕,穷者怕变得更穷;所以要竞争!机会就这么多,能源就那么多,当然谁先得谁占上风,瞧瞧南海问题就是中国下手晚了吧!

        不说这些信口开河的话了,我要说明的意思就是“行业竞争是天然,优胜劣汰是天道”!想想我们自己搞IT的,多少人天天加班装勤奋,多少人放低自尊、泯灭个性的去讨好老板,多少人面对再不公平、再不正义也忍者神龟的样子,就能了解大家过的多苦!还不是为了不失业,还不是为了买个房子,还不是为了老婆孩子过的好点,还不是为了对得起儿时那些梦幻般的宏伟人生构想...

        但是事物永远是辩证的!残酷的竞争推动了人类文明的发展,企业的剥削推动了国家GDP的加速,个人的艰辛换来性情的成熟、思想的解放和拼搏进取的不死意志!既然改变不了天道,那就只好适应天道了!对于如果成为优秀测试工程师的非智力因素,我不想再说“思维细腻、眼光敏锐”、“责任心强”、“善于团队合作”等这些基本原则,既然是“基本”原则,自然应该必备。这里我要说的是:

    • 积极的态度    

        积极的态度,是相对消极来说,是面对软件测试日常工作中一些不合理、不正规、不可行等种种困难的一种心态!众所周知,象制造、电信、通信、物流、保险、金融、ERP这种行业软件公司里,除了微软、IBM、EMC等这种顶级巨头企业外,多数公司都面临着很多共性的问题,例如需求不完备,需求变更频繁,项目进度紧、任务量大,人员配备不足,责任不明确等等,尤其那些ON-LINE为客户服务性质的软件供应商企业。那么,作为测试工程师来说,是不是因为这些就抱怨呢?因为上游环节没做好就不开展下游的测试工作呢?是要消极怠工吗?是要推卸责任吗?这些当然不可取!一个成熟的测试工程师,应该拿出积极的、乐观的、正面的心态勇于面对困难、克服困难、提出困难、解决困难!因为你的一言一行都被项目组同事看在眼里听在心里,尤其你的上司也会因此怀疑是你的能力欠缺吗,是找借口吗,还是在挑战领导层的决策和能力呢?也许说者无心,但是长期下去,你会给大家一个爱抱怨、眼高手低的印象,这就怪不得绩效考核的时候评分低了哦!也许你会反驳说,这样脆弱的领导和同事,我还不喜欢和他们共事呢!玩笑开大了,哥们!我说过很少有软件公司按照正规的CMM或V模型做软件的,不要被那些学院派的理论洗脑洗糊涂了!换句话说,如果一个企业真的做到环环相合、尽善尽美,那还要专业的测试团队干嘛呢?殊不知,纯理论上讲,在足够充裕的时间内,一个软件需求、设计、开发做的完美,是可以不需要测试的或不需要专职测试的!所以,也许我们做测试的价值恰恰在于此。那么究竟该如何做到积极的态度呢?我也不是人生哲学的导师,只是根据我的个人经验:在遇到种种问题时,于情于理的,不带任何主观感情色彩的,以摆事实讲道理的方式和团队说出这些困难,如果能提出改进或解决意见自然最好。好的团队、好的领导也该鼓励这样的方式,营造这样的氛围,给员工一个合理的通道来宣泄或释放这些困难产出的心理压力和对企业信心的重构建!记住,说出你的困难,由整个团队为你做后盾;但切忌不要开会不说、背后乱说哦;那样就是大嘴巴乌鸦、人见人烦的小人啦!这里还有另外一个误区,就是有些人性格较内向,确实从不抱怨,却是任劳任怨。这也不好,在人与人如此微妙的社会关系中,做软柿子自然挨捏、被欺负,也许逐渐大家都习惯于把事情分配给你而坐享其成了!等有好处的时候,别人也未必想着你呢!所以,成熟的测试工程师是外柔内刚,既有真才实学,又谦虚朴素,既能但当大任独挡一面,又会让团队成员都知道他的才智和高风亮节!如果不信,可以想想自己公司里那些混的好并且一直好的人,大抵如此!早年我做培训的时候,常引用我们老板一句话:态度决定习惯,习惯决定性格,性格决定命运!没有比这更浅显的道理,也没有比这更精辟的人生哲学了!如果你今天看了俺老爷们这番话,还不热血沸腾的思考一下自己曾经的表现,那么你就是拿自己的前途当儿戏,拿自己的青春开玩笑,拿自己的人生当赌注!这个游戏太荒唐,这个玩笑太幼稚,这个赌注太巨大,你输不起,我们谁都输不起!就算待到3000年转世成个天才,成个傲视一切的绝对强者,但是此生——你是这个世界最最平凡的人,平凡的可以被任何人忽视,因为你自己都对自己不负责任,谁还能对你有所义务呢?

    • 主动的意识

        主动的意识,是相对被动来说。在企业管理里,多数工程师的工作是由上级按照项目进度、任务范围被动分配的。因此,做好这些本职工作,及时、高效、保质的提交任务成果是最基本的职业能力。这里我不想探讨你的上司是否合理的分配工作,因为这是他的能力素质问题;我还是想侧重工程师的角度,作为我们测试工程师,如果大家都只是被动的接受工作、被动的执行工作,那么如何区分你是否优秀呢?所以我认为要在工作中拿出主动的意识,包括这样几点:

    1. 主动的汇报。这是作为工程师被动接受工作后,及时、快捷汇报工作进展和成果的良好习惯!大家都是成年人,多数领导者并不喜欢家长式的询问、跟踪甚至盯着每个人的进度,时间上也不允许这样做;而我们工程师也不喜欢被询问、被盯着的感觉。而一旦有执行环节中的问题没有被及时暴露出来,就不只是工程师的责任了,可能涉众就广了!所以很多企业采用日报、周报的方式跟踪工作进度,是很自然的手段。我想额外提一点,作为员工尤其新员工,向上司主动做月度、季度汇报,是个非常好的习惯;本人刚毕业那会儿就是这么干的,可参见叶赫华早期博文。
    2. 主动的总结。多数的公司都有项目组例会,而我们多数的年轻人并不喜欢主动发表个人意见,甚至有人采用“事不关己 高高挂起”的消极态度或者干脆抵制、抱怨这种会议形式(也许是中国人都比较含蓄吧,我共事过的外国同事还是蛮积极的参加各种会议的)。我觉得应该调整这种心态,如果因为开会时候没什么可说的,那就是因为平日没有做工作总结。作为工程师把工作中出现的问题,经过个人的独立思考而记录下来,并在项目会议中大胆、明确的说出来并且能提出改进建议,这是优秀员工的必然通道;而作为测试工程师,我们更应该拿出细腻的感情、强烈的责任心去总结软件质量、开发过程、工作模式等等方面问题,然后在合适的场合表达出来,我想每个正常的软件公司都喜欢这样的员工吧!
    3. 主动的沟通。除了项目会议这种常规的场合外,作为好的工程师,我们可以找机会主动和上司和领导层交流个人想法和改进建议。毕竟项目会议是人多嘴杂,探讨的问题还是有针对性的、是当前面临的;而私下和领导层交流心得,一方面有增进感情的因素(这很必要,尤其大企业,一个部门几十人,我们终日被小主管带着,部门领导甚至跨部门领导很难熟悉或认识你);一方面只要你讲的是为工作本身负责,并且经过深思熟虑,哪个称职的领导者都会非常欢迎这样的做法、喜欢这样的员工的;而最重要的一方面,通过这样的机会,你也许说出了领导者长期想到而未决或者干脆未想到的细节,也许趁此机会你可以堪当大任了;就算不立即升职加薪,你的这种行为和素质已经大大增加明年绩效考核的砝码了。说的再直白一点,历史上不管是奸臣还是忠臣,只要受到皇帝重用的人,且不谈其人品、权谋,有一点很重要,就是臣子替君王分忧了;从当代管理学来说也一样,如果你要升职,就要在目前职位想到或者做到上一级所该想、所该做,如此升职不远矣!看看那些商道节目、书籍,学学成功人士的经验,就想想“如何敲开领导办公室的门”吧,朋友!
    • 勤奋的学习

        其实这一点是其它三点的基础。我们多数的测试工程师能够通过面试进入所在企业,说明已经具备当前职位的技能必需;但是我们的话题一直围绕做优秀的测试工程师,那么如果自己没有充分的真才实学,上述的积极态度、主动沟通包括下边的充分分享,就没有底气了。试想,一个团队里每个人能力都差不多,谁也没有起到带头作用,谁也没有突出特长,没有出类拔萃,大家都吃大锅饭,这样的团队自然没有战斗力,士气自然不足,提升的空间也小的可怜!而作为领导者,也没有信心去跟大领导申请更具挑战的工作,如此大家都是和尚撞钟式的工作了,长年累月,人员流动、消极怠工在所难免!领导者要改变这样的局面,可以通过分享、激励的方式;而作为工程师,我们要勤奋的学习、踏实的积累,才能在机会来临的时候不至于恨苍天、妒人意!

        那么究竟学习什么呢?就是我前面【软件测试知识体系】里说的呀,哥们!哪里有短板,就学哪里,在通用行业软件领域里,掌握全部这些知识体系就已经是高手高高手了,再也不用怕失业了,也不用怕没竞争力了;当然,想发挥它们需要个好的舞台,那就是人生际遇问题了,看是否你能遇到个伯乐了,跟个好领导、好团队也很重要,有个导师式、朋友式的上司,一方面工作开心些,另一方面在职业提升上少走弯路;命矣!天意!

        学习技巧,我不想多谈。提几个原则吧!

    1. 软件测试行业要求知识面广,所以要多读书、看资料
    2. 当你选择了某个具体职业路线后,再深入的学习下去
    3. 常写博客总结自己是个好习惯
    4. 多和业内高手交流,再结成朋友,对求职也有利
    5. 多去www.51testing.com 和 www.qaforums.com    
  • 分享的精神

        前边我讲过,要做一个优秀的工程师,不仅个人具有真才实学,还要有个好人品,偷笑 ,所谓“德才兼备才是王者”!“任我行”任老前辈说过“有人就有仇恨,有仇恨就有江湖,人就是江湖!你怎么逃避?”应该说,IT由于行业的特征决定了从业者们都是精英或伪精英们,起码大家都是受过高等教育的人,也就是说都是聪明人!一堆的聪明人在一起呢,就会搞事;再加上IT行业的竞争激烈造就了整个行业誓要你死我活,否则就要丢单、关门、倒闭,所以整个行业文化决定了内部的员工们也要拼,也要抢!再加上IT公司多数规模不大,多数人不可能进入IBM、Microsoft、Oracle这种大公司而受雇于本土或外资中小软件公司里。试想,庙就这么小,人人想当大佛!咋办?又不能战争,又不能犯罪,又得争到自己的利益,于是乎明争暗斗、唇枪舌剑、流言掣肘、暗箭明枪就满天飞了,就像古代后宫争宠、皇子争位的故事一样丑陋,也像天下大乱、三国争雄的故事一样波澜壮阔!有人斗的头破血流、黯然离去,有人卧薪尝胆、期待东山再起,有人忍辱负重、不惜自贬身价作践自己、甚至把灵魂出卖给魔鬼......还有人,装作不谙世事,处处低调,想在“众神”中压低自己,不陷入派系之争,尽力在时间的洪流中做个尘埃,可惜最后也难于自保、落难草寇!唉,想起来就郁闷,不过写起来很兴奋! 大笑 

        其实,现实工作中不会有我写的这么夸张。但这是人性的问题,人性的二个特征就是贪婪和争斗!只是每个企业文化的熏陶问题,争斗的多少问题!虽然软件测试这种技术工种可以一定程度上逃避这些群魔乱舞的局面,但是要在保持自我个性的同时又要免于牵连到某个阵营并赢得多数同事、上司的好感,也就是最初说的“德才兼备”就不容易了。作为优秀的测试工程师,做到开放的分享很有必要。技术活动其实并没有什么大不了,只是别人掌握的快慢问题,因为大家的智力都差不多,如果对自己的技能、技巧持保守、封闭的态度就不可取了。把自己的所学、所问、所思、所辨、所行分享给别人,一方面加深自己的理解,也锻炼了自己的表达能力;另一方面让别人获得学习的捷径;再者对团队的战斗力也有所贡献!久而久之,你在团队、公司里的正面形象就树立起来了;每个人知道你是个有本事也乐于分享的人!殊知,树立一个好形象很难,但破坏一个好形象太易了,要改变一个人在企业里的形象并得到认可,难上加难!

        而分享的概念,从做人的角度来说,有其更大的含义。我前边说了那么多企业、群体的争斗,既然我们不能以消极避世的思想去规避这些,因为哪个公司都多少有些勾心斗角的龌龊人和不平事;唯一让自己可以相对“超凡脱俗”的办法,就是和大家都保持合作、分享的态度,但是不丧失原则性和自尊自爱。古语有云“君子和而不群”,说的就是这个道理。从政治角度看,中国政府提出的“求同存异、和平共处、永不结盟、永不称霸”的外交理念是一脉相承的!!中国人讲究以和为贵、天人合一,所有这些以尊重事实、与自然和谐相处的原则,才是做人、立身、处世之道。

       最后,我愿和软件测试同仁们一起,从自我开始,保持一颗开放、坦诚、细腻的胸襟,融入团队中,时刻提醒自己注重细节,从自我学习,向他人学习,工作中让自己起到示范作用,为整体团队士气的营造、团队风气的构建贡献价值。实话说,每个人能力都差不多,能力偏差不大,成功、优秀都是相对的、并带有主动意识形态的概念,起决定作用的往往就是这些非智力因素。做到这些一点都不难,这个世界,没有人比自己更了解自己的不足,但是没有人可以估计出自己的潜在能量,只要你有毅力,有魄力,就能做一个积极向上、充满激情、活力四射的年轻人!正如诗曰:
          天下风云出我辈,
          一入江湖岁月摧。
          皇图霸业谈笑间,
          不胜人生一场醉!

       作者:叶赫华  2010年10月   上海

  • 性能测试--瓶颈分析法

    2010-08-01 13:23:15

    1。内存分析方法
       内存分析用于判断系统有无内存瓶颈,是否需要通过增加内存等手段提高系统性能表现。
       内存分析需要使用的计数器:Memory类别和Physical Disk类别的计数器。内存分析的主要方法和步骤:
    (1)首先查看Memory\Available Mbytes指标
       如果该指标的数据比较小,系统可能出现了内存方面的问题,需要继续下面步骤进一步分析。
    注:   在UNIX/LINUX中,对应指标是FREE(KB)
       (2)注意Pages/sec、Pages Read/sec和Page Faults/sec的值
    操作系统回利用磁盘较好的方式提高系统可用内存量或者提高内存的使用效率。这三个指标直接反应了操作系统进行磁盘交换的频度。
       如果Pages/sec的技术持续高于几百,可能有内存问题。Pages/sec值不一定大九表明有内存问题,可能是运行使用内存映射文件的程序所致。Page Faults/sec说明每秒发生页面失效次数,页面失效次数越多,说明操作系统向内存读取的次数越多。此事需要查看Pages Read/sec的计数值,该计数器的阀值为5,如果计数值超过5,则可以判断存在内存方面的问题。
       注:在UNIX/LINUX系统中,对于指标是(page)si和(page)so.
       (3)根据Physical Disk计数器的值分析性能瓶颈
       对Physical Disk计数器的分析包括对Page Reads/sec和%Disk Time及Aerage Disk Queue Length的分析。如果Pages Read/sec很低,同时%Disk Time和Average Disk Queue Length的值很高,则可能有磁盘瓶颈。但是,如果队列长度增加的同时Pages Read/sec并未降低,则是内存不足。
    注:在 UNIX/LINUX系统中,对应的指标是Reads(Writes)per sec、Percent of time the disk is busy和Average number of transactions waiting for service.
       2.处理器分析法
    (1)首先看System\%Total Processor Time 性能计数器的计数值
    该计数器的值体现服务器整体处理器利用率,对多处理器的系统而言,该计数器提醒所有CPU的平均利用率。如果该值持续超过90%,则说明整个系统面临着处理器方面的瓶颈,需要通过增加处理器来提高性能。
       注:多处理器系统中,该数据本身不大,但PUT直接负载状况极不均衡,也应该视作系统产生处理器方面瓶颈。
    (2)其次查看每个CPU的Processor\%Processor Time 和 Processor\%User   Time 和 Processor\%Privileged Time
    Processor\%User   Time 是系统非核心操作消耗的CPU时间,如果该值较大,可以考虑是否能通过友好算法等方法降低这个值。如果该服务器是数据库服务器, Processor\%User   Time 值大的原因很可能是数据库的排序或是函数操作消耗了过多的CPU时间,此时可以考虑对数据库系统进行优化。
    (3)研究系统处理器瓶颈
    查看 System\Processor Queue Length 计数器的值,当该计数器的值大于CPU数量的总数+1时,说明产生了处理器阻塞。在处理器的%Process Time很高时,一般都随处理器阻塞,但产生处理器阻塞时,Processor\%Process Time 计数器的值并不一定很大,此时就必须查找处理器阻塞的原因。
    %DOC Time 是另一个需要关注的内容,该计数器越低越好。在多处理器系统中,如果这个值大于50%,并且Processor\%Precessor Time非常高,加入一个网卡可能回提高性能。
    3。磁盘I/O分析方法
    (1)计算梅磁盘的I/O数
       梅磁盘的I/O数可用来与磁盘的I/O能力进行对比,如果经过计算得到的每磁盘I/O数超过了磁盘标称的I/O能力,则说明确实存在磁盘的性能瓶颈。
       每磁盘I/O计算方法
    RAID0计算方法:(Reads +Writes)/Number of Disks
    RAID0计算方法:(Reads +2*Writes)/2
    RAID0计算方法:[Reads +(4*Writes)]/Number of Disks
    RAID0计算方法:[Reads +(2*Writes)]/Number of Disks
       (2)与Processor\Privileged Time 合并进行分析
       如果在Physical Disk 计数器中,只有%Disk Time 比较大,其他值都比较适中,硬盘可能会是瓶颈。若几个值都比较大,且数值持续超过80%,则可能是内存泄漏。
       (3)根据Disk sec/Transfer进行分析
    一般来说,定义该数值小于15ms为Excellent,介于15~30ms之间为良好,30~60ms之间为可以接受,超过60ms则需要考虑更换硬盘或是硬盘的RAID方式了。
    4。进程分析方法
    (1)查看进程的%Processor Time值
       每个进程的%Processor Time反映进程所消耗的处理器时间。用不同进程所消耗的处理器时间进行对比,可以看出具体哪个进程在性能测试过程中消耗了最多的处理器时间,从而可以据此针对应用进行优化。
    (2)查看每个进程产生的页面失效
    可以用每个进程产生的页面失效(通过PRCESS\PAGE FAILURES/SEC计数器获得)和系统页面失效(可以通过MEMORY\PAGE FAILURES/SEC计数器获得)的比值,来判断哪个进程产生了最多的页面失效,这个进程要么是需要大量内存的进程,要么是非常活跃的进程,可以对其进行重点分析。
       (3)了解进程的Process/Private Bytes
    Process/Private Bytes是指进程所分配的无法与其他进程共享的当前字节数量。该计数器主要用来判断进程在性能测试过程中有无内存泄漏。例如:对于一个IIS之上的 WEB应用,我们可以重点监控inetinfo进程的Private Bytes,如果在性能测试过程中,该进程的Private Bytes计数器值不断增加,或是性能测试停止后一段时间,该进程的Private Bytes仍然持续在高水平,则说明应用存在内存泄漏。
       注:在UNIX/LINUX系统中,对应的指标是Resident Size
       5。网络分析方法
       Network Interface\Bytes Total/sec为发送和接收字节的速率,可以通过该计数器值来判断网络链接速度是否是瓶颈,具体操作方法是用该计数器的值和目前网络的带宽进行比较。
    RAID0计算方法:[Reads +(2*Writes)]/Number of Disks
       (2)与Processor\Privileged Time 合并进行分析
       如果在Physical Disk 计数器中,只有%Disk Time 比较大,其他值都比较适中,硬盘可能会是瓶颈。若几个值都比较大,且数值持续超过80%,则可能是内存泄漏。
       (3)根据Disk sec/Transfer进行分析
    一般来说,定义该数值小于15ms为Excellent,介于15~30ms之间为良好,30~60ms之间为可以接受,超过60ms则需要考虑更换硬盘或是硬盘的RAID方式了。
    4。进程分析方法
    (1)查看进程的%Processor Time值
       每个进程的%Processor Time反映进程所消耗的处理器时间。用不同进程所消耗的处理器时间进行对比,可以看出具体哪个进程在性能测试过程中消耗了最多的处理器时间,从而可以据此针对应用进行优化。
    (2)查看每个进程产生的页面失效
    可以用每个进程产生的页面失效(通过PRCESS\PAGE FAILURES/SEC计数器获得)和系统页面失效(可以通过MEMORY\PAGE FAILURES/SEC计数器获得)的比值,来判断哪个进程产生了最多的页面失效,这个进程要么是需要大量内存的进程,要么是非常活跃的进程,可以对其进行重点分析。
       (3)了解进程的Process/Private Bytes
    Process/Private Bytes是指进程所分配的无法与其他进程共享的当前字节数量。该计数器主要用来判断进程在性能测试过程中有无内存泄漏。例如:对于一个IIS之上的 WEB应用,我们可以重点监控inetinfo进程的Private Bytes,如果在性能测试过程中,该进程的Private Bytes计数器值不断增加,或是性能测试停止后一段时间,该进程的Private Bytes仍然持续在高水平,则说明应用存在内存泄漏。
       注:在UNIX/LINUX系统中,对应的指标是Resident Size
       5。网络分析方法
       Network Interface\Bytes Total/sec为发送和接收字节的速率,可以通过该计数器值来判断网络链接速度是否是瓶颈,具体操作方法是用该计数器的值和目前网络的带宽进行比较。
    RAID0计算方法:[Reads +(2*Writes)]/Number of Disks
       (2)与Processor\Privileged Time 合并进行分析
       如果在Physical Disk 计数器中,只有%Disk Time 比较大,其他值都比较适中,硬盘可能会是瓶颈。若几个值都比较大,且数值持续超过80%,则可能是内存泄漏。
       (3)根据Disk sec/Transfer进行分析
    一般来说,定义该数值小于15ms为Excellent,介于15~30ms之间为良好,30~60ms之间为可以接受,超过60ms则需要考虑更换硬盘或是硬盘的RAID方式了。
    4。进程分析方法
    (1)查看进程的%Processor Time值
       每个进程的%Processor Time反映进程所消耗的处理器时间。用不同进程所消耗的处理器时间进行对比,可以看出具体哪个进程在性能测试过程中消耗了最多的处理器时间,从而可以据此针对应用进行优化。
    (2)查看每个进程产生的页面失效
    可以用每个进程产生的页面失效(通过PRCESS\PAGE FAILURES/SEC计数器获得)和系统页面失效(可以通过MEMORY\PAGE FAILURES/SEC计数器获得)的比值,来判断哪个进程产生了最多的页面失效,这个进程要么是需要大量内存的进程,要么是非常活跃的进程,可以对其进行重点分析。
       (3)了解进程的Process/Private Bytes
    Process/Private Bytes是指进程所分配的无法与其他进程共享的当前字节数量。该计数器主要用来判断进程在性能测试过程中有无内存泄漏。例如:对于一个IIS之上的 WEB应用,我们可以重点监控inetinfo进程的Private Bytes,如果在性能测试过程中,该进程的Private Bytes计数器值不断增加,或是性能测试停止后一段时间,该进程的Private Bytes仍然持续在高水平,则说明应用存在内存泄漏。
       注:在UNIX/LINUX系统中,对应的指标是Resident Size
       5。网络分析方法
       Network Interface\Bytes Total/sec为发送和接收字节的速率,可以通过该计数器值来判断网络链接速度是否是瓶颈,具体操作方法是用该计数器的值和目前网络的带宽进行比较。
  • 界面测试集汇

    2010-06-08 15:49:29

    界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同 时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用 强大的功能都可能在用户的畏惧与放弃中付诸东流。目前界面的设计引起软件设计人员的重视的程度还远远不够,直到最近网页制作的兴起,才受到专家的青睐。而 且设计良好的界面由于需要具有艺术美的天赋而遭拒绝。

      目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。

      易用性:

      按钮名称应该易懂,用词准确,屏弃没楞两可的字眼,要与同一界面上的其他按钮易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确操作。

      易用性细则:

      1):完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。

      2):完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。

      3):按功能将界面划分区域块,用Frame框括起来,并要有功能说明或标题。

      4):界面要支持键盘自动浏览按钮功能,即按Tab键、回車鍵的自动切换功能。

      5):界面上首先要输入的和重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口上较醒目的位置。

      6): 同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。

      7):分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab

      8):默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。

      9): 可写控件检测到非法输入后应给出说明并能自动获得焦点。

      10):Tab键的顺序与控件排列顺序要一直,目前流行总体从上到下,同时行间从左到右的方式。

      11):复选框和选项框按选择几率的高底而先后排列。

      12):复选框和选项框要有默认选项,并支持 Tab选择。

      13):选项数相同时多用选项框而不用下拉列表框。

      14):界面空间较小时使用下拉框而不用选项框。

      15):选项数叫少时使用选项框,相反使用下拉列表框。

      16):专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。

      规范性:

      通常界面设计都按Windows界面的规范来设计,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供工具厢。

      规范性细则:

      1):常用菜单要有命令快捷方式。

      2):完成相同或相近功能的菜单用横线隔开放在同一位置。

      3):菜单前的图标能直观的代表要完成的操作。

      4):菜单深度一般要求最多控制在三层以内。

      5):工具栏要求可以根据用户的要求自己选择定制。

      6):相同或相近功能的工具栏放在一起。

      7):工具栏中的每一个按钮要有及时提示信息。

       8):一条工具栏的长度最长不能超出屏幕宽度。

      9): 工具栏的图标能直观的代表要完成的操作。

      10):系统常用的工具栏设置默认放置位置。

      11):工具栏太多时可以考虑使用工具箱。

      12):工具箱要具有可增减性,由用户自己根据需求定制。

      13):工具箱的默认总宽度不要超过屏幕宽度的1/5。

      14): 状态条要能显示用户切实需要的信息,常用的有:目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一操作需要的时间较长,还应该显示进度条和进程提示。

      15):滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。

      16):状态条的高度以放置五好字为宜,滚动条的宽度比状态条的略窄。

      17):菜单和工具条要有清楚的界限;菜单要求凸出显示,这样在移走工具条时仍有立体感。

      18):菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。

      19): 右键快捷菜单采用与菜单相同的准则。

      帮助设施:

      系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。

      帮助设施细则:

      1):帮助文档中的性能介绍与说明要与系统性能配套一致。(我们的系统帮助文档都是系统的祖先时期的说明,让人困惑)。

      2):打包新系统时,对作了修改的地方在帮助文档中要做相应的修改。

      3):操作时要提供及时调用系统帮助的功能。常用F1。

      4):在界面上调用帮助时应该能够及时定位到与该操作相对的帮助位置。也就是说帮助要有即时针对性。

      5):最好提供目前流行的联机帮助格式或HTML帮助格式。

      6):用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。

      7):如果没有提供书面的帮助文档的话,最好有打印帮助的功能。

      8):在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。

      合理性:

      屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。

      合理性细则:

      1):父窗体或主窗体的中心位置应该在对角线焦点附近。

      2):子窗体位置应该在主窗体的左上角或正中。

      3):多个子窗体弹出时应该依次向右下方偏移,以显示窗体出标题为宜。

      4):重要的命令按钮与使用较频繁的按钮要放在界面上注目的位置。

      5):错误使用容易引起界面退出或关闭的按钮不应该放在易点击的位置。横排开头或最后与竖排最后为易点位置。

      6):与正在进行的操作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该按钮)。

      7):对可能造成数据无法恢复的操作必须提供确认信息,给用户放弃选择的机会。

      8):非法的输入或操作应有足够的提示说明。

      9): 对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形成无限期的等待。

      10): 提示、警告、或错误说明应该清楚、明了、恰当。

      美观与协调性:

      界面应该大小适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。

      美观与协调性细则:

      1): 长宽接近黄金点比例,切忌长宽比例失调、或宽度超过长度。

      2): 布局要合理,不宜过于密集,也不能过于空旷,合理的利用空间。

      3): 按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置。

      4): 按钮的大小要与界面的大小和空间要协调。

      5): 避免空旷的界面上放置很大的按钮。

      6):放置完控件后界面不应有很大的空缺位置。

      7): 字体的大小要与界面的大小比例协调, 通常使用的字体中宋体9-12较为美观,很少使用超过12号的字体。

      8): 前景与背景色搭配合理协调,反差不宜太大,最好少用深色,如大红、大绿等。常用色考虑使用Windows界面色调。

      9): 如果使用其他颜色,主色调要柔和,具有亲和力与磁力,坚决杜绝刺目的颜色。

      10): 大型系统常用的主色有"#E1E1E1"、"#EFEFEF"、"#C0C0C0"等。

      11): 界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方。

      12): 如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌只放大窗体而忽略控件的缩放。

      13):对于含有按钮的界面一般不应该支持缩放,即右上角只有关闭功能。

      14): 通常父窗体支持缩放时,子窗体没有必要缩放。

      15):如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。

      菜单位置:

      菜单是界面上最重要的元素,菜单位置按照按功能来组织。

      菜单测试细则:

      1): 菜单通常采用“常用--主要--次要--工具--帮助”的位置排列,符合流行的Windows风格。

      2): 常用的有“文件”、“編輯”,“查看”等,幾乎每個系統都有這些選項,當然要根據不同的系統有所取捨。

      3): 下拉菜单要根据菜单选项的含义进行分组,並且按照一定的规则进行排列,用横线隔开。

      4): 一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。

      5): 没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头, 不常用的靠后放置;重要的放在开头,次要的放在后边。

      6): 如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。

      7): 菜单深度一般要求最多控制在三层以内。

      8): 对常用的菜单要有快捷命令方式,组合原则见8。

      9): 对与进行的操作无关的菜单要用屏蔽的方式加以处理,如果采用动态加载方式——即只有需要的菜单才显示——最好。

      10): 菜单前的图标不宜太大,与字高保持一直最好。

      11): 主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。

      12): 主菜单数目不应太多,最好为单排布置。

      13):菜单条是否显示在合适的语境中?

      14):应用程序的菜单条是否显示系统相关的特性(如时钟显示)?

      15):下拉式操作能正确工作吗?

      16):菜单、调色板和工具条是否工作正确?

      17):是否适当地列出了所有的菜单功能和下拉式子功能?

      18):是否可能通过鼠标访问所有的菜单功能?

      19):相同功能按钮的图标和文字是否一致?

      20):是否能够用其他的文本命令激活每个菜单功能?

      21):菜单功能是否随当前的窗口操作加亮或变灰?

      22):菜单功能是否正确执行?

      23):菜单功能的名字是否具有自解释性?

      24):菜单项是否有帮助,是否语境相关?

      25):在整个交互式语境中,是否可以识别鼠标操作?

      26):如果要求多次点击鼠标,是否能够在语境正确识别?

      27):如果鼠标有多个按钮,是否能够在语境中正确识别?

      28):光标、处理指示器和识别指针是否随操作恰当地改变?

      独特性:

      如果一味的遵循业界的界面标准,则会丧失自己的个性.在框架符合以上规范的情况下,设计具有自己独特风格的界面尤为重要。尤其在商业软件流通中有着很好的迁移默化的广告效用。

      测试细则:

      1): 安装界面上应有单位介绍或产品介绍,并有自己的图标。

      2): 主界面,最好是大多数界面上要有公司图标。

      3): 登录界面上要有本产品的标志,同时包含公司图标。

      4): 帮助菜单的“关于”中应有版权和产品信息。

      5): 公司的系列产品要保持一直的界面风格,如背景色、字体、菜单排列方式、图标、安装过程、按钮用语等应该大体一致。

      快捷方式的组合

      在菜单及按钮中使用快捷键可以让喜欢使用键盘的用户操作得更快一些在西文Windows及其应用软件中快捷键的使用大多是一致的。

      菜单中:

      1):面向事务的组合有: Ctrl-D 删除 ;Ctrl-F 寻找 ;Ctrl –H替换;Ctrl-I 插入 ;Ctrl-N 新记录 ;Ctrl-S 保存 Ctrl-O 打开。

      2):列表: Ctrl-R ,Ctrl-G定位;Ctrl-Tab下一分页窗口或反序浏览同一页面控件;。

      3):编辑:Ctrl-A全选;Ctrl-C 拷贝;Ctrl-V 粘贴;Ctrl-X 剪切;Ctrl-Z撤消操作;Ctrl-Y恢复操作。

      4)文件操作:Ctrl-P 打印;Ctrl-W 关闭。

      5):系统菜单Alt-A文件;Alt-E编辑;Alt-T工具;Alt-W窗口;Alt-H帮助。

      6):MS Windows保留键:Ctrl-Esc 任务列表 ;Ctrl-F4 关闭窗口; Alt-F4 结束应用;Alt-Tab 下一应用 ;Enter 缺省按钮/确认操作 ;Esc 取消按钮/取消操作;Shift-F1 上下文相关帮助。按钮中:可以根据系统需要而调节,以下只是常用的组合。Alt-Y确定(是);Alt-C取消;Alt-N 否;Alt-D删除;Alt-Q退出;Alt-A添加;Alt-E编辑;Alt-B浏览;Alt-R读;Alt-W写。

      这些快捷键也可以作为开发中文应用软件的标准,但亦可使用汉语拼音的开头字母。

      安全性考虑:

      在界面上通过下列方式来控制出错几率,会大大减少系统因用户人为的错误引起的破坏。开发者应当尽量周全地考虑到各种可能发生的问题,使出错的可能降至最小。如应用出现保护性错误而退出系统,这种错误最容易使用户对软件失去信心。因为这意味着用户要中断思路,并费时费力地重新登录,而且已进行的操作也会因没有存盘而全部丢失。

      安全性细则:

      1):最重要的是排除可能会使应用非正常中止的错误。

      2):应当注意尽可能避免用户无意录入无效的数据。

      3):采用相关控件限制用户输入值的种类。

      4):当用户作出选择的可能性只有两个时,可以采用单选框。

      5):当选择的可能再多一些时,可以采用复选框,每一种选择都是有效的,用户不可能输入任何一种无效的选择。

      6):当选项特别多时,可以采用列表框,下拉式列表框。

      7):在一个应用系统中,开发者应当避免用户作出未经授权或没有意义的操作。

      8):对可能引起致命错误或系统出错的输入字符或动作要加限制或屏蔽。

      9):对可能发生严重后果的操作要有补救措施。通过补救措施用户可以回到原来的正确状态。

      10):对一些特殊符号的输入、与系统使用的符号相冲突的字符等进行判断并阻止用户输入该字符。

      11):对错误操作最好支持可逆性处理,如取消系列操作。

      12):在输入有效性字符之前应该阻止用户进行只有输入之后才可进行的操作。

      13):对可能造成等待时间较长的操作应该提供取消功能。

      14):特殊字符常有;;’”><,`‘:“[”{、\|}]+=)-(_*&&^%$#@!,.。?/还有空格。

      15):与系统采用的保留字符冲突的要加以限制。

      16):在读入用户所输入的信息时,根据需要选择是否去掉前后空格。

      17):有些读入数据库的字段不支持中间有空格,但用户切实需要输入中间空格,这时要在程序中加以处理。

      多窗口的应用与系统资源:

      设计良好的软件不仅要有完备的功能,而且要尽可能的占用最底限度的资源。

      1):在多窗口系统中,有些界面要求必须保持在最顶层,避免用户在打开多个窗口时,不停的切换甚至最小化其他窗口来显示该窗口。

      2):在主界面载入完毕后自动卸出内存,让出所占用的WINDOWS系统资源。

      3):关闭所有窗体,系统退出后要释放所占的所有系统资源 ,除非是需要后台运行的系统。

      4):尽量防止对系统的独占使用。

      5):窗口能否基于相关的输入或菜单命令适当地打开?

      6):窗口能否改变大小、移动和滚动?

      7):窗口中的数据内容能否使用鼠标、功能键、方向箭头和键盘访问?

      8):当被覆盖并重调用后,窗口能否正确地再生?

      9):需要时能否使用所有窗口相关的功能?

      10):所有窗口相关的功能是可操作的吗?

      11):是否有相关的下拉式菜单、工具条、滚动条、对话框、按钮、图标和其他控制可为窗口可用,并适当地显示?

      12):显示多个窗口时,窗口的名称是否被适当地表示?

      13):活动窗口是否被适当地加亮?

      14):如果使用多任务,是否所有的窗口被实时更新?

      15):多次或不正确按鼠标是否会导致无法预料的副作用?

      16):窗口的声音和颜色提示和窗口的操作顺序是否符合需求?

      17):窗口是否正确地关闭?

  • 杯子的测试(转)

    2010-05-18 10:03:15

    测试项目:杯子
    需求测试:查看杯子使用说明书,是否有遗漏。
    界面测试:查看杯子外观,是否变形;
    功能性:用水杯装水看漏不漏;水能不能被喝到;
    安全性:杯子有没有毒或细菌;
    可靠性:杯子从不同高度落下的损坏程度;
    可移植性:杯子再不同的地方、温度等环境下是否都可以正常使用
    可维护性:把杯子捏变形,然后看是否又能恢复
    兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等
    易用性:杯子是否烫手、是否有防滑措施、是否方便饮用
    用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述
    疲劳测试:将杯子盛上水(案例一)放24小时检查泄漏时间和情况;盛上汽油(案例二)放24小时检查泄漏时间和情况等
    压力测试:用根针穿杯子,并在针上面不断加重量,看压强多大时会穿透
    跌落测试:杯子加包装(有填充物),在多高的情况摔下不破损
    震动测试:杯子加包装(有填充物),六面震动,检查产品是否能应对恶劣的铁路\公路\航空运输
    测试数据:测试数据具体编写此处略(最讨厌写测试数据了)。其中应用到:场景法、等价类划分法、因果图法、错误推测法、边界值法等方法
    期望输出:该期望输出需查阅国标、行标以及使用用户的需求
    说明书测试:检查说明书书写准确性
  • 软件测试数据库语句集锦

    2010-05-11 17:06:43


    下列语句部分是Mssql语句,不可以在access中使用。
     
    SQL分类:   DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)  
    首先,简要介绍基础语句:  
    1、说明:创建数据库CREATE DATABASE database-name   
    2、说明:删除数据库drop database dbname  
    3、说明:备份sql server  
    --- 创建 备份数据的 deviceUSE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'  
    --- 开始 备份BACKUP DATABASE pubs TO testBack   
    4、说明:
    创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)  
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only  
    5、说明:  
    删除新表:drop table tabname   
    6、说明:  
    增加一个列:Alter table tabname add column col type  注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。  
    7、说明:
      添加主键:Alter table tabname add primary key(col)
      说明:
      删除主键:Alter table tabname drop primary key(col)  
    8、说明:
      创建索引:create [unique] index idxname on tabname(col….)
      删除索引:drop index idxname  注:索引是不可更改的,想更改必须删除重新建。  
    9、说明:
      创建视图:create view viewname as select statement
      删除视图:drop view viewname  
    10、说明:几个简单的基本的sql语句
      选择:select * from table1 where 范围
      插入:insert into table1(field1,field2) values(value1,value2)
      删除:delete from table1 where 范围
      更新:update table1 set field1=value1 where 范围
      查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
      排序:select * from table1 order by field1,field2 [desc]
      总数:select count * as totalcount from table1
      求和:select sum(field1) as sumvalue from table1
      平均:select avg(field1) as avgvalue from table1
      最大:select max(field1) as maxvalue from table1
      最小:select min(field1) as minvalue from table1  
    11、说明:几个高级查询运算词
      A: UNION 运算符
      UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
      B: EXCEPT 运算符
      EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
      C: INTERSECT 运算符
      INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。  注:使用运算词的几个查询结果行必须是一致的。  
    12、说明:使用外连接
      A、left outer join:
      左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
      B:right outer join:
      右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
      C:full outer join:
      全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句
      1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
      法一:select * into b from a where 1<>1
      法二:select top 0 * into b from a
      2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)insert into b(a, b, c) select d,e,f from b;
      3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件  例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
      4、说明:子查询(表名1:a 表名2:b)select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
      5、说明:显示文章、提交人和最后回复时间select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b  6、说明:外连接查询(表名1:a 表名2:b)select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
      7、说明:在线视图查询(表名1:a )select * from (SELECT a,b,c FROM a) T where t.a > 1;
      8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括select * from table1 where time between time1 and time2select a,b,c, from table1 where a not between 数值1 and 数值2
      9、说明:in 的使用方法select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
      10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
      11、说明:四表联查问题:select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
      12、说明:日程安排提前五分钟提醒SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
      13、说明:一条sql 语句搞定数据库分页select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
      14、说明:前10条记录select top 10 * form. table1 where 范围
      15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
      16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表(select a from tableA ) except (select a from tableB) except (select a from tableC)
      17、说明:随机取出10条数据select top 10 * from tablename order by newid()
      18、说明:随机选择记录select newid()
      19、说明:删除重复记录Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
      20、说明:列出数据库里所有的表名select name from sysobjects where type='U'
      21、说明:列出表里的所有的select name from syscolumns where id=object_id('TableName')
      22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type


    显示结果:type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3
      23、说明:初始化表table1TRUNCATE TABLE table1
      24、说明:选择从10到15的记录select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize

    RNumber = Int(Rnd*499) +1
     
    While Not objRec.EOF

    If objRec("ID") = RNumber THEN

    ... 这里是执行脚本 ...

    end if

    objRec.MoveNext

    Wend   
            这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?   
    采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize

    RNumber = Int(Rnd*499) + 1

     
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

     
    set bjRec = ObjConn.Execute(SQL)

    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
      再谈随机数  
    现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
      SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):

    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
      随机读取若干条记录,测试过Access语法:
    SELECT top 10 * From 表名 ORDER BY Rnd(id)

    Sql server:select top n * from 表名 order by newid()

    mysql select * From 表名 Order By rand() Limit n  
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
      语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
      使用SQL语句 用...代替过长的字符串显示
      语法:
      SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename

      Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
      Conn.Execute说明 
     Execute方法  
    该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
      1.执行SQL查询语句时,将返回查询得到的记录集。
    用法为:  Set 对象变量名=连接对象.Execute("SQL 查询语言")
      Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。
      2.执行SQL的操作性语言时,没有记录集的返回。
    此时用法为:  连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option] 
     ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
      ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
      ·BeginTrans、RollbackTrans、CommitTrans方法  这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;
    CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

    BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。
    精妙SQL语句整理2007-01-08 13:08一、基础

    1、说明:创建数据库
    CREATE DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表
    drop table tabname
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)
    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    B: EXCEPT 运算符
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。
    12、说明:使用外连接
    A、left outer join:
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    二、提升

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form. table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1

    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    三、技巧

    1、1=1,1=2的使用,在SQL语句组合时用的较多

    “where 1=1” 是表示选择全部 “where 1=2”全部不选,
    如:
    if @strWhere !=''
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
    end
    else
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
    end

    我们可以直接写成
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere

    2、收缩数据库
    --重建索引
    DBCC REINDEX
    DBCC INDEXDEFRAG
    --收缩数据和日志
    DBCC SHRINKDB
    DBCC SHRINKFILE

    3、压缩数据库
    dbcc shrinkdatabase(dbname)

    4、转移数据库给新用户以已存在用户权限
    exec sp_change_users_login 'update_one','newname','oldname'
    go

    5、检查备份集
    RESTORE VERIFYONLY from disk='E:dvbbs.bak'

    6、修复数据库
    ALTER DATABASE [dvbbs] SET SINGLE_USER
    GO
    DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
    GO
    ALTER DATABASE [dvbbs] SET MULTI_USER
    GO

    7、日志清除
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
    @MaxMinutes INT,
    @NewSize INT


    USE tablename -- 要操作的数据库名
    SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
    @MaxMinutes = 10, -- Limit on time allowed to wrap log.
    @NewSize = 1 -- 你想设定的日志文件的大小(M)

    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size
    FROM sysfiles
    WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' +
    CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
    CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
    FROM sysfiles
    WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
    (DummyColumn char (8000) not null)


    DECLARE @Counter INT,
    @StartTime DATETIME,
    @TruncLog VARCHAR(255)
    SELECT @StartTime = GETDATE(),
    @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
    AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
    AND (@OriginalSize * 8 /1024) > @NewSize
    BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE ((@Counter BEGIN -- update
    INSERT DummyTrans VALUES ('Fill Log')
    DELETE DummyTrans
    SELECT @Counter = @Counter + 1
    END
    EXEC (@TruncLog)
    END
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
    CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
    CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
    FROM sysfiles
    WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF

    8、说明:更改某个表
    exec sp_changeobjectowner 'tablename','dbo'

    9、存储更改全部表

    CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
    @OldOwner as NVARCHAR(128),
    @NewOwner as NVARCHAR(128)
    AS

    DECLARE @Name as NVARCHAR(128)
    DECLARE @Owner as NVARCHAR(128)
    DECLARE @OwnerName as NVARCHAR(128)

    DECLARE curObject CURSOR FOR
    select 'Name' = name,
    'Owner' = user_name(uid)
    from sysobjects
    where user_name(uid)=@OldOwner
    order by name

    OPEN curObject
    FETCH NEXT FROM curObject INTO @Name, @Owner
    WHILE(@@FETCH_STATUS=0)
    BEGIN
    if @Owner=@OldOwner
    begin
    set @OwnerName = @OldOwner + '.' + rtrim(@Name)
    exec sp_changeobjectowner @OwnerName, @NewOwner
    end
    -- select @name,@NewOwner,@OldOwner

    FETCH NEXT FROM curObject INTO @Name, @Owner
    END

    close curObject
    deallocate curObject
    GO


    10、SQL SERVER中直接循环写入数据
    declare @i int
    set @i=1
    while @ibegin
    insert into test (userid) values(@i)
    set @i=@i+1
    end

    小记存储过程中经常用到的本周,本月,本年函数
    Dateadd(wk,datediff(wk,0,getdate()),-1)
    Dateadd(wk,datediff(wk,0,getdate()),6)

    Dateadd(mm,datediff(mm,0,getdate()),0)
    Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))

    Dateadd(yy,datediff(yy,0,getdate()),0)
    Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

    上面的SQL代码只是一个时间段
    Dateadd(wk,datediff(wk,0,getdate()),-1)
    Dateadd(wk,datediff(wk,0,getdate()),6)
    就是表示本周时间段.
    下面的SQL的条件部分,就是查询时间段在本周范围内的:
    Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)
    而在存储过程中
    select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)
    select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)

    最后,再补充一些:

    分组group

      常用于统计时,如分组查总数:
    select gender,count(sno)
    from students
    group by gender
    (查看男女学生各有多少)

      注意:从哪种角度分组就从哪列"group by"

      对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"

    select grade, mno, gender, count(*)
    from students
    group by grade, mno, gender

      通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:

    select sno,count(*) from grades
    where markgroup by sno
    having count(*)>1

      6.UNION联合

      合并查询结果,如:

    SELECT * FROM students
    WHERE name like ‘张%’
    UNION [ALL]
    SELECT * FROM students
    WHERE name like ‘李%’

      7.多表查询

      a.内连接

    select g.sno,s.name,c.coursename
    from grades g JOIN students s ON g.sno=s.sno
    JOIN courses c ON g.cno=c.cno
    (注意可以引用别名)
    b.外连接
    b1.左连接
    select courses.cno,max(coursename),count(sno)
    from courses LEFT JOIN grades ON courses.cno=grades.cno
    group by courses.cno

      左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。

      左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。

      b2.右连接

      与左连接类似

      b3.全连接

    select sno,name,major
    from students FULL JOIN majors ON students.mno=majors.mno

      两边表中的内容全部显示

      c.自身连接

    select c1.cno,c1.coursename,c1.pno,c2.coursename
    from courses c1,courses c2 where c1.pno=c2.cno

      采用别名解决问题。

      d.交叉连接

    select lastname+firstname from lastname CROSS JOIN firstanme

  • JVM参数配置详解

    2010-05-11 16:03:54

    1: heap size
    a: -Xmx<n>                      
    指定 jvm 的最大 heap 大小 , 如 :-Xmx=2g

    b: -Xms<n>                      
    指定 jvm 的最小 heap 大小 , 如 :-Xms=2g , 高并发应用, 建议和-Xmx一样, 防止因为内存收缩/突然增大带来的性能影响。

    c: -Xmn<n>                      
    指定 jvm 中 New Generation 的大小 , 如 :-Xmn256m。 这个参数很影响性能, 如果你的程序需要比较多的临时内存, 建议设置到512M, 如果用的少, 尽量降低这个数值, 一般来说128/256足以使用了。

    d: -XX:PermSize=<n>
    指定 jvm 中 Perm Generation 的最小值 , 如 :-XX:PermSize=32m。 这个参数需要看你的实际情况,。 可以通过jmap 命令看看到底需要多少。

    e: -XX:MaxPermSize=<n>          
    指定 Perm Generation 的最大值 , 如 :-XX:MaxPermSize=64m

    f: -Xss<n>                      
    指定线程桟大小 , 如 :-Xss128k, 一般来说,webx框架下的应用需要256K。 如果你的程序有大规模的递归行为, 请考虑设置到512K/1M。 这个需要全面的测试才能知道。 不过, 256K已经很大了。 这个参数对性能的影响比较大的。

    g: -XX:NewRatio=<n>
    指定 jvm 中 Old Generation heap size 与 New Generation 的比例 , 在使用 CMS GC 的情况下此参数失效 , 如 :-XX:NewRatio=2

    h: -XX:SurvivorRatio=<n>
    指定 New Generation 中 Eden Space 与一个 Survivor Space 的 heap size 比例 ,-XX:SurvivorRatio=8, 那么在总共 New Generation 为 10m 的情况下 ,Eden Space 为 8m

    i: -XX:MinHeapFreeRatio=<n>
    指定 jvm heap 在使用率小于 n 的情况下 ,heap 进行收缩 ,Xmx==Xms 的情况下无效 , 如 :-XX:MinHeapFreeRatio=30

    j: -XX:MaxHeapFreeRatio=<n>
    指定 jvm heap 在使用率大于 n 的情况下 ,heap 进行扩张 ,Xmx==Xms 的情况下无效 , 如 :-XX:MaxHeapFreeRatio=70

    k: -XX:LargePageSizeInBytes=<n>
    指定 Java heap 的分页页面大小 , 如 :-XX:LargePageSizeInBytes=128m

    2: garbage collector

    a: -XX:+UseParallelGC
    指定在 New Generation 使用 parallel collector, 并行收集 , 暂停 app threads, 同时启动多个垃圾回收 thread, 不能和 CMS gc 一起使用 . 系统吨吐量优先 , 但是会有较长长时间的 app pause, 后台系统任务可以使用此 gc

    b: -XX:ParallelGCThreads=<n>
    指定 parallel collection 时启动的 thread 个数 , 默认是物理 processor 的个数 ,

    c: -XX:+UseParallelOldGC
    指定在 Old Generation 使用 parallel collector

    d: -XX:+UseParNewGC
    指定在 New Generation 使用 parallel collector, 是 UseParallelGC 的 gc 的升级版本 , 有更好的性能或者优点 , 可以和 CMS gc 一起使用

    e: -XX:+CMSParallelRemarkEnabled
    在使用 UseParNewGC 的情况下 , 尽量减少 mark 的时间

    f: -XX:+UseConcMarkSweepGC
    指定在 Old Generation 使用 concurrent cmark sweep gc,gc thread 和 app thread 并行 ( 在 init-mark 和 remark 时 pause app thread). app pause 时间较短 , 适合交互性强的系统 , 如 web server

    g: -XX:+UseCMSCompactAtFullCollection
    在使用 concurrent gc 的情况下 , 防止 memory fragmention, 对 live object 进行整理 , 使 memory 碎片减少

    h: -XX:CMSInitiatingOccupancyFraction=<n>
    指示在 old generation 在使用了 n% 的比例后 , 启动 concurrent collector, 默认值是 68, 如 :-XX:CMSInitiatingOccupancyFraction=70
    有个 bug, 在低版本(1.5.09 and early)的 jvm 上出现 , http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

    i: -XX:+UseCMSInitiatingOccupancyOnly
    指示只有在 old generation 在使用了初始化的比例后 concurrent collector 启动收集

    3:others
    a: -XX:MaxTenuringThreshold=<n>
    指定一个 object 在经历了 n 次 young gc 后转移到 old generation 区 , 在 linux64 的 java6 下默认值是 15, 此参数对于 throughput collector 无效 , 如 :-XX:MaxTenuringThreshold=31

    b: -XX:+DisableExplicitGC
    禁止 java 程序中的 full gc, 如 System.gc() 的调用. 最好加上么, 防止程序在代码里误用了。对性能造成冲击。

    c: -XX:+UseFastAccessorMethods
    get,set 方法转成本地代码

    d: -XX:+PrintGCDetails
    打应垃圾收集的情况如 :
    [GC 15610.466: [ParNew: 229689K->20221K(235968K), 0.0194460 secs] 1159829K->953935K(2070976K), 0.0196420 secs]

    e: -XX:+PrintGCTimeStamps
    打应垃圾收集的时间情况 , 如 :
    [Times: user=0.09 sys=0.00, real=0.02 secs]

    f: -XX:+PrintGCApplicationStoppedTime
    打应垃圾收集时 , 系统的停顿时间 , 如 :
    Total time for which application threads were stopped: 0.0225920 seconds

    4: a web server product sample and process
    JAVA_OPTS=" -server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 "

    最初的时候我们用 UseParallelGC 和 UseParallelOldGC,heap 开了 3G,NewRatio 设成 1. 这样的配置下 young gc 发生频率约 12,3 秒一次 , 平均每次花费 80ms 左右 ,full gc 发生的频率极低 , 每次消耗 1s 左右 . 从所有 gc 消耗系统时间看 , 系统使用率还是满高的 , 但是不论是 young gc 还是 old gc,applicaton thread pause 的时间比较长 , 不合适 web 应用 . 我们也调小 New Generation 的 , 但是这样会使 full gc 时间加长 .

    后来我们就用 CMS gc(-XX:+UseConcMarkSweepGC), 当时的总 heap 还是 3g, 新生代 1.5g 后 , 观察不是很理想 , 改为 jvm heap 为 2g 新生代设置 -Xmn1g, 在这样的情况下 young gc 发生的频率变成 ,7,8 妙一次 , 平均每次时间 40~50 毫秒左右 ,CMS gc 很少发生 , 每次时间在 init-mark 和 remark(two steps stop all app thread) 总共平均花费 80~90ms 左右 .

    在这里我们曾经 New Generation 调大到 1400m, 总共 2g 的 jvm heap, 平均每次 ygc 花费时间 60~70ms 左右 ,CMS gc 的 init-mark 和 remark 之和平均在 50ms 左右 , 这里我们意识到错误的方向 , 或者说 CMS 的作用 , 所以进行了修改

    最后我们调小 New Generation 为 256m,young gc 2,3 秒发生一次 , 平均停顿时间在 25 毫秒左右 ,CMS gc 的 init-mark 和 remark 之和平均在 50ms 左右 , 这样使系统比较平滑 , 经压力测试 , 这个配置下系统性能是比较高的

    在使用 CMS gc 的时候他有两种触发 gc 的方式 :gc 估算触发和 heap 占用触发 . 我们的 1.5.0.09 环境下有次 old 区 heap 占用再 30% 左右 , 她就频繁 gc, 个人感觉系统估算触发这种方式不靠谱 , 还是用 heap 使用比率触发比较稳妥 .

    这些数据都来自 64 位测试机 , 过程中的数据都是我在 jboss log 找的 , 当时没有记下来 , 可能存在一点点偏差 , 但不会很大 , 基本过程就是这样 .

    5: 总结
    web server 作为交互性要求较高的应用 , 我们应该使用 Parallel+CMS,UseParNewGC 这个在 jdk6 -server 上是默认的 ,new generation gc, 新生代不能太大 , 这样每次 pause 会短一些 .CMS mark-sweep generation 可以大一些 , 可以根据 pause time 实际情况控制

  • [论坛] [我和51Testing] 有个约会

    2010-04-28 12:10:00

    2008年的5月1号,正值国际五一劳动节,而我,刚从学校毕业,顺利地应聘进一家软件公司,职位是一个当时看似不温不火的软件测试,那时候国内软件测试刚发展起来,听说的人也不是很多,自己在学校所学专业是计算机应用,没多少了解软件测试,更别提有什么经验,所以那时候面对自己即将到来的工作有些无从下手;
          印象最深刻的是,进来公司的第一天,公司测试主管就告诉我,有空多上去51testing看看,那里面是一个很好软件测试的资料库,也是一个经验库,很多问题可以在哪里得到解决;那时候开始,我几乎把业余时间都往51testing论坛里面扎,也慢慢了解了软件测试,结识也一些朋友,也对我三年的软件测试经验和技术也很大的帮助,就是因为这个缘,让我结识了51testing,让我在对的时间里遇见对的“网站”,现在,我从进公司来的软件测试实习员,到现在的测试组长。
           感谢51testing给与我们软件测试人这么好的平台,很快,51testing就要6岁了,在此真诚地祝福它,生日快乐!
          

    最后请容许我给它打打广告:
    2004年5月1日,51Testing论坛正式上线,论坛本着“提高测试水平,改进软件质量,提升软件测试地位”为宗旨,
    在众多有如cwj007、luoyear、云层、cuiqiliang等软件测试行业资深专家、版主和热心会员的帮助下,论坛取得了长足
    的发展。凭借旺盛的人气和资深的行业背景,51Testing论坛已经成为了国内软件测试从业者学习和交流的最好平台。
  • 转:UI 测试用例的标准数据参考

    2009-12-01 13:55:54

    控件类型

    大分类

    小分类

    检查内容

    结果判定

    TextBox

    数值型

    边界值

    输入[最小值-1]

    程序应提示错误

    输入[最小值]

    OK

    输入[最大值]

    OK

    输入[最大值+1]

    程序应提示错误

    位数

    输入[最小位数-1]

    程序应提示错误

    输入[最小位数]

    OK

    输入[最大位数]

    OK

    输入[最大位数+1]

    程序应提示错误

    允许输入小数位的控件,小数位的长度做以上同样

    同上

    异常值、特殊值

    输入[空白(NULL)]、空格或‘“~!@#$%^&*()_+-={}[]|\:;”’<>,./?;”等可能导致系统错误的字符

    程序应提示错误

    禁止直接输入特殊字符时,使用粘贴拷贝功能尝试输入,并测试能否正常提交保存。

    只能使用粘贴拷贝方法输入的特殊字符应无法保存,并应给出相应提示

    word 中的特殊功能,通过剪贴板拷贝到输入框:分页符,分节符,类似公式的上下标等

    程序应提示错误

    输入[负值]

    根据设计书要求判定

    输入设计书中明确指出禁止输入的数字

    根据设计书要求判定

    输入[英文字母]

    程序应提示错误

    数值输入的长度:整型----32 最大值 65535,最小值-6553516 最大值 32767,最小值-32767

    根据设计书要求判定

    带符号的数值:带正号的正数,带负号的负数

    根据设计书要求判定

    小数:小数点后的位数,小数的四舍五入问题,小数点前零舍去的情况,如 .12;多个小数点的情况;0值:0.00..0

    根据设计书要求判定

    分数:如 2/3

    根据设计书要求判定

    首位为零的数值:如011

    根据设计书要求判定

    科学技术法是否支持:如 1.0E2

    根据设计书要求判定

    指数是否支持

    根据设计书要求判定

    全角数字和半角数字的情况

    根据设计书要求判定

    数字与字母的混合:16进制数值,8进制数值

    根据设计书要求判定

    货币型输入项:允许小数点后几位

    根据设计书要求判定

    字符型

    字符种类

    输入[全角字符]

    根据设计书要求判定

    输入[半角字符]

    根据设计书要求判定

    数字字符

    根据设计书要求判定

    邮政编码输入项的输入限制,如只能输入半角数字字符或某几个指定

  • 转:上传下载测试点

    2009-11-22 12:59:29

    文件上传:

      ***页面***

      1、页面美观性、易用性(键盘和鼠标的操作、tab跳转的顺序是否正确)

      2、按钮文字正确性

      3、说明文字是否正确

      4、正确/错误的提示文字是否正确

      5、提示当前位置是否正确,并且和其他页面保持一致格式

      6、必添项的标示是否正确

      ***功能***

      1、路径是否可以手工输入(手工输入的时候有没有限长)

      2、上传文件超过最大值是在提交前校验还是提交后校验

      3、上传文件格式是否全部支持(图片:gif/jpg/bmp...文档:doc/sxw/xls...压缩包:zip/rar...安装文件:exe/msi)

      4、上传文件是否支持中文名称

      5、文件名称的最大值、最小值、特殊字符(包含空格)、使用程序语句是否会对其造成影响、中文名称是否能正常显示

      6、对于是否发布的设置是否正确(前台校验)

      7、简介最大值、特殊字符、使用程序语句是否会对其造成影响

      ***按钮***

      1、保存按钮

      · 对输入项有错误提示后光标提示是否正确

      · 对输入项的错误提示是否描述正确

      · 对必添项是否进行校验

      2、清空按钮

      · 是否清除(或还原)了填写内容

      3、返回按钮

      · 是否返回上一页面

      文件下载:

      ***页面***

      1、当前位置的提示是否现实正确

      2、页面美观性、易用性(键盘和鼠标的操作、tab跳转的顺序是否正确)

      3、按钮文字是否正确

      4、说明性文字是否正确

      5、正确/错误的提示文字是否正确

  • 转:功能和界面测试用例

    2009-11-16 12:03:40

    1.1 文本框、按钮等控件测试

    1.1.1 文本框的测试

    如何对文本框进行测试
     a,输入正常的字母或数字。
     b,输入已存在的文件的名称;
     c,输入超长字符。例如在“名称”框中输入超过允许边界个数的字符,假设最多255个字符,尝试输入 256个字符,检查程序能否正确处理;
     d,输入默认值,空白,空格;
     e,若只允许输入字母,尝试输入数字;反之;尝试输入字母;
     f,利用复制,粘贴等操作强制输入程序不允许的输入数据;
     g,输入特殊字符集,例如,NUL及\n等;
     h,输入超过文本框长度的字符或文本,检查所输入的内容是否正常显示;
     i,输入不符合格式的数据,检查程序是否正常校验,如,程序要求输入年月日格式为yy/mm/dd,实际输入yyyy/mm/dd,程序应该给出错误提示

    在测试过程中所用到的测试方法

     1,输入非法数据;
     2,输入默认值;
     3,输入特殊字符集;
     4,输入使缓冲区溢出的数据;
     5,输入相同的文件名;

    命令按钮控件的测试

    测试方法:

     a,点击按钮正确响应操作。如,单击确定,正确执行操作;单击取消,退出窗口;                   b,对非法的输入或操作给出足够的提示说明,如,输入月工作天数为32时,单击”确定“后系统应提示:天数不能大于31;
     c,对可能造成数据无法恢复的操作必须给出确认信息,给用户放弃选择的机会;

    单选按钮控件的测试

    测试方法:

    vD#[G] I?zXDG257506 a,一组单选按钮不能同时选中,只能选中一个。
    [N{;wm5P257506 b,逐一执行每个单选按钮的功能。分别选择了“男”“女”后,保存到数据库的数据应该相应的分别为“男”“女”;

     c,一组执行同一功能的单选按钮在初始状态时必须有一个被默认选中,不能同时为空;

    up-down控件文本框的测试

    测试方法:

     a,直接输入数字或用上下箭头控制,如,在“数目”中直接输入10,或者单击向上的箭头,使数目变为10;


     b,利用上下箭头控制数字的自动循环,如,当最多数字为253时,单击向上箭头,数目自动变为1;反之亦适用;
     c,直接输入超边界值,系统应该提示重新输入; 

    d,输入默认值,空白。如,“插入”数目为默认值,点击“确定”;或,删除默认值,使内容为空,单击“确定”进行测试; 

    e,输入字符。此时系统应提示输入有误。

    组合列表框的测试

    测试方法:

     a,条目内容正确,其详细条目内容可以根据需求说明确定;
     b,逐一执行列表框中每个条目的功能;
     c,检查能否向组合列表框输入数据;

    复选框的测试

    测试方法:

     a,多个复选框可以被同时选中;
     b,多个复选框可以被部分选中;
     c,多个复选框可以都不被选中;
     d,逐一执行每个复选框的功能;

    列表框控件的测试

    测试方法:

     a,条目内容正确;同组合列表框类似,根据需求说明书确定列表的各项内容正确,没有丢失或错误;      b,列表框的内容较多时要使用滚动条;
     c,列表框允许多选时,要分别检查shift选中条目,按ctrl选中条目和直接用鼠标选中多项条目的情况;

    滚动条控件的测试

    要注意一下几点:

     a,滚动条的长度根据显示信息的长度或宽度及时变换,这样有利于用户了解显示信息的位置和百分比,如,word中浏览100页文档,浏览到50页时,滚动条位置应处于中间;
     b,拖动滚动条,检查屏幕刷新情况,并查看是否有乱码;
     c,单击滚动条; 
    d,用滚轮控制滚动条;
     e,滚动条的上下按钮。

    各种控件在窗体中混和使用时的测试

     a,控件间的相互作用;
     b,tab键的顺序,一般是从上到下,从左到右;
     c,热键的使用,逐一测试;
     d,enter键和esc键的使用;

    在测试中,应遵循由简入繁的原则,先进行单个控件功能的测试,确保实现无误后,再进行多个控件的的功能组合的测试。

    ps:密码输入框测试时要特别注意进行字母大写输入的测试。

    查找替换操作
     案例演示:打开word中的"替换"对话框
     测试本功能有通过测试和失败测试两种情况
     通过测试:
     1,输入内容直接查找,或查找全部

     2,在组合框中寻找已经查找过的内容,再次查找并确认文档的内容正确,如,已经查找过"测试用例",再次进入不用重新输入查找内容,直接在文档中搜寻就可以.

    失败测试:
     1,输入过长或过短的查询字符串.如,假设查询的字符串长度为1到255,那么输入0,1,2,256,255和254进行测试;
     2,输入特殊字符集,如,在word中.^g代表图片,^代表分栏符,可以输入这类特殊字符测试;

    替换测试大体相同.
     关于编辑操作窗口的功能测试的用例:
     1,关闭查找替换窗口.不执行任何操作,直接退出;
     2,附件和选项测试.假如,设定"精确搜寻","向后"搜索等附件选项等等来测试;
     3,控件间的相互作用.如,搜寻内容为空时,按钮"搜寻全部","搜寻","全部替换","替换"都为灰色.
     4,热键, Tab键.回车键的使用.

    插入操作
     1,插入文件
     测试的情况
     a,插入文件;
     b,插入图像;

     c,在文档中插入文档本身;

     d,移除插入的源文件;

     e,更换插入的源文件的内容;

    2,链接文件
     测试方法:

     a,插入链接文件;
     b,在文档中链接文档本身;
     c,移除插入的源文件;
     d,更换插入的源文件的内容.

    3,插入对象
    iP,A1eS|w(G0E257506 要测试的内容
     a,插入程序允许的对象,如,在word中插入excel工作表;

     b,修改所插入对象的内容.插入的对象仍能正确显示;
     c,卸载生成插入对象的程序,如,在word中插入excel工作表后卸载excel,工作表仍正常使用.

    编辑操作51Testing软件测试网9Rb3Hx0M
     编辑操作包括剪切,复制,粘贴操作.

    测试剪切操作的方法

    a,对文本,文本框,图文框进行剪切;
     b,剪切图像
     c,文本图像混合剪切
     复制操作方法与剪切类似.

    测试时,主要是对粘贴操作的测试,方法是:
     a,粘贴剪切的文本,文本框及图文框;
     b,粘贴所剪切的图像;
     c,剪切后,在不同的程序中粘贴
     d,多次粘贴同一内容,如,剪切后,在程序中连续粘贴3次;
     e,利用粘贴操作强制输入程序所不允许输入的数据.

    界面测试用例的设计方法
     1,窗体
     测试窗体的方法:
     a,窗体大小,大小要合适,控件布局合理;
     b,移动窗体.快速或慢速移动窗体,背景及窗体本身刷新必须正确;
     c,缩放窗体,窗体上的控件应随窗体的大小变化而变化;

     d,显示分辨率.必须在不同的分辨率的情况下测试程序的显示是否正常;
     进行测试时还要注意状态栏是否显示正确;工具栏的图标执行操作是否有效,是否与菜单懒中图标显示一致;错误信息内容是否正确,无错别字,且明确等等;

    2,控件
     测试方法:
     a,窗体或控件的字体和大小要一致;
     b,注意全角,半角混合
     c,无中英文混合.

    菜单

    进行测试时要注意
     a,选择菜单是否可以正常工作,并与实际执行内容一致;
     b,是否有错别字:51Testing软件测试网
     c,快捷键是否重复;
     d,热键是否重复;
     e,快捷键与热键操作是否有效
     f,是否存在中英文混合
      g,菜单要与语境相关,如,不同权限的用户登陆一个应用程序,不同级别的用户可以看到不同级别的菜单并使用不同级别的功能;
    h,鼠标右键快捷菜单

    特殊属性
     1,安装界面应有公司介绍或产品介绍,有公司的图标

      2,主界面及大多数界面最好有公司图标
     3,选择"帮助"->"关于"命令,应看见相关版权和产品信息

  • 小布老师Loadrunner视频地址

    2009-10-29 15:24:30

    小布老师视频:
    测试工具概述,兼LoadRunner介绍 -1-4
    http://www.boobooke.com/v/bbk1046
    http://www.boobooke.com/v/bbk1046.zip
    http://www.boobooke.com/v/bbk1047
    http://www.boobooke.com/v/bbk1047.zip
    http://www.boobooke.com/v/bbk1048
    http://www.boobooke.com/v/bbk1048.zip
    http://www.boobooke.com/v/bbk1055
    http://www.boobooke.com/v/bbk1055.zip
    LR系列培训视频  - LoadRunner概述(上下)
    http://www.boobooke.com/v/bbk1059
    http://www.boobooke.com/v/bbk1059.zip
    http://www.boobooke.com/v/bbk1060
    http://www.boobooke.com/v/bbk1060.zip
    LR系列培训视频  - LoadRunner安装
    http://www.boobooke.com/v/bbk1061
    http://www.boobooke.com/v/bbk1061.zip
    LR系列培训视频  - 录制和回放测试脚本(1-3)
    http://www.boobooke.com/v/bbk1063
    http://www.boobooke.com/v/bbk1063.zip
    http://www.boobooke.com/v/bbk1064
    http://www.boobooke.com/v/bbk1064.zip
    http://www.boobooke.com/v/bbk1065
    http://www.boobooke.com/v/bbk1065.zip
    LR系列培训视频 - LoadRunner测试Tuxedo应用系统 1-4
    http://www.boobooke.com/v/bbk1067
    http://www.boobooke.com/v/bbk1067.zip
    http://www.boobooke.com/v/bbk1068
    http://www.boobooke.com/v/bbk1068.zip
    http://www.boobooke.com/v/bbk1071
    http://www.boobooke.com/v/bbk1071.zip
    http://www.boobooke.com/v/bbk1072
    http://www.boobooke.com/v/bbk1072.zip
    开源性能测试工具Curl-Loader快速实战 - 1
    http://www.boobooke.com/v/bbk1808
    http://www.boobooke.com/v/bbk1808.zip
    开源性能测试工具Curl-Loader快速实战 - 2
    http://www.boobooke.com/v/bbk1809
    http://www.boobooke.com/v/bbk1809.zip
    开源性能测试工具Curl-Loader快速实战 - 3
    http://www.boobooke.com/v/bbk1835
    http://www.boobooke.com/v/bbk1835.zip
    开源性能测试工具Curl-Loader快速实战 - 4
    http://www.boobooke.com/v/bbk1836
    http://www.boobooke.com/v/bbk1836.zip
    使用LoadRunner测试Oracle实例研究 - 1
    http://www.boobooke.com/v/bbk2159
    http://www.boobooke.com/v/bbk2159.zip
    使用LoadRunner测试Oracle实例研究 - 2
    http://www.boobooke.com/v/bbk2170
    http://www.boobooke.com/v/bbk2170.zip
    使用LoadRunner测试Oracle实例研究 - 3
    http://www.boobooke.com/v/bbk2171
    http://www.boobooke.com/v/bbk2171.zip
  • 转:登陆、添加、删除、查询、注册、修改密码模块的测试点

    2009-10-16 14:52:59

    1、登陆

      ①        用户名和密码都符合要求(格式上的要求)

      ②        用户名和密码都不符合要求(格式上的要求)

      ③        用户名符合要求,密码不符合要求(格式上的要求)

      ④        密码符合要求,用户名不符合要求(格式上的要求)

      ⑤        用户名或密码为空

      ⑥       数据库中不存在的用户名,不存在的密码

      ⑦        数据库中存在的用户名,错误的密码

      ⑧        数据库中不存在的用户名,存在的密码

      ⑨        输入的数据前存在空格

      ⑩        输入正确的用户名密码以后按[enter]是否能登陆

      2、添加

      ①        要添加的数据项均合理,检查数据库中是否添加了相应的数据

      ②        留出一个必填数据为空

      ③        按照边界值等价类设计测试用例的原则设计其他输入项的测试用例

      ④        不符合要求的地方要有错误提示

      ⑤        是否支持table键

      ⑥        按enter是否能保存

      ⑦        若提示不能保存,也要察看数据库里是否多了一条数据

      3、删除

      ①        删除一个数据库中存在的数据,然后查看数据库中是否删除

      ②        删除一个数据库中并不存在的数据,看书否有错误提示,并且数据库中没有数据被删除

      ③        输入一个格式错误的数据,看是否有错误提示,并且数据库中没有数据被删除。

      ④        输入的正确数据前加空格,看是否能正确删除数据

      ⑤        什么也不输入

      ⑥        是否指出table键

      ⑦        是否支持enter键

      4、查询

      精确查询:

      ①        输入的查询条件为数据库中存在的数据,看是否能正确地查出相应得数据

      ②        输入正确的查询条件以前加上空格,看是否能正确地查出相应的数据

      ③        输入格式或范围不符合要求的数据,看是否有错误提示

      ④        输入数据库中不存在的数据

      ⑤        不输入任何数据

      ⑥        是否支持table键

      ⑦        是否支持enter键

      模糊查询:

      在精确查询的基础上加上以下一点:

      ①        输入一些字符,看是否能查出数据库中所有的相关信息

     用户注册和密码修改测试点

      一.用户注册

      只从用户名和密码角度写了几个要考虑的测试点,如果需求中明确规定了安全问题,Email,出生日期,地址,性别等等一系列的格式和字符要求,那就都要写用例测了~

      以等价类划分和边界值法来分析

      1、填写符合要求的数据注册: 用户名字和密码都为最大长度 (边界值分析,取上点)

      2、填写符合要求的数据注册 :用户名字和密码都为最小长度 (边界值分析,取上点)

      3、填写符合要求的数据注册:用户名字和密码都是非最大和最小长度的数据(边界值分析,取内点)

      4、必填项分别为空注册

      5、用户名长度大于要求注册1位(边界值分析,取离点)

      6、用户名长度小于要求注册1位(边界值分析,取离点)

      7、密码长度大于要求注册1位(边界值分析,取离点)

      8、密码长度小于要求注册1位(边界值分析,取离点)

      9、用户名是不符合要求的字符注册(这个可以划分几个无效的等价类,一般写一两个就行了,如含有空格,#等,看需求是否允许吧~)

      10、密码是不符合要求的字符注册(这个可以划分几个无效的等价类,一般写一两个就行了)

      11、两次输入密码不一致(如果注册时候要输入两次密码,那么这个是必须的)

      12、重新注册存在的用户

      13、改变存在的用户的用户名和密码的大小写,来注册。(有的需求是区分大小写,有的不区分)

      14、看是否支持tap和enter键等;密码是否可以复制粘贴;密码是否以* 之类的加秘符号显示

      二.修改密码

      当然具体情况具体分析哈~不能一概而论~

      实际测试中可能只用到其中几条而已,比如银行卡密码的修改,就不用考虑英文和非法字符,更不用考虑那些TAP之类的快捷键.

      而有的需要根据需求具体分析了,比如连续出错多少次出现的提示,和一些软件修改密码要求一定时间内有一定的修改次数限制等等。

      1、不输入旧密码,直接改密码

      2、输入错误旧密码

      3、不输入确认新密码

      4、不输入新密码

      5、新密码和确认新密码不一致

      6、新密码中有空格

      7、新密码为空

      8、新密码为符合要求的最多字符

      9、新密码为符合要求的最少字符

      10、新密码为符合要求的非最多和最少字符

      11、新密码为最多字符-1

      12、新密码为最少字符+1

      13、新密码为最多字符+1

      14、新密码为最少字符-1

      15、新密码为非允许字符(如有的密码要求必须是英文和数字组成,那么要试汉字和符号等)

      16、看是否支持tap和enter键等;密码是否可以复制粘贴;密码是否以* 之类的加秘符号

      17、看密码是否区分大小写,新密码中英文小写,确认密码中英文大写.

      18、新密码与旧密码一样能否修改成功.

      有个朋友问我,注册的时候测试了密码长度,修改的时候为什么还要测试。

      我在这里举个我亲身经历的例子,以前我玩一个游戏,叫恋爱盒子,在游戏里我把密码改成了xuewufengtian,后来怎么也上不去了。因为资料填写不全无法找回密码。后来我在一次注册过程中发现,注册的时候密码长度最长是10位,这时我灵机一动,用了原来的用户名和xuewufengt的密码就进去了。 这表明,修改密码时候的最大长度和注册及登陆的时候密码最大长度有可能是不一致的。

  • 转:性能测试面试题

    2009-09-15 20:17:43

    1.什么是负载测试?什么是性能测试

     

    2.性能测试包含了哪些测试(至少举出3种)

     

    3.简述性能测试的步骤

     

    4.简述使用Loadrunner的步骤

     

    5.什么时候可以开始执行性能测试?

     

    6.LoadRunner由哪些部件组成?

     

    7.你使用LoadRunner的哪个部件来录制脚本?

     

    8.LoadRunner的哪个部件可以模拟多用户并发下回放脚本?

     

    9.什么是集合点?设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个?

     

    10.什么是场景?场景的重要性有哪些?如何设置场景?

     

    11.请解释一下如何录制web脚本?

     

    12.为什么要创建参数?如何创建参数?

     

    13.什么是关联?请解释一下自动关联和手动关联的不同。

     

    14.你如何找出哪里需要关联?请给一些你所在项目的实例。

     

    15.你在哪里设置自动关联选项?

     

    16.哪个函数是用来截取虚拟用户脚本中的动态值?(手工管联)

     

    17.你在VUGen中何时选择关闭日志?何时选择标准和扩展日志?

     

    18.你如何调试LoadRunner脚本?

     

    19你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。

     

    20.在运行设置下你能更改那些设置?

     

    21.你在不同的环境下如何设置迭代?

     

    22.你如何在负载测试模式下执行功能测试

     

    23.什么是逐步递增?你如何来设置?

     

    24.以线程方式运行的虚拟用户有哪些优点?

     

    25.当你需要在出错时停止执行脚本,你怎么做?

     

    26.响应时间和吞吐量之间的关系是什么?

     

    27.说明一下如何在LR中配置系统计数器?

     

    28.你如何识别性能瓶颈?

     

    29.如果web服务器、数据库以及网络都正常,问题会出在哪里?

     

    30.如何发现web服务器的相关问题?

     

    31.如何发现数据库的相关问题?

     

    32.解释所有web录制配置?

     

    33.解释一下覆盖图和关联图的区别?

     

    34.你如何设计负载?标准是什么?

     

    35.Vuser_init中包括什么内容?

     

    36. Vuser_end中包括什么内容?

     

    37.什么是think timethink_time有什么用?

     

    38.标准日志和扩展日志的区别是什么?

     

    39.解释以下函数及他们的不同之处。

    Lr_debug_message

    Lr_output_message

    Lr_error_message

    Lrd_stmt

    Lrd_fetch

     

    40.什么是吞吐量?

     

    41.场景设置有哪几种方法

  • loadrunner8.1操作笔记

    2009-08-28 15:38:17

    一、概述
    LAODRUNNER8.1 作为专业的性能测试工具,通过模拟成千上万的用户对被测应用进行操作和请求,在实验室环境中精确重现生产环境中任意可能出现的业务压力,然后通过在测试过程中获取的信息和数据来确认和查找软件的性能问题,分析性能瓶颈.

    LOADRUNNER提供了三个大主要模块,这三个模块既可以作为独立的工具分别完成各自的功能,又可以作为LOADRUNNER的一部分彼此衔接,与其他模块共同完成软件性能的整体测试.这三大模块主要是:

    Ø         VITUAL USER GENERATOR--------用于录制脚本

    Ø         MERCURY LOADRUNNER CONTROLLER---------用于创建,运行和监视场景

    Ø         MERCURY LOADRUNNER ANALYSIS--------用于分析测试结果;

    二、LOADRUNNER8.1 安装
    LAODRUNNER8.安装过程比较简单,只需按系统的提示一步一步操作就可以了,这里对安装过程中的一些要点进行简要的说明.

    Ø         安装类型 

    安装盘内有两个盘片,MERCURY LOADRUNNER8.1和MECURY LOADRUNNER 8.0ADD-INS.前者包括了LR安装程序及常用组件,后者全部为组件,各组件的作用在安装盘中都有详细的提示.

    Ø         LICENSE 类型

    LICENSE类型说明如下:

    PERMANENT  永不过期的LICENSE;

    TIME LIMITED  限定了使用的起始时间和使用周期;

    TEMPORARY   从安装后开始计算,限定了使用的天数;

    VUD-BASED   限定了虚拟用户数量

    PLUGGED   需要DONGLE,也就是HARDWARE KEY,DONGLE在中国被音译为“狗”,主要是防止软件被盗用

    Ø         RPM和WEB SERVER之间的鉴权

    如果在安装时选择安装REMOTE PERFORMANCE MONITOR SERVER,LOADRUNNER会弹出一个要求输入用户名和密码的对话框,

    REMOTE PERFORMANCE MONITOR SERVER是一个远程监视场景的服务器,为测试人员提供WEB化的场景页面,用于实现多台及其通过浏览器同时在线监视场景.这里设定用户名和口令的目的主要是为了REMOTE PERFORMANCE MONITOR(RPM)和运行了IIS的WEB SERVER之间进行鉴权.在RPM安装完毕之后,只有在LOADRUNNER CONTROLLER的RPM用户配置对话框中输入指定的用户名和口令,系统才能允许进行远程监控.

    Ø         设定LOADRUNNER GENERATOR如何登陆到CONTROLLER

    LOADRUNNER提供了两种方式让LOAD GENERATOR的虚拟用户登陆到CONTROLLER,

    n         ALLOW VIRTUALUSERS TO RUN ON THIS MACHINE WITHOUT USER LOGIN

    n         MANUAL LOG IN TO THE LOAD GENERATOR MACHINE

    三、使用VITUAL USER GENERATOR录制开发脚本
    LOADRUNNER脚本的开发过程一般需要以下几个过程

    Ø         使用LOADRUNNER的VIRTUAL USER GENERATOR录制基本的测试脚本;

    Ø         根据系统需求编辑测试脚本,看能否通过,

    Ø         在单机模式下运行脚本看能否通过,

     1.选择协议
    要想正确的选择LOADRUNNER的脚本协议,首先要从LOADRNNER的工作原理上深入理解协议的作用和意义。LOADRUNER启动后,在任务栏上会有一个LOADRNNER AGENT PROCESS的进程,这个进程的一项重要的工作就是监视各种协议的客户端和服务器端的通信。只要是能够支持的协议,LOADRUNNER在录制的过程中就可以通过脚本语言将通信过程录制下来。所以只要明确了被测软件的通信过程和所使用的协议,LOADRUNNER才能正确的录制脚本。对于常见的应用软件,我们可以根据被测应用是B/S结构还是C/S结构来选择协议;

    Ø         对于B/S结构,可以选择WEB(HTTP/HTTML)协议;

    Ø         对于C/S结构,可以根据后端数据库的类型来选择,如SYBASECTLIB协议用于测试后台数据库为SYBASE的应用,MS SQL SERVER协议用于测试后台数据库为SQL SERVER的应用;

    Ø         对于没有数据库的WINDOWS应用,可以选择WINDOWS SOCKETS这个底层的协议;

    这里需要说明的是,无论使用哪种协议,LOADRUNNER的测试流程都基本是一样的,只有在设定细节上有所不同,测试人员只要对被测应用的技术架构熟悉了,就能够成功完成脚本的录制。

     2.录制测试脚本
    根据需求设定好脚本录制参数后,在VIRTUAL USER GENERATOR主窗口单击START RECORD按钮,系统就开始自动录制脚本。

    Ø         理解脚本的三个部分;

    LOADRUNNER 将测试脚本分为3个部分,VUSER_INIT,VUSER_END和ACTION,其中VUSER_INIT和VUSER_END一般用于存放应用程序初始化的脚本和注销关闭的脚本,在重复执行的时候,这两部分的内容只执行一次.而ACTION部分用于存放实际的操作脚本,这部分脚本可以多次执行,测试人员还可以根据需要创建多个ACTION 脚本,但不能创建VUSER_INIT和VUSER_END.

    Ø         熟悉录制脚本工具栏;

    在录制的过程中屏幕上有一个悬浮的工具栏,这是控制脚本录制的工具栏,是脚本录制过程中测试人员和VUGEN交互的主要平台,每个可用的按钮都可以执行相应的操作;

    Ø         查看脚本;

    n         SCRIPT. VIEW:查看全部的脚本;

    n         TREE VIEW:查看从每个URL获取来的页面;

    3.开发测试脚本
    Ø         插入事务

    有时侯测试人员根据项目需要,除了要衡量整个测试脚本的性能外,还想获取到脚本中的某一段和几段操作的性能数据;以便更详细的知道具体的是用户的哪些动作对性能的影响比较大.LOADRUNNER采用在脚本中定义事务来达到这一要求.

    所谓事务(TRANSACTION),就是在脚本定义中定义的某段操作(ACTION),更确切的说,就是一段脚本语句.定义事务时,首先在脚本中找到事务的开始和结束位置,然后分别插入一个事务起始标记,这样,当脚本运行的时候,LOADRUNER会自动在事务的起始点计时,脚本在运行到事务结束点时计时结束,系统会自动记录这段操作的运行时间等性能数据;在脚本运行完毕后,系统会在结果信息中单独反映每个事务运行结果.

    事务的插入操作可以在脚本运行过程中进行,也可以在脚本录制完毕后进行,建议在脚本录制完毕后进行.

    n         定位事务语句的集合

    n         插入事务起始点语句

    将光标放置在欲定义事务的语句集合中第一条语句的上面一行,单击工具栏上的INSERT START TRANSACTION按钮,输入事务名称后,单击OK按钮,系统自动在脚本语句中插入如下语句:

    LR_START_TRANSACTION(“事务名称”)

    n         插入事务结束点语句

    将光标放置在欲定义事务的语句集合中最后一条语句的后面一行,单击工具栏上的INSERT END TRANSACTION按钮,输入事务名称后,单击OK按钮,系统自动在脚本语句中插入如下语句:

    LR_END_TRANSACTION(“事务名称“)

    Ø         插入集合点

    多用户同时加载并发,并发过程仅仅体现在开始执行的那一刹那,随着服务器对请求的响应时间的不一致或系统环境条件的限制,在运行过程中能集合到一点的可能性微乎其微,所以将一定数量的用户同时加载并不是真正意义上的并发.

    集合点的用处对于Load Runner来说意义非常大,它可以设置多个虚拟用户等待到一个点,同时触发一个事务,以达到模拟真实环境下同时多个用户操作,同时模拟负载,实现性能测试的最终目的

    系统压力最大的情况是:所有用户都集中到系统瓶颈的某个点上进行操作,从脚本的角度来讲,这个点就是执行脚本的某一条或一段语句,为了真实模拟这个最坏的情况,查看系统在最坏情况下的反映,LOADRUNNER提供了集合点的功能,帮助测试人员实现真正意义上的并发.

    使用LOADRUUNER实现集合点功能的方法如下:

    n         在脚本准备访问的语句上面插入一个空白行,并将光标移到该空白行上;

    n         选择INSERT|RENDEZVOUS命令,系统弹出RENDEZVOUS对话框,

    n         输入集合点名称后点击OK按钮.

    系统会自动在脚本中插入下面语句

    LR_RENDEZVOUS(“集合点名称”)

    这样的脚本在运行的时候,就可以在集合点处实现真正的并发了.运行带有集合点的脚本时可以在SCENARIO GROUP列表的RENDEZ一栏看到虚拟用户的聚集过程.

    需要说明的是,这部分内容仅介绍了如何在LOADRUNNER的脚本中插入集合点,LOADRUNNER允许测试人员对集合点的执行过程进行更详细的设定,如聚集的用户数,系统等待时间和等待策略等.

    Ø         脚本参数化

    让所有用户都使用相同的数据来运行,对系统造成的压力与实际情况会有所不同.而对于那些禁止一个用户多次登陆的系统,也就严重到无法测试的地步了.为了解决这个问题,让系统更加真实的模拟多用户使用的实际环境,LOADRUNNER提供了对脚本进行参数化输入的功能;

    所谓的脚本参数化,就是针对脚本中的某些常量,定义一个或多个包含数据源的参数来取代,让场景中不同的虚拟用户在执行相同的脚本时,分别使用参数数据源中的不同数据代替这些常量,从而达到模拟多用户真实使用系统的目的.

    n         确定需要参数化的常量

    打开脚本后,首先要确定哪些常量需要参数化;

    n         准备数据

    既然是使用多组数据来替换常量,就需要在使用参数替换常量之前,针对性的准备一些模拟真实情况的数据.LOADRUNNER允许多种类型的数据源,如DAT的文本文件,电子表格,来自ODBC的数据库数据和其他系统提供的数据源等,每种类型的数据源都要求了不同的格式,这些在LOADRUNER的帮助文件中都有详细的说明;

    n         对脚本进行参数化

    在脚本中用鼠标选中要参数化的常量,然后单击鼠标右键,在弹出的快捷菜单中选择REPLACE WITH A PARAMETER命令,系统弹出SELECT OR CREATE PARAMETER对话框.通过这个对话框可以选择一个已经存在的参数,还可以根据需要创建一个新的参数.

    单击PROPERTIES按钮,可以在PARAMETER PROPERTIES 对话框中设定脚本执行时参数的详细替换方式,不同的数据源类型的属性设定对话框的内容也会有所不同.

    n         注:参数化输入只能用于函数中的参数,不能用参数代替非函数中的常量参数;

    Ø         插入检查点

    LOADRUNNER检查点的功能主要用来验证某个界面上是否存在指定的TEXT或IMAGE等对象,在使用LOADRUNNER测试WEB应用时,可以检查压力较大时WEB服务器能否返回正常的页面。

    n         定位要检查的页面

    定位需要检查的页面,最好将脚本视图切换到TREE VIEW方式,这样就可以直观地查看到LOADRUNNER录制时获取的每个页面了。在TREE VIEW视图中用鼠标单击页面左侧列表中页面对应的URL,就能迅速查看到准备检查的页面和页面上需要检查的图象或文本信息。

    n         插入文字检查点

    选择相应的URL,单击鼠标右键,在系统弹出的菜单中选择INSERT AFTER或INSERT BEFORE命令,在URL的脚本前面或后面插入函数,在ADD STEP对话框中可以插入很多的函数,如果想为WEB应用插入图像或文本检查点,需要选择WEB CHECKS下面的IMAGE CHECK或TEXT CHECK,

    在系统弹出的检查点属性对话框中,输入要查询的文字或图像名称后,系统会自动在TREE VIEW视图中的树型列表中插入类似的STEP。

    LOADRUNNER 还允许对要检查的文字内容和图像名称进行参数化,参数化的过程可以在插入检查点的 过程中实现,还可以在插入之后重新打开脚本实现。要想在插入检查点时就直接实现参数化,只需要在设置被检查对象的名称时单击ABC按钮,创建或选择参数输入就可以了。

    n         设定与检查点有关的选项

             系统在执行时是否起用检查点,是由一个系统参数控制的,该参数的设定方法为:VUSER|RUN-TIME SETTINGS|PREFERENCES,如果想让检查点起作用,需要选中ENABLE IMAGE AND

            TEXT CHECK 复选框。

    n         查看检查点是否通过

    脚本运行结束后,要想查看检查点是否通过,可以在TREE VIEW视图下,用鼠标右键单击检查点步骤,选择GO TO STEP IN EXECUTION命令,则系统自动将光标定位到执行日志中获取检查点结果的一行上。

    Ø         RUN-TIME SETTINGS

    选择VUSER|RUN-TIME SETTINGS 命令,可以设定VIRTUAL USER GENERATOR中和脚本相关的一些运行时参数;

    n         ITERATION COUNT(重复次数)

    入口:GENERAL|RUN LOGIC;

    参数说明:设定每个ACTION的重复执行次数;

    需要注意的是,DURATION参数是优先于ITERATION的,举例说明,假定将DURATION设为5分钟,即使在RUN-TIME中将INRATIONS参数设为1,虚拟用户也会在5分钟之内进行尽可能多的反复执行脚本,在限定了DURATION的场景中,DURATION时间是从所有用户状态变为INIT开始计算的,这样就存在一个问题,有些初始化过程很长的用户,可能还没有到达RUN状态就因DURATION时间限制而中止了,要解决这个问题,测试人员可选择INITIALIZE ALL VUSERS BEFORE RUN选项,这样DURATION时间会在所有用户都到达RUN状态后开始计时.

    n         THINK TIME

    THINK TIME参数设定入口:GENERAL|THINK TIME

    参数说明:设定脚本回放时对思考时间的处理方式.

    IGNORE THINK TIME:

    选择该选项,脚本回放时将不在执行LR_THINK_TIME()函数,这样会给服务器造成更大的压力.

    REPLAY THINK TIME:

    选择该选项,脚本回放时执行LR_THINK_TIME()函数,

    1,按录制时获取的THINK TIME值回放脚本;

    2,按照录制时获取值的整数倍回放脚本;

    3,限定一个最大和最小的比例,按照两者之间的随机值回放脚本;

    LIMIT THINK TIME TO:

    用于限定THINK TIME 的最大值,脚本回放过程中,如果发现有超过这个值的,用这个最大值替代;

    n         ERROR HANDLING

    入口:GENERAL|MISCELLANEOUS

    参数说明:设定遇到错误时的处理方式

    1,CONTINUE ON ERROR,遇到错误继续运行;

    2,FAIL OPEN TRANSACTIONS ON LR_ERROR_MESSAGE,

    执行到事务中调用的LR_ERROR_MESSAGE()函数时将事务的结果置为FAILED

    3,GENERATE SNAJPSHOT ON ERROR对错误进行快照.

    n         MULTITHREADING

    设定脚本运行方式;

    入口:GENERATOR|MISCELLANEOUS

    1,RUN VUSER AS A PROCESS,以多进程方式运行;

    2,RUN VUSER AS A THREAD,以多线程方式运行;

    4.在 LoadRunner 脚本中做关联 (Correlation)
    Ø         自动关联---- Rules Correlation

    可以自动找出需要关联的值,并且自动使用关联函数建立关联。

     

    在录制过程中VuGen会根据订定的规则,实时自动找出要关联的值。

    1.        启用auto-correlation

    n         点选VuGen的【Tools】>【Recording Options】,开启【Recording Options】对话窗口,选取【Internet Protocol】>【Correlation】,勾选【Enable correlation during recording】,以启用自动关联。

    n         假如录制的应用系统属于内建关联规则的系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,请勾选相对应的应用系统。

    n         或者也可以针对录制的应用系统加入新的关联规则,此即为使用者自订的关联规则。

    n         设定当VuGen侦测到符合关联规则的数据时,要如何处理:

    u       【Issue a pop-up message and let me decide online】:跳出一个讯息对话窗口,询问您是否要建立关联。

    u       【Perform. correlation in sceipt】:直接自动建立关联

    2.        录制脚本
    开始录制脚本,在录制过程中,当VuGen侦测到符合关联规则的数据时,会依照设定建立关联,您会在脚本中看到类似以下的脚本,此为BroadVision应用系统建立关联的例子,在脚本批注部分可以看到关联前的数据为何。

    3.        执行脚本验证关联是OK的。

    Ø         自动关联----Correlation Studio

    当录制的应用系统不属于VuGen预设支持的应用系统时,Rule Correlation可能既无法发挥作用,这时可以利用Correlation Studio来做关联。

    Correlation Studio会尝试找出录制时与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。

    使用Correlation Studio的步骤如下:

    1.         录制脚本并执行;

    2.        执行完毕后,VuGen会跳出下面的【Scan Action for Correlation】窗口,询问您是否要扫描脚本并建立关联,按下【Yes】按钮。

    3.        扫描完后,可以在脚本下方的【Correlation Results】中看到扫描的结果。

    4.        检查一下扫瞄的结果后,选择要做关联的数据,然后按下【Correlate】按钮,一笔一笔做,或是按下【Correlate All】让VuGen一次就对所有的数据建立关联。
    注意:由于Correlation Studio会找出所有有变动的数据,但是并不是所有的数据都需要做关联,所以不建议您直接用【Correlate All】。

    5.        一般来说,您必须一直重复步骤1~4直到所有需要做关联的数据都找出来为止。因为有时前面的关联还没做好之前,将无法执行到后面需要做关联的部份。

    Ø         手动关联

    有可能有些需要做关联的动态数据,连Correlation Studio都无法侦测出来,这时您就需要自行做手动关联了。

    5.试运行脚本
    脚本录制完毕后,按F5键或单击菜单上的RUN按钮,可以运行脚本,在VIRTUAL USER GENERATOR中运行脚本的作用,主要是查看录制的脚本能否正常通过,如果有问题,系统会给出提示信息,并定位到出错的行上,便于用户查找到错误,修改完善测试脚本,运行结束后;系统会给出相应的运行结果.

    6.保存脚本
    LOADRUNNER的测试脚本在资源管理器中是以目录的形式存储的,目录名称就是LOADRUNNER识别的脚本名称.

    四、MERCURY LOADRUNNER CONTROLLER创建场景
    进行压力负载测试时,测试人员的工作就是了解被测应用的性能需求,从应用程序中找出一个或多个性能测试点,然后针对这些性能点分别进行测试,获取相关的性能指标结果,分析被测应用,追溯性能问题产生的根源.要使用LOADRUNENR实现这一过程,就需要针对这些性能点建立一个个的场景,因此,LOADRUNNER的每个场景都定义了一个在性能测试活动中发生的事件,它能控制虚拟用户的数量,测试脚本和运行脚本的LOAD GENERATOR.对于有经验的测试人员来说,定义场景是在计划阶段进行的,它优先于脚本的录制过程,并指导脚本的录制。只不过计划阶段的场景只能限于纸面上,要想让LOADRUNNER这个测试工具实现自动的负载测试,需要在CONTROLLER中建立实实在在的场景。

    对于有经验的测试人员来说,定义场景是在计划阶段进行的.它优先于脚本的录制过程,并指导脚本的录制。只不过计划阶段的场景只限于纸面上,要想让LOADRUNNER这个测试工具实现自动的负载测试,需要在CONTROLLER中建立实实在在的场景。

    1.选择场景类型
    每次在CONTROLLER中创建一个场景的时候,系统会首先让用户选择场景的类型。LOADRUNNER为用户提供了面向目标和手工设置的两种场景策略,具体选择哪一种要根据具体的项目需求来定。

    Ø         MANUAL SCENARIO这种方式是完全手动设置,测试人员需要手工设定虚拟用户数,SCHEDULE和LOADGENERATOR等

    Ø         MANUAL SCENARI WITH PERCENTAGE MODE 这种方式与MAMUAL SCENARIO方式比较相似,只是在分配用户数的方式有所不同

    1,后者需要设定TOTAL NUMBER OF VUSERS,即所有虚拟用户数;

    2,后者需要为每个脚本分配用户数比例,由系统按照比例自动分配用户数;

    3,后者脚本选择LOADGENERATOR时,除了可以选择单个的LOAD GENERATOR外,还可以设置为ALL LOAD GENERATOR,即使用所有的LOADGENERATOR。

    由于这种方式没有用户组的概念,因此在设置SCHEDULE时,不能按组设置,只能按整个场景设置,

    Ø          GOAL-ORIENTED SCENARIO

    这种方式是基于目标自动创建场景的方式,测试人员只要输入性能测试所要达到的目标,LOADRUNNER就会自动根据目标安排场景的运行;

    采用GOAL-ORIENTED SCENARIO方式创建场景时,需要单击EDIT SCENARIO GOAL按钮定义场景目标,CONTROLLER在执行的时候会根据场景目标的要求,自动加载用户,控制场景的运行;

    n         VIRTUAL USERS  

    以虚拟用户数作为目标,当一个应用对用户数要求比较高时,可以使用这种方式来测试一个应用程序能够允许多少个用户同时运行。基于用户数目标的原理和设定方法比较简单,他和MANUAL SCENARIO WITH PERCENTAGE MODE 方式基本相似,只需要定义要求达到的用户数就可以了。从某种意义上讲,它还不能体现面向目标类型的优势。

    n         HITS PER SECOND,以每秒点击数作为目标,

    n         TRANSACTIONS PER SECOND,以每秒事务数作为目标,

    n         PAGES PER MINUTE,以每分钟页数作为目标,

    以上三种类型都需要用户指定虚拟用户数的范围,CONTROLLER在运行场景的时候,首先加载最小的用户数,如果使用最小的用户数不能达到目标,系统会自动逐渐增加用户直到能够达到设定的目标为止。当加载的用户数达到最大值仍然不能满足要求时,就需要重新设置场景,增加最大用户数。可以通过LOAD BEHAVIOR选项设定三种不同的用户加载策略,如果没有达到目标,LOADRUNNER会重新运行场景,一次加载最大的用户数,尝试是否能够达到目标,如果出现如下情况之一,场景的运行结果都会置于FAILED状态,

    CONTROLLER两次加载了最大的用户数都没有达到目标;

    在运行过程中所有的用户都失败了;

    LOAD GENERATOR数目不能满足要求;

    CONTROLLER在增加用户的过程中,性能指标没有增加;

    CONTROLLER在加载第一批用户后,没有捕获到指标的值;

    n         TRANSATIONS RESPONSE TIME,以事务响应作为目标,

    主要用于衡量要达到预期的事务响应时间,系统所容纳的最多用户数,如果系统已经加载了最大的用户数,响应时间仍然低于设定的值,说明系统还有能力容纳更多的用户,如果使用一部分用户就达到了设定的响应时间,说明系统是无法容纳设定的最大数量的用户的,必须通过完善应用程序来达到目的;

    2.多机联合产生负载
          LOADRUNNER对应用程序施压时,采用的方法就是让一台机器模拟很多用户,同时向被测用户发送请求或进行操作。这样,如果一台测试机器模拟的虚拟用户数过多,他本身性能的下降会直接影响测试效果。为了避免这种情况,LOADRUNNER允许使用多台机器运行场景来均衡测试机器的负荷。只要一台机器安装了LOAD GENERATOR并启动了LOADRUNNER AGENT PROCESS进程,就可以被CONTROLLER统一调度来运行场景,CONTROLLER负载收集统一的测试信息和执行结果。

    Ø          安装LOAD GENERATOR,如果一台测试机仅用来被CONTROLLER调用执行场景,只需安装LOAD GENERATOR就可以了。方法是在LOADRUNNER安装首页选择LOAD GENERATOR选项。需要注意的是,LOAD GENERATOR的服务启动后,屏幕右下角的任务栏上会显示一个代理(AGENT)的图标;

    Ø         在CONTROLLER中创建LOAD GENERATOR

    CONTROLLER进行多机联合产生负载之前,首先要加载准备使用的LOAD GENERATOR,单击场景设定对话框中的GENERATORS按钮,系统会弹出LOAD GENERATORS对话框;在LOAD GENERATOR

    对话框中可以查看到所有已经加载的LOAD GENERATOR信息。

    n         NAME:LOAD GENERATOR所在的机器名称。如果是LOCALHOST,表明这个GENERATOR是在本机上;

    n         STATUS:标识了GENERATOR目前的状态,

    n         PLATFORM:显示了系统的平台名称;

    n         单击ADD可以添加新的LOAD GENERATOR;添加LOAD GENERATOR后,一般要测试CONTROLLER能否正确连接到这个GENERATOR,单击CONNECT按钮,LOADRUNNER的CONTROLLER就会尝试去连接选中的LOAD GENERATOR,如果连接成功就在STATUS字段中显示READY,如果失败就会显示FAILED。

    Ø         在场景中用不同的LOAD GENERATOR联合产生负载

    创建好LOADGENERATOR以后,在CONTROLLER的LOAD GROUPS列表中就可以选择使用了,

    使用多个LOAD GENERATOR运行场景的时候,可以让不同的虚拟用户组在不同的机器上运行,分解了CONTROLER本身的压力,更能体现系统真实的运行环境;

    3.设定集合点策略
        LOADRUNNER在运行场景的时候,允许测试人员根据项目需要自己设定集合点的并发策略,要设定一个集合点以何种方法运行,在创建或打开脚本中包含集合点的场景时,选择SCENARIOI|RENDEZVOUS命令,可以查看场景中所有脚本中的集合点名称,所属脚本,当前状态和相关的虚拟用户列表信息等,根据系统需求,还可以针对集合点的执行进行设定。

    Ø          单击DISABLE/ENABLE RENDEZVOUS按钮可以选定集合点是否启用;

    Ø          单击DISABLE/ENABLE VUSERS按钮可以设定一个用户是否参与到集合点中;

    Ø          单击POLICY按钮可以设定集合点执行策略。

    n         在POLICY对话框中的TIMEOUT BETWEEN VUSERS文本框中设定了一个超时时间,当第一个用户到达集合点时,系统开始计时。如果在这个设定的时间内没有达到要求的集合点用户数,系统就不在等待,释放用户让场景继续执行;

    4.启用IP欺骗
        LOADRUNNER进行压力负载测试的时候,是让一台机器模拟成百上千的用户对服务器施压,这样就产生了一个问题,那就是所有用户向服务器发起请求的时候,使用的都是同一个IP地址,即LOAD GENERATOR所在机器的固定IP地址,这是和实际运行环境不符的,而且有些应用系统在设计的时候会根据IP来分配资源,有些还限制同一个IP的多次登陆过程。LOADRUNNER为了解决这个问题,使用了一种称为“IP欺骗(IP SPOOFER)”的技术。也就是让一个LOAD GENERATOR上的虚拟用户模拟从不同的IP来向服务器发起请求,以达到以假乱真的目的。

    Ø          配置IP SPOOFER

     LOADRNNER配置动态IP的工具是程序组中的一个小工具-IP WIZARD,它能够指导用户按步骤完成配置过程,这里有三个单选按钮;

    第一个单选按钮CREATE NEW SETTING,用于创建一个新的设置,首次运行时选用;

    第二个单选按钮LOAD PREVIOUS SETTING FROM可以调用以前保存的设置;

    第三个单选按钮RESTORE ORIGINALSET不是用来创建动态IP,而是将设置恢复为原始状态,这个选项主要用于使用后释放IP,如果使用完毕后不释放IP的话,那么这些IP会被一直占用,别人就无法使用了。

    Ø         输入WEB SERVER的IP地址,这里主要用来检测新的IP地址加到主机中后,SERVER的路由表是否需要更新,如果SERVER和CLIENT使用的是相同的子网掩码,IP CLASS类型和网络,是无需更新的;

    Ø         在添加新的动态IP的时候,需要注意如下几个选项的含义:

    n         PRIVATE ADDRESS SPACES:选择测试环境的IP地址类型,关于IP地址类型的定义

    n         FROM IP:要使用IP段的第一个值;

    n         NUMBER TO:要使用的IP地址的数目。

    n         SUBMASK:子网掩码,一般采用默认设置就可以了;

    如果选中VERIFY THAT NEW IP ADDRESS ARE NOT ALREADY IN USE复选框,系统会在所选范围内检测每个IP地址,为了避免冲突,LOADRUNNER只添加那些没有被其他用户使用的IP地址。

    如果已经预先知道选择范围内的某些地址可能被占用,那么在NUMBER TO文本框中输入的IP地址的个数就要有相应的增加。

    Ø         起用IP欺骗

    在CONTROLLER窗口中,选择SCENARIO|ENABLE IP SPOOFER命令,就可以起用IP欺骗了,在IP欺骗启用后,在CONTROLLER状态栏中会显示相应的状态标识;

    Ø         在OPTIONS中设置IP地址的分配方式;

    创建虚拟IP地址之后,还要选择TOOLS|OPTIONS命令,在弹出的对话框中单击GENERAL标签以设定IP地址的分配方式;

    n         IP ADDRESS ALLOCATION PER PROCESS:给每个进程分配不同的IP地址;

    n         IP ADDRESS ALLOCATION PER THREAD: 给每个线程分配不同的IP地址;

    一般来说,如果在RUN-TIME SETTING中设置的是以多线程的方式运行,则这里就给每个线程分配不同的IP地址。如果在RUN-TIME SETTING中设置的是以多进程的方式运行,则这里给每个进程分配不同的IP地址;

    注意:只有在CONTROLLER中选择TOOL|EXPERT MODE 命令,才能在OPTIONS对话框中包含设定IP分配的选项;

    5.使用测试管理工具进行统一管理
        LOADRUNNER和MERCURY QUALIY CENTER的完美结合,给用户组织和管理LOADRUNNER的测试脚本,场景和测试数据带来了极大的便利。QUALITY CENTER是MERCURY 提出的针对质量保证的解决方案。只要将LOADRUNNER连接到基于WEB的QUALITY CENTER,则场景的存储执行和测试结果的收集就会随时随地被MERCURY QUALITY CENTER的测试项目进行有效的管理;

    Ø          连接到QUALITY CENTER

    要想让LOADRUNNER使用一个QUALITY CENTER 对测试内容进行管理,首先必须通过URL连接到QUALITY CENTER,这个QUALITY CENTER 既可以是安装在本地的局域网上,也可以是通过广域网访问的测试管理平台;

    在CONTROLLER模块中,选择TOOLS|QUALITY CENTER CONNECTION 命令,弹出QUALITY CENTER

    CONNECTION 对话框,在SERVER文本框中输入安装了QUALITY CENTER的WEB服务器的URL地址,单击CONNECT按钮,系统会试图建立对QUALITY CENTER服务器的连接,如果连接建立成功,则会在PROJECT CONNECTION 一栏显示QUALITY CENTER的项目;

    在PROJECT CONNECTION 一栏输入相关的内容,即选定要连接的测试管理项目,单击CONNECT按钮,系统开始对相应的项目建立连接。一旦建立成功,则QUALITY CENTER的项目信息就变为只读状态;

    Ø         断开服务器或项目

    在连接状态中,可以随时单击DISCONNECT 按钮断开QUALITY CENTER服务器或项目的连接;

    Ø         打开/保存测试项目场景

    如果LOADRUNNER正在连接到一个测试管理工具上,那么在保存和打开场景的时候,系统弹出的对话框会有所不同,如果仍然希望在文件系统中打开/保存场景,可以单击对话框中的FILE SYSTEM按钮进行切换;关于测试管理工具如何管理和调用LOADRUNNER的场景,请参考TD。

    6.控制场景的运行
    在CONTROLLER中单击START SCENARIO按钮开始执行场景以后,LOADRUNNER首先检查场景的配置信息,并激活被测应用,然后将虚拟用户分配到相应的LOAD GENERATOR上。当虚拟用户准备好以后就开始对被测应用施压,在施压的同时LOADRUNNER会完成如下的操作;

    1)        记录在脚本中定义的每个事务的执行时间;

    2)        执行脚本中定义的集合点的功能;

    3)        收集每个虚拟用户发出的告警,错误和提示信息;

    在场景执行过程中,学员可以查看虚拟用户发出的各种信息,可以随时停止一个用户或多个用户组的执行,可以让LOADRUNNER命令某些用户和用户组在场景执行结束前进行重复操作等。

    Ø         初始化用户组

    单击START SCENARIO 按钮执行场景时,虚拟用户并没有立刻执行脚本,而是首先执行一个初始化过程,初始化完毕的用户状态会变为READY,只有状态为READY 的用户才能真正开始执行脚本。由于各种条件的限制,场景中用户的初始化过程是无法达到完全同步的,这就造就了用户无法同时运行测试脚本。为了让用户能够同时对被测应用施压,LOADRUNNER提供了初始化用户组的策略,让所有用户在执行脚本之前全部变为READY 状态。

    初始化用户组的方法是在开始运行场景之前,先在RUN选项卡中选中要初始化的用户组,然后单击工具栏的INITIALIZE THE SELECTED VUSERS按钮,或者单击鼠标右键,在弹出的菜单中选择INITIALIZE GROUPS命令,如果初始化成功,用户状态变为READY,如果失败,用户的状态就会变为ERROR。

    Ø         停止场景的运行

         一个场景会在以下三种情况停止运行:

    1)        所有用户都执行完脚本;

    2)        测试人员手动停止了场景的运行;

    3)        执行超时;

    LOADRUNNER可以根据用户的设定,采用不同的停止方式;

    1)        要手动停止整个场景的运行,只需在场景运行过程中单击RUN标签中的STOP按钮即可。

    2)        如果希望选定的用户组停止执行,可以单击工具栏的STOP VUSERS按钮;

    3)        如果OPIONS的RUN-TIME SETTING中设定了WAIT FOR CURRENT INTERATION TO END BEFORE STOPPING 或者WAIT FOR CURRENT ACTION TO END BEFORE STOPPING ,那么可以单击GRADUAL STOP按钮逐渐停止场景的运行;

    Ø         对正在运行的场景增加用户数

    在场景运行的时候,还可以在RUN/STOP VUSER对话框中增加用户,对话框的内容会根据所选择的模式的不同而有所不同。如果使用的是VUSER GROUP MODE,则在RUN/STOP VUSERS对话框的“#” 一栏中为每个用户组输入新的用户总数后,单击“RUN”按纽,系统会自动初始化新增加的用户数并开始运行;如果使用的是PERCENTAGE MODE,那么只要输入用户总数,系统会根据比例自动分配新的用户到不同的组中。

    五、MERCURY LOADRUNNER CONTROLLER监视场景
        影响事务响应时间的一个主要因素就是系统资源和应用服务器的使用情况。通过监视场景执行时的系统和服务器资源,基本能够确定系统的瓶颈在哪里。下面简单介绍通过添加性能计时器来监视各个服务器的运行情况,确定系统的瓶颈;

    1. 在线监视场景
       LOADRUNNER允许测试人员在场景的执行过程中在线查看产生的性能数据,除了监视本机的性能指标外,CONTROLLER还允许用户在线监视服务器的性能;

       使用CONTROLLER监视场景之前,需要定义和配置LOADRUNNER的监视组件,根据监视指标的不同,相应的配置过程和参数也完全不同,要想完成监视组件的配置过程,测试人员除了掌握LOADRUNNER的使用以外,更重要的是要对被监视的服务器中的应用相当熟悉。

      一般来说,在监视一个服务器之前,要经过如下两个步骤:

    1)        在服务器端配置被监视服务器的监视环境;(有些指标不需对服务器进行特殊配置)

    关于如何配置服务器端监视环境,由于不同类型的指标配置方法也不尽相同,需要测试人员熟悉被测应用的系统架构,并查阅相关的LOADRUNNER文档;

    2)        在LOADRUNNER的CONTROLLER中配置要监视的MONITOR;

    在LOADRUNNER CONTROLLER中,对监视指标进行了分类,具体的分类方式及每个类别包括的性能指标在RUN 视图的AVALIABLE GRAPHS列表中都有详细的说明。 

    Ø         添加计数器

    很多服务器(DATABASE SERVER,WEB SERVER等)和系统资源的性能指标数据,是通过手动在CONTROLLER中添加计数器来实现的;下面来介绍如何在CONTROLLER中添加性能计数器。注意的是,使用不同的操作系统,计数器会不完全相同;

    在AVAILABLE列表中,单击要监视的图表,选择MONITOR|ADD MEASUREMENTS;或者在AVAILABLE GRAPH中先将准备监视的指标拖至右侧图表栏中,然后用鼠标右键单击该图表,在弹出的快捷菜单选择ADD MEASUREMENTS,系统会自动弹出相应的监视服务器对话框;单击上部的ADD按钮,在MONITORED SERVER MACHINES中添加要监视的服务器名称(或IP地址)和相应的系统平台;单击下部的ADD按钮在RESOURCE MEASUREMENTS ON列表中添加相应的计数器,这里可以选择一个或多个性能指标。如果添加成功的话,场景运行的时候,就可以在线监视所选择的指标数据了

    注意:必须以被监视机器的管理员身份登陆到CONTROLLER所在机器,才能添加被监视机器的性能计数器;

    Ø         常见的计数器

    1)        MEMORY相关,内存问题主要检查应用程序是否存在内存泄露,如果发生了泄露,PROCESS\PRIVATE BYTES计数器和PROCESS\WORKING SET计数器的值往往会升高,同时AVALIABLE BYTES的值会降低.内存泄露应该通过一个长时间的测试来检查,主要测试当所有内存都耗尽时应用程序的反应情况;

    2)        PROCESSOR相关,判断应用程序是否存在处理器的瓶颈

    n         如果PROCESSOR QUEUE LENGTH显示的队列长度保持不变(>=2),且处理器的利用率%PROCESSOR TIME超过90%,那么很可能存在处理器瓶颈;

    n         如果发现PROCESSOR QUEUE LENGTH显示的队列长度超过2,而处理器利用率却一直很低,那么或许更应该去解决处理器的阻塞问题,处理器一般不是瓶颈;

    n         如果系统由于应用程序代码效率低下或者系统结构设计有缺陷而导致大量的上下文切换(CONTEXT SWITCHES/SEC,显示的上下文切换次数)比较大,那么就会造成大量的系统资源;

    n         如果系统吞吐量降低并且CPU的使用率很高,并且此现象发生时切换水平在1500以上,那么意味着上下文切换的次数过高;

    n         还可以比较CONTEXT SWITCHES/SEC和%PRIVILEGED TIME来判断上下文切换是否过量;如果后者的值超过40%,且上下文切换的速率也很高,那么应该检查为什么会产生这么高的上下文切换;

    3)        网络吞吐量及带宽

    BYTES TOTAL/SEC: 判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较,相除结果应该小于50%;

    4)        磁盘相关

         判断磁盘瓶颈的方法是通过以下的公式来计算:

         每磁盘的I/O数=[读次数+(4*写次数)]/磁盘个数

    如果计算的每磁盘的I/O数大于磁盘的处理能力,那么磁盘存在瓶颈;

    5)        WEB SERVER相关

     

     

    6)        数据库服务器相关

     

    2.定制图表显示方式
    Ø          定制在线监视图表个数;

    场景运行时,LOADRUNNER让用户默认在线监视4个图表,测试人员可以根据需要自己定制图表的个数:

    鼠标右键单击一个图像,在弹出的快捷菜单中选择VIEW GRAPHS(或选择VIEW|VIEW GRAPHS命令),然后选择或设定显示图象的个数就可以了;

    Ø          设定监视器选项;

         选择TOOLS|OPTION命令,在MONITORS选项卡中可以统一设定监视器的一些参数选项,

    1)        TRANSACTION  DATA

    用于监视事务图表的数据行为,这些参数不能在场景运行过程中更改,参数修改后需要重新连接虚拟用户的LOADGENERATOR才能生效;

    n         ENABLE TRASACTION MONITOR:如果选择该选项,场景启动后就自动开始监视事务,默认情况下,该选项是选中的;

    n         FREQUENCY:设定MONITOR抽样数据产生事务,获取数据点和生成网络资源在线图表的频率.默认为5秒,如果是小的场景建议使用1秒;如果大一些的场景,建议3-5秒;这个参数越低,采样间隔越小,监视图表越精确,网络工作量也就越大;

    2)        SERVER RESOURCE MONITORS

    定义了服务器资源监视器的行为,修改该选项对已经被激活的图表不起作用,只对随后被激活的图表起作用;

    DATA SAMPLING RATE:定义了服务器两次采样数据的时间间隔,默认为3秒,这个参数对所有图表都起作用,如果要对单个图表起作用,需要在单个图表的配置属性中定义,

         每个图表都有一个最小的采样频率,如果这里设定的值低于图表的最小采样频率,图表仍然使用最小的采样频率;

    3)        ERROR HANDLING

         定义了监视过程中的错误处理方式;

    n         SEND ERROR TO THE OUTPUT WINDOW:遇到错误时将出错信息输出到OUTPUT窗口;

    n         POP-UP AN ERROR MASSAGE BOX:遇到错误时弹出错误信息窗口;

    4)        DEBUG

    设定DEBUG场景的方式;

    DISPLAY DEBUG MESSAGE:选中该复选框,系统会向输出日志中发送DEBUG相关信息,定义DEBUG的等级;

    Ø          配置图表和计数器属性;

    n         设定图表属性

    如果想对一个图表单独配置显示属性,只需选择该图表,选择MONITOR|ONLINE GRAPHS|CONFIGURE命令,或者在右键单击图表后选择CONFIGURE命令,系统都会打开GRAPH CONFIGURE对话框。在该对话框中可以设定图表的数据刷新频率,X轴(时间轴)和Y轴的显示方式,显示比例等;

    n         设定计数器属性

    要设定图表中单个计数器的属性,可以用鼠标右键单击图表列表中的相应计数器,在弹出的菜单中选择CONFIGURE命令,可以设定计数器在图表中的显示颜色,显示比例和是否隐藏等;

    Ø         合并图表;

         LOADRUNNER为了便于测试人员比较两个图表数据之间的关系,提供了图表合并的功能,也就是可以将同一个场景中的两个图表中的计数器合并到一个图表中,合并以后的图表共用一个X轴。

        要合并两个图象,只需右键单击一个图表,在弹出的快捷菜单中选择OVERLAY GRAPHS命令,然后在系统提示的对话框中选择另一个图表,并为新图表命名,需要注意的是只有X轴相同的图表才能合并;

    3.其他与监视图表相关的功能
    Ø         穿越防火墙监视图表;

    为了安全起见,运行MONITOR和VUSER的机器安装了防火墙,这样处于防火墙之外的CONTROLLER在控制虚拟用户执行和监视场景的时候就会碰到一些麻烦;

    LOADRUNER通过在防火墙上使用基于HTTPS或者使用标准SSL端口(443)的安全的TCP/IP的协议来解决这个问题。使用LOAD GENERATOR机器或MONITOR机器上的代理充当通信过程的媒介,与MI LISTENER通信。 MI

    LISTENER是一个需要单独安装的LOADRUNNER组件,它服务于CONTROLLER和LOADRUNNER代理之间,

    如果未安装MI LISTENER组件,LOADRUNNER也可以穿越防火墙实现监控MONITOR和执行VUSERS,这时需要在

    LOAD GENERATOR 端和CONTROLLER端的防火墙上均打开54345端口;

    Ø         远程监视场景;

    LOADRUNNER提供了一个组件,用于同时通过多个机器上的WEB页面远程监视场景,每个监视还可以根据需要定制不同监视图表;

    要完成远程监控,需要一个远程性能监视服务器,(REMOTE PERFORMANCE MONITOR SERVER),它是一个包括很多ASP页面和性能图表过滤器的网站,和CONTROLLER交互数据,并且决定能够在线查看场景的用户数。远程性能监视服务器上必须安装LOADRUNNER的REMOTE PERFORMANCE MONITOR SERVER组件,该组件有如下系统需求:

    n          WEB SERVER: IIS5.0

    n          操作系统:WINDOWS 2000SERVER或WINDOWS 2000ADVANCED SERVER

    n          客户端浏览器:IE5.0或NETSCAPE6.2以上;

    六、使用ANALYSIS分析测试结果
         要查找系统瓶颈,就必需分析LOADRUNNER获取的性能指标数据,在LOADRUNNER场景运行的同时获取了大量的数据,可以根据以下几种方式分析这些数据:

    1)        查看VUSER LOG文件,这些文件包括了场景运行过程中每个用户的跟踪数据,VUSER LOG文件一般放在脚本目录中;

    2)        在CONTROLLER的OUTPUT窗口查看场景的执行过程信息;

    3)        使用ANALYSIS模块分析执行结果图表;

    4)        使用SPREADSHEET直接查看生成图表的原始数据---GRAPH  DATA或者RAW DATA;

    5)        让LOADRUNNER自动生成HTML或WORD格式的测试报告,通过报告分析;

    LOADRUNNER的ANALYSIS模块是分析系统的性能指标的一个主要工具,它能够直接打开场景的执行结果文件,将场景数据信息生成相关的图表进行显示.ANALYSIS集成了强大的数据统计分析功能,允许测试员对图表进行比较和合并等多种操作,分析后的图表能够自动生成需要的测试报告文档;ANALYSIS作为LOADRUNNER的一个主要模块,是帮助测试人员分析系统性能瓶颈的得力助手;

    1、 使用ANALYSIS分析测试结果
    场景运行完毕,在结果目录下会自动保存一个扩展名为LRR的结果文件,ANALYSIS能够打开这个结果文件,加载时自动处理LRR文件内的结果信息,并自动生成相应的结果图表;

    每次对结果信息进行处理的时候,ANALYSIS是在一个开启的会话内进行工作的。每个会话至少包括一套场景结果(即一个LRR文件)。在ANALYSIS中对结果信息进行另存的时候,除了重新保存数据自身信息外,还保存了结果数据在ANALYSIS中实现的显示方式和层次关系,以及哪些图表被激活等信息,这时保存的文件扩展名为LRA,

    Ø         打开分析图表;

    除了系统提示的默认的图表外,测试人员还可以查看其他包含数据的图表,方法是:在左侧的图表列表中双击NEW GRAPH,弹出OPEN A NEW GRAPH对话框,对话框中所有名称为篮色的图表均为包含数据的图表;

    选中后单击OPEN A NEW GRAPH按钮即可以添加到主窗口中;

    Ø         使用ANALYSIS分析结果图表;

         加载场景运行结果文件(.LRR)后,ANALYSIS就可以根据需要对相关的性能指标进行分析了.首次加载结果文件后可以看到,在ANALYSIS中包含了很多图表,也同时说明了LOADRUNNER在场景运行过程中获取了很多和性能相关的数据;针对每一个被测应用来说,到底哪个性能指标是影响性能的关键了.了解常用的性能指标,熟悉使用ANALYSIS分析工具分析测试结果是确定系统瓶颈的关键.再次强调,不同的应用程序,影响其性能的因素也不同,要分析被测软件的性能因素,首先要熟悉被测软件的技术架构;

         LOADRUNNER除了将获取的原始数据形成直观的图表外,还对数据进行了一些统计,,例如在多数分析图表下方的图例列表中,给出了最大值,最小值,平均值,中间值和STD等一些统计字段,便于用户分析;

         STD是一个统计学概念,称为标准偏差值,是用来衡量数据的偏离程度的.当平均值不多时,可以从STD指标看出统计图表列数据到底是分散还是集中的.STD越小表示图表的列数据越集中,拿AVERAGE RESPONSE TIME来说,也就表示每个虚拟用户单一的响应时间值大致是差不多的,即被测系统的反应很稳定,没有大起大落;

    1)        TRANSACTION  PERFORMANCE SUMMARY

    可以基本确认哪个事务的响应时间比较长,一般来说,响应时间长的事务是分析的重点;

    2)        AVERAGE  TRANSACTION RESPONSE TIME

         可以详细查看每个事务在场景运行中的响应时间,

    3)        WEB PAGE BREAKDOWN

    用于分解页面,查看页面中哪些组件导致事务的响应时间比较长,

    n         DNS RESOLUTION时间     DNS服务器解析IP地址的时间,这个度量时间可以确定DNS服务器或者DNS服务器的配置是否有问题,如果DNS运行正常,这个值一般比较小;

    n         CONNECTION时间    浏览器和WEB SERVER建立初始化连接的时间,这个度量可以判断网络情况,也可以判断WEBSERVER是否响应这个请求;

    n         SSL HANDSHAKING 时间     建立SSL连接的时间,使用SSL协议页面比较少,一般应用在HTTPS通信;

    n         FTP AUTHENTICATION时间     FTP服务器在处理客户端的命令之前,首先要对客户端进行鉴权,这个度量就是FTP服务器对客户端进行鉴权的时间;

    n         FIRST BUFFER时间    指连接建立成功后,从WEB SERVER发出的第一个数据包经过网络传输到客户端,浏览器成功接受到第一个字节的时间.这个度量既包括WEB SERVER的延迟时间,也包括了网络的反应时间.

    n         RECEIVE时间   从浏览器收到第一个字节起,直到成功收到最后一个字节,所经历的时间.这个度量和组件大小结合,可以判断网络的质量;

    n         CLIENT时间   指请求在客户端的延迟时间,这个延迟可能是浏览器的THINK TIME等引起的

    n         ERROR时间    指从发送HTTP请求到HTTP错误信息返回的时间;

    4)        TIME TO FIRST BUFFER BREAKDOWN

    可以将页面或组件的时间分解为服务器时间和网络时间,帮助测试人员判断问题缘由到底是服务器还是网络存在瓶颈;

    5)        THROUTPUT

         可分析整个压力测试过程中WEB SERVER的吞吐量,即虚拟用户在测试过程中各时刻从服务器上接收到的数据量.

    6)        DOWNLOAD COMPONENT SIZE

    页面元素的大小分解和比较

    7)        WINDOWS  RESOURCE

    系统资源图表,可以监视服务器端的系统资源使用情况,从而判断服务器的CPU,内存等是否是导致性能降低的原因;

    Ø         关于分析图表的几个选项

    n         自动整理合并结果

    在使用ANALYSIS分析场景结果之前,首先要明确结果文件中收集了哪些信息,默认情况下,各个虚拟用户的执行结果数据都是存放在各个虚拟用户所在的机器上的,场景执行结束后,才被系统自动整理合并后放置到结果目录下,LOADRUNNER是否执行这个整理合并操作是受CONTROLLER中的AUTO COLLATE RESULTS选项控制的。该选项设定方法是在RESULTS下选择AUTO COLLATE RESULTS复选框;

    n         设定收集结果信息方式 

    对于结果文件大于100MB的大型场景,ANALYSIS加载结果数据时会耗费很长时间,测试人员在等待全部数据加载的同时可以首先查看结果的概要数据,这样,在测试人员浏览概要信息的时候系统会陆续加载其他详细信息数据;

    测试人员可以根据需要设定是否产生概要数据,以及以何种方式显示结果信息,设定入口:菜单 TOOLS|OPTION|RESULT COLLECTION ,

    在DATA SOURCE一栏有三个选项供测试人员选择;

    只生成概要数据;只生成全部详细数据;在生成全部详细数据的同时显示概要数据;

    n         设定数据聚集粒度

    n         使用系统自动聚合的公式自动聚合数据 ;

    n         使用系统自动聚合公式只对WEB数据进行聚合;

    n         单击AGGREGATION CONFIGURATION自己定义聚合方式 ;

    2、使用ANALYSIS技巧
    Ø         查看图表技巧

    1)        将鼠标放置到图表上需要放大部分的起始位置,然后按住鼠标左键拖动,松开鼠标后鼠标圈住的矩形部分的图表放大显示,便于用户查看图表细节;

    2)        在图例列表中选择一个MEASUREMENT,单击鼠标右键,在系统弹出的菜单中选择CONFIGURE MEASUREMENT命令,之后就可以设定显示颜色和比例,通过设定比例,可以让不同数量级的数据都在图表的主要区域显示,使每个图表的趋势都很明显;

    3)        在图例列表中单击鼠标右键,选择CONFIGURE COLUMN,可以设定在图例列表包含哪些列,以及表格中的图例如何排序等;

    4)        在图表中单击鼠标右键,选择SET FILTER/GROUP BY,可以筛选图表中要显示数据和数据的分组方式;

    Ø         分析图表技巧

    1)        向下钻取图表

    选中一个图表中的某条折线,单击鼠标右键后选择DRILL DOWN,可以对选定的MEASUERMENT J进行向下钻取,钻取的方向可以根据需要进行选择,要取消钻取,需要使用SET FILTER/GROUP BY功能;

    2)        查看原始数据

    在图表下面的RAW DATA或GRAPH DATA中,可以查看图表的原始数据;

    3)        自动关联图表

    在一个图表上单击鼠标右键,在弹出的菜单中选择AUTO COLLATE命令,依据提示进行设定后,系统会自动搜寻和该图表趋势有一定规律的图表,合并到该图表上,该功能便于测试人员分析指标间的联系,

    4)        合并图表

    为了便于分析指标间的相互关系,在ANALYSIS中还可以手动将两个图表合并为一个图表.两个图表合并的条件是具有相同的X轴,合并图表的方法是:在ANALYSIS中用鼠标右键单击想要合并图表重中的一个,在弹出的菜单中选择MERGE GRAPH,根据系统提示选择被合并的图表和合并方式,系统会自动生成新的合并后图表.下面是ANALYSIS图表的3种合并方式

    n         OVERLAY

    两个图表合并和共用一个X轴,左边的Y轴上标识当前图表的刻度值,右边的Y轴标识被合并图表的刻度值。当有多个图表被合并时,仍显示一个Y轴刻度,这时可以通过设定图表的显示比例让所有图表都显示在主区域;

    n         TILE

             两个图表合并后共用一个X轴,Y轴会被分为两个部分,这样合并的两个图表,看起来相对独立一些,其中一个显示在另一个的上部;

    n         CORRELATE

             在合并图表后的图表中,其中一个图表的Y轴作为合并后的Y轴,而另一个图表的Y轴作为合并后图表的X轴,这样合并的图表更能看出两个图表变化趋势之间的关系;

    Ø         使用QUALITY CENTER管理分析结果

    要分析QUALITY CENTER 中的测试结果,首先要做的就是建立到QUALITY CENTER WEB服务器和相关项目的连接;

    1)        连接到QUALITY CENTER

    在ANALYSIS模块主菜单中选择TOOLS|QUALITY CENTER CONNECTION,弹出QUALITY CENTER CONNECTION对话框,在这里建立连接和取消连接的方法;

    2)        使用QUALITY CENTER管理分析结果

         在连接的建立状态,测试人员可以选择是打开文件系统文件,还是打开保存在QUALITY  CENTER的项目中的场景执行结果文件,还可以在QUALITY CENTER中创建会话,保存结果分析文件等。

    Ø         引入外部数据

    监视场景的时候,可以通过添加计数器的方式监视服务器的系统资源,使用ANALYSIS打开场景的结果文件后,就可以对这些系统资源的数据图表进行分析.

         但有时受客观条件的限制,测试人员无法在LR场景中监视服务器系统资源,这时可以采用一个办法,就是让服务器自己监视自己的资源,并生成相应的CSV文件,当使用ANALYSIS分析结果的时候,把这些单独的CSV文件作为外部数据导入到ANALYSIS中;

         LOADRUNNER提供了ANALYSIS IMPORT DATA工具允许测试人员把一些非自身生成的数据信息引入和集成到ANALYSIS的SESSION中,引入之后,就可以使用ANALYSIS的工具对它们进行查看和分析了。

         工具入口:菜单TOOLS|EXTERNAL MONITORS|IMPORT DATA

         单击ADD FILE 按钮,输入保存的外部数据源文件后,需要在FILE FORMAT中正确选择数据源的格式,否则可能导致引入过程失败;

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangdaliang/archive/2009/08/19/4463009.aspx

  • 转:LR常见问题整理集锦

    2009-08-16 23:35:13

    1.LoadRunner录制脚本时为什么不弹出IE浏览器?

      当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。

      启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题

      提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。

      2.录制Web脚本时,生成的脚本中存在乱码该如何解决?

      录制脚本前,打开录制选项配置对话框Record-Options,进入到Advanced标签,先勾选“Support charset”,然后选择中支持UTF-8。再次录制,就不会出现中文乱码问题了。

      3.HTML-based script与URL-based script的脚本有什么区别?

      使用“HTML-based script”的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观;使用“URL-based script”模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。

      通常,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用“URL-based script”模式进行录制。

      4.为什么脚本中添加了检查方法Web-find,但是脚本回放时却没有执行?

      由于检查点功能会耗费一定的资源,因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能,必须修改运行时的配置Run-time Setting。

      进入“Run-time Setting”对话框,依次进入“Internet Protocol→Preferences”,勾选Checks下的“Enable Image and text check”选项即可。

      检查执行结果时推荐使用web_reg_find方法。

      5.运行时的Pacing设置主要影响什么?

      Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:上次迭代结束后立刻开始、上次迭代结束后等待固定时间、按固定或随机的时间间隔开始执行新的迭代。

      根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。

      6.运行时设置Log标签中,如果没有勾选“Enable logging”,则手工消息可以发送吗?

      Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。

      7.LoadRunner 8.0版本的VuGen在录制Web Services协议的脚本时一切正常,而回放时报出错误提示“Error:server returned an incorrectly formatted SOAP response”。这时说明原因引起的?

      造成这种情况的主要原因是LoadRunner 8.0的VuGen在录制Web Service协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为<?xml version=”1.0” encoding=”zh_cn”?>,因此会有上面的错误提示。

      解决方法:把“LR80WebservicesFPI_setup.exe”和“lrunner_web_sevices_path_1.exe”两个补丁打上即可解决。

    8.VuGen支持Netscape的客户证书吗?

      不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。

      9.VuGen会修改录制浏览器中的代理服务器设置吗?

      会修改。在开始录制基于浏览器的Web Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。

      10.在LoadRunner脚本如何输出当前系统时间?

      LoadRunner提供了char *ctime(const time_t *time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。

      调用语句与返回值如下示例:

    typedef long time_t;
    Action()
    {
            time_t t;
            lr_message(“Time in seconds since 1/1/70: %ld\n”,time(&t));
            lr_message(“System time and date: %s”,ctime(&t));
    }

      输出结果为:

      Time in seconds since 1/1/70: 1185329968

      System time and date:Wed Jul 25 10:19:28 2007

      11.一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?

      这种现象多是由于在“Run-time Setting”的“Browse Emulation”的设置中,勾选了“Simulate a new user on each iteration”及其下面的选项“Clear cache on each iteration”这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。

      由于脚本迭代时,init和end只能执行一次,如果每次迭代都模拟一个新的用户并清除缓存,则用户登录信息将一并清除,因此迭代时可能会发生错误。

      12.虚拟客户脚本“Run-time Setting”中的线程和进程运行方式的区别?

      如果选择“Run Vuser as a process”,则场景运行时会为每一个虚拟用户创建一个进程;选择“Run Vuser as a thread”则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选项。

      另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的“Expert Mode”,然后将Tools菜单下的“Options>General”标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。

      13.在Controller中运行Web相关测试场景时,经常会有很多超时错误提示,如何处理这类问题?

      这主要有脚本的默认超时设置引起。当回放Web脚本时,有时候由于服务器响应时间较长,会产生超时的错误。这时需要修改脚本的运行时配置。

      进入“Run-time Setting”对话框后,依次进入“Internet Protocol→Preference”。然后点击“Options…”按钮,进入高级设置对话框,可以修改各类超时设置的默认值。

      14.为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去?

      在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。

      (1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。

      (2)找到Windows关键字,Windows关键字如下所示:

      %SystemRoot%\system32\csrss.exe bjectDirectory=\Windows

      SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1

      ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2

      ProfileControl=Off MaxRequestThreads=16

      SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。

      (3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。

      通过对注册表的更改,系统将允许运行更多的线程,因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。

    15.Controller中设置了用户并发数量,但是运行时为何初始化的用户数量少于实际数量?

      主要时设置问题。在Tools→options→Run-time setting中可以设置每次最多初始化的虚拟用户。如果需要100个并发用户,则将该值设置为大于100的数值。另外,注意LoadRunner相关协议License的更新,确保使用的License能够允许所需要的并发用户数量。

      16.如何让场景的用户执行发生错误继续运行,以保证不间断进行压力测试?

      用VuGen打开虚拟用户脚本后,进入“Run-time Settings”对话框后,依次进入“General→Miscellaneous”,可以看到Miscellaneous设置中关于“Error Handling”的配置。勾选“Continue on error”即可让虚拟用户发生错误继续运行。

      17.为什么.NET虚拟用户有时不能在远程主机执行?

      主要时LoadRunner的版本问题。根据笔者的经验,如果是Microsoft Visual Studio 2005开发的虚拟用户,同时LoadRunner客户端的版本低于8.1,执行Controller的主机将会发生错误。

      因此要想正确的运行Microsoft Visual Studio 2005开发的.NET虚拟用户,客户端最好装8.1以上的版本,Controller的主机则安装8.0和8.1两个版本均可。此外,产生压力的LoadRunner客户端上预先应该安装.NET运行环境,如果Microsoft Visual Studio 2005开发的是.NET虚拟用户,则应该安装Microsoft .NET Framework SDK v2.0。

      18.测试分析结果中会统计Action时间,而实际上可能并不须要这些数据,如何只显示自己定义的用户事务?

      进入脚本的运行时设置,依次进入General→Miscellaneous。默认情况下,自动事务配置“Automatic Transactions”下有两个选项:第一个是把脚本的Action部分定义为一个事务;第二个时把脚本的每一部分定义为一个事务。去掉这两个勾选后,测试结果将会只显示自己定义的用户事务。

      19.测试结果中,Summary和平均事务响应时间图里的各个事务的最大值、平均值、最小值为什么显示不一样?

      主要是受采样时间的影响。Summary里的事务平均响应时间是根据整个场景执行过程得到的数据计算所得,最大值与最小值也是从整个场景中得到的。平均事务响应时间图主要时按照LoadRunner分析出来的采样频率来获取事务响应时间的最大值与最小值,然后计算平均值。

      可以通过“Set Granularity”来修改平均事务响应时间图的采样频率。如果把“Granularity”设为场景执行时间,则统计结果将会一致。

      20.统计结果中的总点击量Total Hits时用户的鼠标点击次数吗?

      Total Hits不时按照用户的鼠标点击次数来计算的,而是按照各个虚拟客户端向后台发起的总的请求数来进行统计的。例如在向服务器请求的一个页面中,如果该页面包含5个图片,用户只要单击鼠标就可以访问该页面,而单个虚拟用户在LoadRunner访问的点击量为1+5=6次。

      21.有些Web测试结果分析图(例如每秒返回页面数)在测试结果分析图中无法看到,如何进行配置?

      用VuGen打开虚拟用户脚本后,进入“Run-time Settings”对话框后,依次进入“Internet Protocol>Preference”,可以看到一些Web性能图配置。

      勾选上面得选项后,Controller将会在测试执行过程中生成数据,然后可在Analysis中查看相应的性能结果分析图。


  • 转:Web测试要点(功能、性能、可用性、兼容、安全)

    2009-08-14 17:24:11

    document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "\r\n\n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } }function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}一、功能测试

    1、链接测试  
    (1)、测试所有链接是否按指示的那样确实链接到了该链接的页面; 
    (2)、测试所链接的页面是否存在; 
    (3)、保证Web应用系统上没有孤立的页面(所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问)。 

    2、表单测试
    (1)、注册、登陆、信息提交等,必须测试提交操作的完整性,以校验提交给服务器的信息的正确性;
    (2)、用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等; 
    (3)、检验默认值的正确性;
    (4)、如表单只能接受指定的某些值,测试时跳过这些字符,看系统是否会报错。

    3、Cookies测试(session测试同)
    (1)、Cookies是否起作用; 
    (2)、Cookies是否按预定的时间进行保存;
    (3)、刷新对Cookies有什么影响。 

    4、设计语言测试
    (1)、使用哪种版本的HTML;
    (2)、验证不同的脚本语言。例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等。

    5、数据库测试
    (1)、数据一致性错误:主要是由于用户提交的表单信息不正确而造成的;
    (2)、输出错误:主要是由于网络速度或程序设计问题等引起的。 

    二、性能测试

    1、连接速度测试
    (1)、Web系统响应时间;
    (2)、超时的限制。

    2、负载测试
    (1)、某个时刻同时访问Web系统的用户数量;
    (2)、也可以是在线数据处理的数量。

    3、压力测试
    (1)、压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
    (2)、压力测试的区域包括表单、登陆和其他信息传输页面等。

    三、可用性测试

    1、导航测试
    (1)、导航是否直观
    (2)、Web系统的主要部分是否可通过主页存取 
    (3)、系统是否需要站点地图、搜索引擎或其他的导航帮助 
    (4)、Web应用系统的页面结构、导航、菜单、连接的风格是否一致 
    (5)、Web应用系统导航帮助要尽可能地准确。Web应用系统的层次一旦决定,就要着手测试用户导航功能。

    2、图形测试
    一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有: 
    (1)、要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间;
    (2)、Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面;
    (3)、验证所有页面字体的风格是否一致;
    (4)、背景颜色应该与字体颜色和前景颜色相搭配;
    (5)、图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。

    3、内容测试
    检验Web应用系统提供信息的正确性、准确性和相关性。
    信息的正确性是指信息是可靠的还是误传的 。

    4、整体界面测试
    整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?当然,对界面的整体测试并不能单靠个人直觉来评定;每个人的审美观、专业角度、系统面向的行业及用户、甚至性别与年龄等等,都是可能导致对界面作出不同评价的因素。所以要明白在对整体界面的测试过程中,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

    四、兼容性测试

    1、平台测试
    在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

    2、浏览器测试
    (1)、浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
    (2)、测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

    五、安全性测试
    (1)、现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等;
    (2)、Web应用系统是否有超时的限制,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用;
    (3)、为了保证Web应用系统的安全性,需要测试相关信息是否写进了日志文件、是否可追踪;
    (4)、当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性; 
    (5)、服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。
    (6)、通过模拟攻击的形式拷贝Web应用程序的某个功能点的url地址,然后打开新的页面输入该url地址看其是否能跨过系统的登录模块直接进入该功能点。
    (7)、服务器端IIS是否设置了默认文档功能。
    (8)、IIS服务器的主目录应该与操作系统的安装路径设置在不同的盘符下。

      Web测试要点(功能、性能、可用性、兼容、安全)收藏

    document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "\r\n\n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } }function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}一、功能测试

    1、链接测试  
    (1)、测试所有链接是否按指示的那样确实链接到了该链接的页面; 
    (2)、测试所链接的页面是否存在; 
    (3)、保证Web应用系统上没有孤立的页面(所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问)。 

    2、表单测试
    (1)、注册、登陆、信息提交等,必须测试提交操作的完整性,以校验提交给服务器的信息的正确性;
    (2)、用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等; 
    (3)、检验默认值的正确性;
    (4)、如表单只能接受指定的某些值,测试时跳过这些字符,看系统是否会报错。

    3、Cookies测试(session测试同)
    (1)、Cookies是否起作用; 
    (2)、Cookies是否按预定的时间进行保存;
    (3)、刷新对Cookies有什么影响。 

    4、设计语言测试
    (1)、使用哪种版本的HTML;
    (2)、验证不同的脚本语言。例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等。

    5、数据库测试
    (1)、数据一致性错误:主要是由于用户提交的表单信息不正确而造成的;
    (2)、输出错误:主要是由于网络速度或程序设计问题等引起的。 

    二、性能测试

    1、连接速度测试
    (1)、Web系统响应时间;
    (2)、超时的限制。

    2、负载测试
    (1)、某个时刻同时访问Web系统的用户数量;
    (2)、也可以是在线数据处理的数量。

    3、压力测试
    (1)、压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
    (2)、压力测试的区域包括表单、登陆和其他信息传输页面等。

    三、可用性测试

    1、导航测试
    (1)、导航是否直观
    (2)、Web系统的主要部分是否可通过主页存取 
    (3)、系统是否需要站点地图、搜索引擎或其他的导航帮助 
    (4)、Web应用系统的页面结构、导航、菜单、连接的风格是否一致 
    (5)、Web应用系统导航帮助要尽可能地准确。Web应用系统的层次一旦决定,就要着手测试用户导航功能。

    2、图形测试
    一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有: 
    (1)、要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间;
    (2)、Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面;
    (3)、验证所有页面字体的风格是否一致;
    (4)、背景颜色应该与字体颜色和前景颜色相搭配;
    (5)、图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。

    3、内容测试
    检验Web应用系统提供信息的正确性、准确性和相关性。
    信息的正确性是指信息是可靠的还是误传的 。

    4、整体界面测试
    整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?当然,对界面的整体测试并不能单靠个人直觉来评定;每个人的审美观、专业角度、系统面向的行业及用户、甚至性别与年龄等等,都是可能导致对界面作出不同评价的因素。所以要明白在对整体界面的测试过程中,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

    四、兼容性测试

    1、平台测试
    在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

    2、浏览器测试
    (1)、浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。
    (2)、测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

    五、安全性测试
    (1)、现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等;
    (2)、Web应用系统是否有超时的限制,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用;
    (3)、为了保证Web应用系统的安全性,需要测试相关信息是否写进了日志文件、是否可追踪;
    (4)、当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性; 
    (5)、服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。
    (6)、通过模拟攻击的形式拷贝Web应用程序的某个功能点的url地址,然后打开新的页面输入该url地址看其是否能跨过系统的登录模块直接进入该功能点。
    (7)、服务器端IIS是否设置了默认文档功能。
    (8)、IIS服务器的主目录应该与操作系统的安装路径设置在不同的盘符下。

  • 转:安全测试

    2009-08-10 15:23:57

    第一次真正接触到安全测试是测试用例PK时,刚好和花花一组,提出了安全测试,由我负责写用例,对XSS,CRSF完全没有概念,无从下手,经我们的安全大师花花指点,终于明白了什么是XSS和CSRF,也对安全测试他们也有了一个初步了解, XSS测试:在输入框的页面测试一些关键HTML代码看会不会报错。CSRF测试:同个浏览器打开两个页面,一个页面权限失效后,另一个页面是否可操作成功。

      第二次接触安全测试是分到两个店铺XSS和CSRF安全漏洞的日常,刚拿到日常时发现shopmanager套用不上,他全是展示页面,没有输入框,也没有什么要操作提交的,怎么测XSS和CSRF呀,又P颠P颠的跑去请教花花,给我了很多资料,包括以前没有参加分享的安全测试PPT,还有测试工具 Paros和淘宝内部的安全测试工具。

      用工具测试是很好,但是有时也会误报,像扫描结果中发现每次扫描基本上都会报XSS和CSRF错误,所以需要对结果进行分析。

      XSS误报:

      在报错动作下的Report下面会显示错误,如果错误的描述显示以为信息,则是些错误为误报,可以不用理会:The error messages may disclose sensitive information. This information can be used to launch further attacks.

      对有输入框和报CSRF错误的页面,也可以进行手工排查。

      有输入框的页面测试可以输入以下符号或标签判断是否有XSS漏洞:

      输入大于小于符号

      输入双引号 ”

      输入单引号 ‘

      输入HTML标签

      $!productName

      var from = ‘$!rundata.Parameters.getString(’from’)';

      var from = ”;hackerFunction(document.cookie);”;

      以下方法可判断是否有CSRF漏洞:

      对权限页面,同一个浏览器同时打开两个相同URL页面,其中一个页面cookie失效,另一个页面是否可操作成功。

      排查CSRF错误:

      当页面没有CHECKCODE时,查看页面源代码,查是是否有token。

      如果页面完全是展示页面,是不会有token的。

  • 703/4<1234>