日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

最新来客

统计信息

  • 访问量: 607
  • 日志数: 5
  • 建立时间: 2007-06-22
  • 更新时间: 2008-07-10

RSS订阅

I don't make software; I make it better

我的最新日志

  • [总结]性能测试

    2008-4-29

        从事软件测试快1年了,各方面的书籍和知识也看了不少,实践却不是很多,虽然学了不少非测试的知识,对软件工程也算有了比较清晰的认识,但对于把测试作为主要学习对象的我来说。测试上的技术还远远不够,测试工具的使用有待进一步的加强。所以,这里也把一些知识总结一下,方便自己以后查询和复习。

    1.介绍

    软件性能:是一种指标,是参考一定标准的表现,表明软件系统或构件对于其及时性要求的符合程度,即在相应的硬件和软件环境下,该软件系统应该达到的一个水平。另外,性能是一种特性,可以用时间和空间来进行度量。

    3种角度看性能:(1)用户角度:直观印象,主要是从响应时间来看;(2)管理员角度:建立在响应时间基础上,要考虑系统状态如系统资源的利用率,系统的扩展性和系统的稳定性;(3)开发人员:主要从系统架构,数据库设计,代码的优化来看待。

    2.主要关键词

    响应时间:对请求作出响应所需要的时间。web的普遍标准是2/5/10秒,即2秒以内的客户响应被认为是“非常好非常吸引人”的,5秒内是“比较不错”的,10秒是能接受的上限。但是响应时间具有相对性,如:一个月才进行一次的操作,20分钟是一个可以接受的等待时间。即:具体环境具体判断。

    用户并发数:主要取决于服务端和客户端的性能。对服务端来说,每个用户和服务断都是离散的,用比较形象的话来说,就是一群小孩对着一堵墙踢球,每个小孩都有一个球,具体多少个小孩,每个小孩每次对着墙踢球的时间是不确定的或有一定规律的。而墙能承受多少小孩踢球而不跨掉,便是一个用户并发数的问题。而对客户端来说,每个小孩踢球的时间都是根据自己的实际情况来决定的,即根据用户实际的业务场景来决定的。所以,系统的服务端能承受的最大并发访问数主要取决于并发用户数和业务场景,一般可以通过对服务器日志的分析可以得到。                                                                                 并发数确定的理论公式:C=nL/T (C是平均的并发用户数,n是login session“用户从登陆系统到退出系统的时间段”,T是考察的时间段即用户可能使用系统的总时间段)C^=C+3根号C。

    例如:一OA系统,该系统有200用户,每天大约100人访问系统,一天内用户从登陆系统到退出系统的平均时间是4小时,一天内,用户最多使用8小时。

    那么可以得到C=200*4/8=100     (并发用户数)

              C^=100+3*根号100    (最大用户数)

    吞吐量:单位时间内系统处理的客户请求的数量,主要体现软件系统的性能承载能力。

    吞吐量的单位不定,可以是:请求数/秒,人数/天,业务数/小时……对于web系统来说,常用的是请求数(点击数)/秒或字节数/秒来体现

    计算公式:F=N*R/T

    F代表吞吐量,N代表Virtuae User的个数,R代表每个用户的请求数,T代表性能测试的时间

    可以看到上列公式在图表里显示理论上是一根平滑的斜线,理论上随着用户数的请求数增加,时间也跟着增加,如果实际测试中。系统的性能出问题时,即用户数增加到一定数量,系统不能及时处理,此时,图表表现出来就会发生变化。

    一般来说,2个不同的系统可能具有不同的用户数和用户使用模式,但如果具有基本一致的吞吐量,则可以说,他们具有基本相同的平均处理能力。

    性能计数器(Counter)是描述服务器或操作系统性能的一些数据指标。例如,对windows操作系统来说,使用内存数,进程时间等都是常见的计数器。

    思考时间:指用户在进行操作时,每个请求之间的间隔时间。

    待续。。。

  • QTP学习笔记

    2008-4-01

    2008.4.1

    下面是今天上午录制的一个脚本,然后进行了少量编写:

    Dim iStatus
    Browser("XXX").Page("XXX").WebEdit("txt_user").Set DataTable("username", dtGlobalSheet)
    Browser("XXX").Page("XXX").WebEdit("txt_Password").SetSecure DataTable("password", dtGlobalSheet)
    Browser("XXX").Page("XXX").Image("Btn_Login").Click 25,8
    iStatus = DataTable("status", dtGlobalSheet)
    If iStatus = ""  Then
     Browser("XXX")
    End If
    If iStatus = "用户或密码错误!"    Then
     Browser("XXX").Dialog("Microsoft Internet Explorer").WinButton("确定").Click
         Reporter.ReportEvent micFail, "登录过程", "登录失败."
    End If
    Browser("XXX").Close

    小结:1.录制过程很简单,但要保证脚本全部通过还是有点麻烦,老是出各种各样的小错误。其中一个是datatable的新增,变量iStatus声明后还需在global中增加个属性,在显示栏上双击输入Status。

    2.第2个经验是保证脚本的连贯性,由于qtp脚本执行的不连贯,当出错时需要手工调试,虽然有小工具帮忙进行处理,但是能自己在编脚本里处理最好。录制登陆过程有2种,一种是正确登陆,一种是错误登陆,开始我只录制了正确登陆的情形,结果,因为后面还有错误登陆的情形,结果执行到错误登陆时,没法继续进行下去。于是我录制了错误登陆的脚本,把其中的提示点掉的代码复制到了end if的后面去: Browser("XXX").Dialog("Microsoft Internet Explorer").WinButton("确定").Click。最后顺利自动执行完所有脚本。

    3.函数:Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]

    主要功能:Reports an event to the test results.
    EventStatus:事件情形,主要4种 micPass;micFail;micDone;micWarning

    ReportStepName:报告中的步骤名称

    Details:具体细节

    示例:Reporter.ReportEvent micFail, "Custom Step", "The user-defined step failed."

    4.编制脚本2种方式:一是视图模式,编写形象化,但效率低;一是专家模式,编写抽象化,但效率高。

    “高手”大概就是能熟练的用专家模式快速编写脚本吧!

    2008.4.2

    今天主要阅读了QTP专区的部分精华帖,总结如下:

    1.录制带有ActiveX插件的WEB系统,回放第一次没问题,第二次就有问题的解决方案。这个问题以前遇到过,解决方法: (1)延迟可用WAIT X(X单位是秒)(2)可以安装插件添加新的浏览器
              SystemUtil.Run "file” "params" "dir" "op'' "mode"(3)依次点击 Tools ---> Options... ----> Active Screen ,  然后点开 Advanced.. 按钮,  选中 Load ActiveX  controls (就是前面出现 对号); 同时把  Run scrīpts 的选项改为  Disabled 就可以了!
    2.校验码的解决方案:(1)暂时屏蔽校验码;(2)跟程序员拿程序,然后自己在脚本里面写FUCNTION

    3.QTP无法录制某些控件的操作的解决方法

    4.QTP调用外部动态库的方法

    主要用到的函数是:Extern.declare(RetType,MethodName,LibName,Alias[[,ArgType(s)],...])
    例子:

    Extern.Declare micHwnd,"FindWindow","user32.dll","FindWindowA",micString,micString

    其中VC中的INT在QTP中用micInteger表示,char*在QTP中用micString表示。

    启示:QTP这种调用外部动态库的机制保证了QTP的扩展性。

    5.什么是Keyword-Driven Testing

    一般开发的前一步是设计,通常会做出用户界面 (UI)来给客户看,然后确认后就可以展开测试工作。自动化测试就可以从模型确认后这一步开始。通过Object Repository可以先于开发一步建立测试脚本。

    启示:测试人员可以更早就开始建立测试脚本,测试先行。不过实际运作中必须保证需求和设计完全匹配,且变化不大的情况下。否则实际意义不大。QTP还是做回归测试更好一些。

    2008.4.3

    1.实际录制了脚本,发现对于日期类控件,采用低层次录制比较合适,如此类控件

    而对于richtext类控件,则使用virtual object比较合适。

    2008.4.8

    今天复习了oldsidney的QTP学习手册,下面是做的笔记。

    1.浏览器设置:IE工具-内容-个人信息-“自动完成”上的"表单上的使用者名称合密码"取消;
    2.Expert View的分析:
    Browser("Welcome: Mercury Tours").Page("Welcome: Mercury Tours").WebEdit("userName").Set

    "jojo"
    一般几个部分构成:第一层:Browser(" ")表示的是打开的网站
        第二层:Page(" ")表示的是打开的网页
        第三层:控件类型("名称")
        第四层:操作方式("操作内容")
    3.检查点:标准/图片/表格/网页/文字/图像/数据库/accessiibility/XML检查点
    (1)标准检查点:主要时检查控件。不仅仅是检查文字,还可以检查该控件的属性等发生变化没,比如

    同样是text,如果源代码里控件名字变化了,那么最后检查的结果仍然是错误的。而对属性的调整不能在

    专家模式里调整。
    (2)网页检查点:包括检查链接数与网页上的图片以及坏链接的检查,还有加载时间等。不过检查时间

    比较长,做功能测试时一般不要写进去,可单独检查时使用。
    (3)文字检查点:2种,一种固定的,一种活动的。活动的即关联前面选择的文字,如飞机订票里,飞行

    起点选择的是哪里参数化,后面检查也关联此参数化的字典。
    (4)表格检查点:同标准检查见一样,只需检查必要的字段,无需检查所有属性。
    4.动态值的检查
    对于如飞机票价格的检查一般是动态的值,因为随着飞行起点和终点的变化,飞机票的价格也随之变化。

    所以要先建立飞机票价格的输出值,再进行关联。主要是用Insert Output把动态值先建立起来,然后在

    后检查时再关联起来。
    5.万用字符表示法
    象正则表达式一样,通过特殊字符如. 8 ^ []等来组合搜索。常见的如日期格式:[0-1][0-9]/[0-3][0-

    9]/200[0-9],但是用这个来匹配4/8/2008的时候却不行,改成[0-9]/[0-9]/200[0-9]就可以了。看来匹

    配非常严格,要把正则表达式学好。
    6.脚本切动作
    有点象分类,把不同业务切出来单独做一起。把一个Action切成2个Action。步骤:Step>Split Action
    然后再把动作设置为可再使用动作:选择[Action Properties]后,点选【Reusable action】,然后点下

    OK。

    2008.4.9
    1.reporter.Filter='0/1/2/3'[]
    Reporter.filter分为四个属性:
                   0或者rfenableall 所有的报告都显示在test result中
                   1或者enableerrorandwarning错误和警告信息显示在test result中
                   2或者rfenableerroronly只把错误显示在test result中
                   3或者rfdisableall不在test result中显示任何信息

    2.关于getRoporperty ,getTopropertise, getToproperty
    书写格式: object.GetROProperty (Property) object.GetTOProperties
       object.GetTOProperty (Property)
    其中property为属性的名称
    例:
    下面的例子取出radio group的项目数,保存在numoflterms中
    NumOfItems = Browser("Mercury Tours").Page("Find Flights").WebRadioGroup("seat

    pref").GetROProperty("Items Count")
    如其中的index这项,他的值在录制的过程中是9,那么使用getToproperty返回的值就是9.
    index这个值做了参数化,发现index值不为9了,变为了10,使用getRoporperty返回的值就为10.

    2008.4.24

    1.在QTP中没有提供用于直接操作注册表的测试对象,但是利用Windows脚本的Shell对象,可以对注册表进行增删改等操作,例如下面的脚本:

    Dim WshShell, bKey

    ' 创建Shell对象
    Set WshShell = CreateObject("Wscrīpt.Shell")

    ' 使用Shell对象来读取注册表
    bKey = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins")
    Msgbox bKey

    ' 修改注册表
    WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins", "D:\Program Files\Mozilla Firefox\Plugins", "REG_SZ"

    ' 删除注册表
    WshShell.RegDelete "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins"

    ' 修改或写入注册表
    WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 1.5\Extensions\Plugins", "C:\Program Files\Mozilla Firefox\Plugins", "REG_SZ"

    2008.4.29

    1.QTP中的descrīptive programming

    详细参见:http://www.51testing.com/html/51/133.html

    摘要:

        通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Descrīption)来添加相应的方法。
        然而对象库里如果没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descrīptive Programming。
        为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的Descrīptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识别出来这个对象。
        先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来
    Window("Text:=Yahoo! - Microsoft Internet Explorer").Close
    我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面。

     

     

     

     

  • 测试空间开通

    2007-6-22

    测试空间开通,大家有空来访问!
Open Toolbar