欢迎你~~~

发布新日志

  • LR脚本的调试(转载)

    2008-10-27 00:40:31

      沉浮于LR很多天了,以前一直在WR分论坛漂。看到大家提出很多问题,不过发现大家的脚本大都已录制为主,而且经常有提出录制的脚本回放有问题,其实很多问题很好解决LR提供了很多手段调试和优化我们的脚本。
    1.
    设置断点
    相信大家都不陌生,LR也是可以设置断点的,在需要设置断点的语句前按F9
    捷键,断点就设置好了,程序运行到断点语句后会暂停,这时我们可以用F10单步
    调试程序.
    2.
    打开EXtended Log
    只是设置断点是不够的,我们还得知道具体发生了什么事情,Log告诉了我们一切,默认的Logstandard Log,这时远远不够的.我们要extended log,打开路径
    runtime settings-->log-->extended log.parameter substitutiondata returned by serveradvanced trace大家根据需要勾选吧.
    3.
    注释掉多余的语句
    很多回放时出错的脚本都是因为多余的语句.因为LR在录制的时候,LR生成的语
    句很多不是我们想要的,这里结合几个网友的问题说说,曾有网友问:回放脚本的时
    socket出错,提示: Error : socket0 - Address already in use. Error code
    : 10048.
    而且非常坚持说脚本不会有问题,因为脚本直接录制后回放,什么都没改,
    是不会出错的.拿到脚本一看,有一条语句lrs_create_socket,建立了socket0,
    是之后没有任何socket0的语句,可以判断出该语句是无效的,注释掉,问题解
    决。所以大家不要过分相信LR,它生成的语句也是有很多BUG的。

    经常有朋友们问到,log文件在哪看,特别是controll执行后,怎么看log。这里一一说明一下:
    1)在vgen中,我们必须写输出函数输出信息,将我们所想要了解的信息用函数输出,主要有这么几个函数输出信息:lr_output_message,lr_error_message,lr_log_message。这些函数请参阅help-->function reference.
    其次,我们要在runtime settings中设置,勾选always send messages,具体的做法是:runtime settings--->log-->always send messages,这样我们才能写出Log,在我们的脚本所在的文件夹中,有两个文件很重要,mdrv.log.txtoutput.txt文件,lr_log_message只会把信息输到mdrv.log文件中,而lr_output_message则会写进以上两个文件。
    2)在controller中,很多朋友都会想知道多次迭代,参数是否正确的导入了呢,我们依旧查看log,我们在执行结束后,查看结果目录的Log文件夹,如果是负载生成器运行的话,则在tmp目录。不过,还想提醒朋友们,在controller我们也要设置runtime settings才行,而且每个用户组的runtime settings,设置的方法是:在controllerdesign标签页中,右下角的部分有runtime settings按钮,我们点击它,设置的方法与在vgen中一样的。

  • 常用的功能测试方法

    2008-10-26 19:37:40

    功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。常用的测试方法如下:

      1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。

      2. 相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。

      3. 检查按钮的功能是否正确:如update, cancel, delete, save等功能是否正确。

      4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错.

      5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.

      6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.

      7. 中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错.

      8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致

      9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.

      10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理.

      11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.

      12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错.

      13. 重复提交表单:一条已经成功提交的纪录,back后再提交,看看系统是否做了处理。

      14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,再back,重复多次,看会否出错.

      15. search检查: 在有search功能的地方输入系统存在和不存在的内容,看search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确.

      16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方.

      17. 上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。

      18. 必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加*

      19. 快捷键检查:是否支持常用快捷键,如Ctrl+C Ctrl+V Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。

      20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错.

  • loadrunner函数详解

    2008-09-26 14:11:37

    『转载』Loadrunner关于页面检查的几个函数详解

    2008-09-24 10:05:21 / 个人分类:LoadRunner

    环境:
    8H4qx:|?mb'k,}|0Loadrunner版本:8.0
    3L j9Z o c`1pi%n0自建一个test.html文件:
    n] f:JAf+O\*p0<html>
    $wj'L(P AE;o0<head>
    $rS^;e[ c^7cs0<meta name="google1" content="google2"/>51Testing软件测试网5J6A+f x};Q UD:P
    <title>google3</title></head>51Testing软件测试网 OMO!_cn+` ?
    <body>51Testing软件测试网2y Mj(uqZ&c
    google4:<input type="text" name="google5" />
    Ih7kh.] bz"^0<input type="submit" value="google6"/><br>51Testing软件测试网;v0y^_I;}#jC
    <a href="
    http://www.google.com/calendar/render?hl=zh-CN&tab=wc" class=gb2>google7</a><br>
    f2g {w)_)tJ7m0<img src=http://www.google.cn/intl/zh-CN/images/logo_cn.gif width=200 height=88 border=0 alt="google8" title="Google9">51Testing软件测试网7[X4H] cj o
    <img src=http://www.google.cn/intl/zh-CN/images/logo_cn.gif width=200 height=88 border=0 alt="google8" title="Google9">51Testing软件测试网H2~ A#Sz
    </body>51Testing软件测试网n,b&\dG
    </html>

    K,{&s6yrJ\JB.~"o0 
    x+W2E!yN0一、web_image_check

    语法:
    3qh ].m0V,d{O0int web_image_check(const char *CheckName, <List of Attributes>, <"Alt=alt"|| "Src=src">, LAST );

    参数:51Testing软件测试网r{V^!ah-tQ$?.m&v.B

    FmP lc aI01、CheckName:Check名称。51Testing软件测试网"Da/@Z5_qF
    2、List of Attributes:
    "d`y#~H WQXwT7|0支持的属性有:Frame(在多Frame的情况下,定义要查找Frame的范围)。
    !q%{2kN ?0支持的选项有:51Testing软件测试网&IG)`jUn
    Expect:检查通过的条件,默认为Found51Testing软件测试网 b*eq Ub?
    Matchcase:是否区分大小写,默认为no51Testing软件测试网y g+f"n.L5Kh"X
    Repeat:找到第一个符合条件字符串后,是否还继续搜索,默认为yes
    AV:X+Bp-U0Report:什么情况下(success、failure、always)显示检查结果,默认always51Testing软件测试网.j t#`0DV(a\~
    Onfailure:失败(expect的值决定)的情况下,是否继续,默认为Continue on Error。
    [,N3Xf%eS)@03、Alt:图片的ALT标记。
    \e`"Fc1iIUO*U04、Src:图片的SRC标记。

    说明:51Testing软件测试网*Nj N?mrX&A

    GfbzJpX2y01、注意勾上Runtime Settings—Internet Protocl—Preferences—Checks:Enable Image and text check51Testing软件测试网,u0[yl6Gf}-JZ~
    2、注意该函数放到web_url后面,且Web_url的Mode须为html(此函数仅仅支持基于HTML的脚本)51Testing软件测试网!N1v|3v ux
    3、Web_image_check检查指定的图象是否在HTML页面中出现。
    ] Z1M~'l04、Alt或者Src两者必须有一个在参数列表中出现。如果两项都通过,那么检查成功。

    示例:51Testing软件测试网 y3b9g"N)w'y,G
    Loadrunner脚本:
    %A)V3S|'_oR3c&QR/J051Testing软件测试网8Ogh$YR4A F
    ……51Testing软件测试网 zKbSq
     web_url("google\",
    r8Mbg6}l7aS0  "URL=http://127.0.0.1:8000/test.html",
    4l AJ_A ]U3p0  "TargetFrame=",51Testing软件测试网Mi.ip3}-B[z
      "Resource=0",
    D0DqCME L0  "RecContentType=text/html",51Testing软件测试网Ovd6JK0i8X+O-y
      "Referer=",
    6n'g2g*Lq1fa[+[q N0  "Snapshot=t1.inf",
    0{ ?X&~5^0  "Mode=HTML",51Testing软件测试网m {,RzZaAM^
      LAST);

     web_image_check("web_image_check",
    s{z0CzR,m4n4f {0  "expect=NotFound",51Testing软件测试网[9q0J/E;`/tT*eP
      "Alt=Google8",51Testing软件测试网 B(p(dN|
      "matchcase=no",51Testing软件测试网_W G.]x$@%k Hzd
      "repeat=no",51Testing软件测试网B:ub?%J
      "report=failure",51Testing软件测试网X)zF @M:CP
      "Onfailure=abort",51Testing软件测试网ki6YW&?a-Ah
      LAST);

     web_find("web_find\",51Testing软件测试网j-m1g2cQ|T
      "What=Google",
    8k6eV)yU0  LAST);
    zg"UR@/zm#q n0……51Testing软件测试网Y Z]5bG y0u4{#l\
    51Testing软件测试网-xNSW PT(@
    运行结果:51Testing软件测试网{QH XHe5Q;o}
    51Testing软件测试网x|_#Rt(A.} rq
    Starting action Action.
    F#Q H$uA8~6QD"r0Action.c(15): Found resource "
    http://www.google.cn/intl/zh-CN/images/logo_cn.gif" in HTML "http://127.0.0.1:8000/test.html"   [MsgId: MMSG-26659]
    $f @.S sN/rI4].qV0Action.c(15): web_url("google") was successful, 11968 body bytes, 521 header bytes   [MsgId: MMSG-26386]51Testing软件测试网y+Q}7X2V6O&},S
    Action.c(35): Fatal Error -27191: "web_image_check" failed (1 occurrence(s) found. Alt="Google8", Src="")   [MsgId: MERR-27191]
    'R)q.xt+T g r%x0Action.c(35): web_image_check highest severity level was "FATAL ERROR"   [MsgId: MMSG-26391]

    gk RP(AU&WJ0Abort was called from an action.51Testing软件测试网w/U.S.IN8g
    Ending Vuser...

    解释:51Testing软件测试网p-M ~U:PJaEbl/r

    ac Y,N~s01、 expect=NotFound,由于找到了符合要求的结果,所以为失败51Testing软件测试网"t7~PEeG{ q
    2、 repeat=no,实际上有两个符合条件的结果,不过不继续,所以1 occurrence(s) found51Testing软件测试网 q^'bj Bp2}
    3、 Onfailure=abort,该检查结果为fail,所以abort,后面的文件检查未执行。

    二、web_find

    语法:51Testing软件测试网8LLE1J7ufCp
     int web_find (const char *StepName, <Attributes and Specifications list>, char *searchstring, LAST );

    参数:51Testing软件测试网 [R;fo,vZ7] B0K

    D P^pb0nb*\01、StepName:Check名称 51Testing软件测试网 uZ;{!S p)e
    2、Attributes and Specifications list:51Testing软件测试网 \9['^?-rzE
    支持的属性有:51Testing软件测试网+rT[4Ah*_u
    Expect:定义在什么情况下函数检查成功:找到了指定的搜索标准或者没有找到。例如说,可以检查指定的错误信息是否出现在web页面中。合法的值有2个:found和notfound。默认值是“found”。

    Matchcase:指定搜索是否区分大小写,默认为no。

    Repeat:指定当第一次发现要查找的字符串时,搜索是否继续。当一个web页面中包含多个被查找的字符串时,此参数是非常有用的。合法的值有2个:yes,no。默认值是“yes”。

    Report:指定在什么情况下,VuGen在执行日志中显示此函数的检查结果。合法的值有:success,failure,always。默认值是“always”。

    Onfailure:此参数决定在函数检查失败后,Vuser是否中断。参数值是abort。如果指定了Onfailure=abort,当函数检查失败时,不论在运行时设置中的error-handling(Runtime Settings—Miscellaneous)是什么,脚本都会中断。如果没有指定Onfailure=abort,那么运行时设置中error-handling将会起作用。

    支持的特性有:RightOf, LeftOf (不支持7.x及更高版本)。

    RightOf:要查找的字符串右边的内容。

    LeftOf:要查找的字符串左边的内容。

    3、Searchstring:需要查找的字符串,格式为“What=stringxyz”。此搜索不区分大小写。

    4、LAST:属性列表结束符。

    说明:
    `P+UyN_2q,u8@,fO0
    v c@'^B/y ?5t't01、注意勾上Runtime Settings—Internet Protocl—Preferences—Checks:Enable Image and text check51Testing软件测试网+x w;R9g0E+E&mh
    2、注意该函数放到web_url后面,且Web_url的Mode须为html
    U^.iKO2R5g8C+t a03、此函数的作用是在HTML页面中查找指定的字符串。51Testing软件测试网 tq"b7mf^D8zbb6J
    4、函数只能在基于HTML录制的脚本中使用。当指定的HTML请求全部完成以后,开始执行搜索过程,比web_reg_find要慢。
    7rj2_ p hJ F/[05、web_find函数在C语言的脚本中已经被web_reg_find所替代,web_reg_find运行速度比较快,而且在HTML-based和URL-based的录制方式中都可以使用。51Testing软件测试网N9r1JUA@1r ~
    6、在C语言脚本中,web_find是向后兼容的。Java和Visual Basic脚本中不支持它。51Testing软件测试网X'}~5MV s5L
    7、WAP和WSP协议不支持。

    示例:
    tYKMk?0Loadrunner脚本:51Testing软件测试网 g+{V0~k7D
    51Testing软件测试网*c'Yl6? z$N r WZ
    ……
    p)} Qx!yAk0 web_reg_find("Text/IC=google",51Testing软件测试网:COF?s/O
        "Search=Body",51Testing软件测试网ed*sa;w$mL
      LAST);

     web_url("google",51Testing软件测试网^hQ4Zx,t
      "URL=http://127.0.0.1:8000/test.html",51Testing软件测试网Jkk,j H^i5M7i(e1J
      "TargetFrame=",
    AeRT@;T h R5G0  "Resource=0",51Testing软件测试网MTh&a|-W
      "RecContentType=text/html",
    :WgN"]:b8d D7q0  "Referer=",
    GM{l!F*D0  "Snapshot=t1.inf",
    U%Zq"iZMW'x0  "Mode=HTML",
    +a_P&k)Y'b M"l0  LAST); 

     web_find("web_find",
    *a R4iGd gP0  "What=Google",
    /c2F;v%V7jt0  LAST);51Testing软件测试网~v^ss
    ……51Testing软件测试网.E-[5L a:\p
    51Testing软件测试网R {F5DqA
    运行结果:
    L;}&|+W:?h*C.`0
    k_J3QD9h3|9} nf0Starting action Action.
    w*^j1eD!N0Action.c(7): Registering web_reg_find was successful   [MsgId: MMSG-26390]
    :F0B4k$d|(eC)@tx-zpa0Action.c(15): Found resource "
    http://www.google.cn/intl/zh-CN/images/logo_cn.gif" in HTML "http://127.0.0.1:8000/test.html"   [MsgId: MMSG-26659]
    t-De8V T&px0Action.c(15): Registered web_reg_find successful for "Text=google" (count=14)   [MsgId: MMSG-26364]51Testing软件测试网 }yU~K2b
    Action.c(15): web_url("google") was successful, 11968 body bytes, 521 header bytes   [MsgId: MMSG-26386]51Testing软件测试网$N Xq5Y.b7qD"M
    Action.c(44): "web_find" successful. 3 occurrence(s) of "Google" found (RightOf="", LeftOf="")   [MsgId: MMSG-27196]
    A7cV fQ0Action.c(44): web_find was successful   [MsgId: MMSG-26392]51Testing软件测试网4B5t;o_0C~A"Wo$f
    Ending action Action.

    解释:51Testing软件测试网5d`2c*|Q

    D&@,GDM"Gk h$E0可以看出两个函数最后的检索结果不一样,web_reg_find发现了14个,web_find只发现了3个。这是在web_find里再添加一个属性—"matchcase=yes",运行结果为:51Testing软件测试网&jVU:Cl#Z
    Action.c(44): Error -27195: "web_find" failed. 0 occurrence(s) of "Google" found (RightOf="", LeftOf="")   [MsgId: MERR-27195]51Testing软件测试网Bke?1c[1D(w:D
    Action.c(44): web_find highest severity level was "ERROR"   [MsgId: MMSG-26391]
    51Testing软件测试网`\Q!GU
    web_find只检索“>”、“<”间的内容。

    三、web_reg_find

    语法: int web_reg_find (const char *attribute_list, LAST);

    参数:51Testing软件测试网{L/Po$_Uj
    51Testing软件测试网C*|;c FHq
    1、attribute_list:51Testing软件测试网:~)]3nGN(NCG?0X
    通过Name=Value对来传递参数。例如“Text=string”。Text,TextPfx,TextSfx三个必须有一个出现。其他的属性是可选的。

    Text:要搜索的字符串,字符串必须非空,以NULL结尾。可以使用text flags自定义搜索字符串。

    TextPfx:要搜索的字符串的直接前缀。

    TextSfx:要搜索的字符串的直接后缀。

    Search:搜索的范围。可选的值是:Headers(search only the headers) 、Body(search only the Body data)、Noresource (search only the HTML body, excluding headers and resources)、ALL (search body , headers, and resources),默认值是“BODY”。

    SaveCount:保存到参数中的匹配的字符串的个数。使用这个属性,需要指定“SaveCount=param”。检查操作被执行后,param 的值是null结尾的数字类型的值。

    Fail:设置函数检查在什么状态下失败。可以是“Found或“NotFound”。默认是“NotFound”。

    ID:日志文件中标识此函数的一个字符串。

    RelFrameId:相关联的FrameId。注意:此参数在GUI级别的脚本中不受支持。

    2、LAST:属性列表结束的标记符。

    说明:51Testing软件测试网c \{)PV-F0z
    51Testing软件测试网k"X9}#D-GL:}"F
    1、web_reg_find属于注册函数,注册一个在web页面中搜索文本字符串的请求,在接下来Action(象web_url)类函数中执行搜索。

    2、通过查找期望的字符是否存在来验证是否返回了期望的页面。例如,通过查找“Welcome”来检查主页是否完全打开了。也可以查找“Error”检查浏览器是否发生错误。还可以使用此函数注册一个请求来统计特定字符串出现的次数。

    如果检查失败,在接下来的Action类的函数中会报告错误。此函数仅仅注册请求,并不执行。函数的返回值只表明注册是否成功,并不表示检查的结果。

    3、此函数不仅能够查找text,还能查找到围绕着text的strings。不要同时指定text和前缀后缀。

    4、此函数在HTML-based和URL-based的脚本中都可以使用。此函数是在所请求内容到达之前注册搜索请求的,所以当所请求内容一到达后就会执行搜索,产生的脚本比较高效。
    &p}NL%mk+O,X5@0
    *m Y1D_ F5E[0示例:51Testing软件测试网tgk)An!SW;[
    Loadrunner脚本:51Testing软件测试网Q _t$AeU9Bqf+B
    51Testing软件测试网VU6v0pb7u%[
    ……
    (xH A1W1B U5L[@Er*E0 web_reg_find ("Text/IC=google",51Testing软件测试网2bah)Q*O,?
        "Search=Body",
    OgGT}?0  LAST);

     web_url("google",51Testing软件测试网wqwMa
      "URL=http://127.0.0.1:8000/test.html",
    /gQU-mC0aA)up0  "TargetFrame=",
    C6g0@t8_\N5qt S0  "Resource=0",51Testing软件测试网+@q4NNa4m)t
      "RecContentType=text/html",51Testing软件测试网m+FR,]9No4oz Z
      "Referer=",51Testing软件测试网C(Z!S[k!V3x
      "Snapshot=t1.inf",51Testing软件测试网&G ng(vw nr bNm
      "Mode= HTTP ",
    Sf*W ]Pl/o0  LAST); 

     web_url("google",51Testing软件测试网0u]8N#ko J"Qb
      "URL=http://www.baidu.com/",51Testing软件测试网;H7eW N.cX&A
      "TargetFrame=",51Testing软件测试网t,V{#a!N@j.lwwSL
      "Resource=0",
    -uF.Axx$cS0Pz0  "RecContentType=text/html",51Testing软件测试网j _(O{d9] [9gV
      "Referer=",51Testing软件测试网)y Ge9N;{#?2P
      "Snapshot=t1.inf",51Testing软件测试网]O6W&v T^8h
      "Mode=HTTP",
    W v,M*l%NRKV0  LAST);51Testing软件测试网,X ]1g_%x4_3\U
    ……51Testing软件测试网kE?Vu}'T

    F7l6X lX1N0
    运行结果:

    Starting action Action.51Testing软件测试网/~S&_!b,^7~#ho{ |R
    Action.c(7): Registering web_reg_find was successful   [MsgId: MMSG-26390]
    x2f k$a;C0Action.c(12): Registered web_reg_find successful for "Text=google" (count=14)   [MsgId: MMSG-26364]51Testing软件测试网N5ow b o4x]yv,UV
    Action.c(12): web_url("google") was successful, 538 body bytes, 295 header bytes   [MsgId: MMSG-26386]
    8gf(v(d"|x J] Y cx0Action.c(22): web_url("google") was successful, 1714 body bytes, 372 header bytes   [MsgId: MMSG-26386]51Testing软件测试网g2^!YS0t6z Y&vn2k
    Ending action Action.

    解释:
    $o"dV/C I5N/^0

    Yc-q|;Y%B0由上面的结果可以看出,web_reg_find 只在其之后的一个Action类函数中执行搜索。

    四、web_global_verification

    语法:51Testing软件测试网 ^h*s)n9}3J_x)JQ6pv
     int web_global_verification (<List of Attributes>, LAST );

    参数:51Testing软件测试网7Hfg#m4iDa `
    List of Attributes:

    Text:此属性是一个非空的,以NULL结尾的字符串,表示要查找的内容。语法是”Text=string”。还可以使用text flags自定义字符串。

    TextPfx:没有指定Text的情况下使用此属性。要查找的字符串的前缀。语法是” TextPfx =string”。还可以使用text flags自定义字符串。

    TextSfx:没有指定Text的情况下使用此属性。要查找的字符串的后缀。语法是” TextSfx =string”。还可以使用text flags自定义字符串。

    Search:可选项,在哪里查找字符串。可选的值是:Headers,Body,NORESOURCE或All。默认值是NORESOURCE。语法是“Search=value”。

    Fail:当字符串找不到时的处理选项:Found (默认值)或NotFound。Found表示当找到对应的字符串时发生了错误(例如“Error”)。NotFound表示当找不到字符串时发生了错误。语法是“Fail=value“。

    ID:在日志文件中标识当前函数。

    注:text flags:/IC表示忽略大小写;/BIN表示指定的是二进制数据。

    说明:51Testing软件测试网CvQ aX ZL%Y5[
    51Testing软件测试网K(v0dE Q
    web_global_verification属于注册函数,注册一个在web页面中搜索文本字符串的请求,与web_reg_find只在下一个Action函数中执行搜索不同的是,它是在之后所有的Action类函数中执行搜索的。可以搜索页面的body,headers,html代码或者是整个页面。

    在检测一些应用程序级别(不通过http状态码来表现)的错误时,web_global_verification是非常有用的。如果要定位通过HTTP状态码表现的错误时,使用web_get_int_property。

    查找范围:all:这个HTML页面;Headers:页面的头;body:页面的体,包含所有的资源但不包含头;NORESOURCE(默认选项):仅仅包含页面的体,把包括头和资源。

    如果不知道要查找的精确的文本,或者要查找的多个文本不是完全相同的,可以使用前缀和后缀来表示。这时需要用到TextPfx和TextSfx属性。这2个属性必须同时指定,一旦指定了其中一个,就不能指定Text属性了。

    注意:web_global_verification在WAP协议下不能运行。

    示例:
    -eI'k]6S r+f0
    Loadrunner脚本:
    'K%I"A0J5A0
    51Testing软件测试网s5w4s K)Zg+b%v`
    ……
    j!^[^#n@8n$eu0 web_global_verification("Text/IC=google",51Testing软件测试网$qXw0g)KCR*`7z d
      "Fail=NotFound",
    5e,?)}%Is*`\0   LAST);

     web_url("google",
    c9p}H(~S,h0  "URL=http://127.0.0.1:8000/test.html",51Testing软件测试网^#vS4]9Kdk
      "TargetFrame=",
    'F8o*N&{ A-kl0  "Resource=0",
    hc!]c/x*fo!d0  "RecContentType=text/html",
    V-~+_QJ2GT+s0  "Referer=",
    .s-W5~*j'u-ceG,bL0  "Snapshot=t1.inf",51Testing软件测试网-{ A} Ud({6q!K!oe
      "Mode= HTTP ",51Testing软件测试网 e2|na9rb.ba
      LAST); 

     web_url("google",51Testing软件测试网{1y(eHKyo uG#l(X
      "URL=http://www.baidu.com/",
    \'Jz:M:R+k~Tr0  "TargetFrame=",
    l]JwRP@.}7F0  "Resource=0",51Testing软件测试网3U8e/W"?5Qe P#RwA
      "RecContentType=text/html",
    !s2F2P s\w T PT*N0  "Referer=",51Testing软件测试网?9~{Q?R
      "Snapshot=t1.inf",51Testing软件测试网 k~/]T#O Q0Nxnf F
      "Mode=HTTP",
    W"| y1E;W?0  LAST);
    ][5q%o%u+?W0……
    3agy[L%ih$R [0
    -MK|1?]!f Gz0
    运行结果:

    Starting action Action.51Testing软件测试网?` O)X"P7H^'gZd
    Action.c(7): Registering web_global_verification was successful   [MsgId: MMSG-26390]51Testing软件测试网Z6m1}|R'iGLJ
    Action.c(11): web_url("google") was successful, 538 body bytes, 295 header bytes   [MsgId: MMSG-26386]51Testing软件测试网^vy C'A
    Action.c(21): Error -26366: "Text=google" not found for web_global_verification   [MsgId: MERR-26366]51Testing软件测试网q J~0C'~|)b5n I_.H
    Action.c(21): web_url("google") highest severity level was "ERROR", 1714 body bytes, 372 header bytes   [MsgId: MMSG-26388]

    *f^#f r8HU*f0Ending action Action.

    解释:51Testing软件测试网3VMY9[p&`0j
    由上面的结果可

  • 企业面试试卷及答案

    2008-09-14 13:35:14

    1.       什么是测试用例 什么是测试脚本 两者的关系是什么?

    2.       简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试

    3.       软件质量保证体系是什么 国家标准中与质量保证管理相关的几个标准是什么?他们的编号和全称是什么?

    4.       软件产品质量特性是什么?

    5.       软件测试的原则与策略是什么?

    6.       结构化系统测试和功能性系统测试分别采用了哪些方法和技术?

    7.       软件测试分为几个阶段 各阶段的测试策略和要求是什么?

    8.       面向对象的测试用例设计有几种方法?如何实现?

    9.       在软件测试各个阶段通常完成什么工作?各个阶段的结果文件是什么?包括什么内容?

    ***********************************************************

    1、  答案如下:

    a)         为实施测试而向被测试系统提供的输入数据、操作或各种环境设置以及期望结果的一个特定的集合。

    b)        测试脚本是为了进行自动化测试而编写的脚本。

    c)        测试脚本的编写必须对应相应的测试用例,

    2、  答案如下:

    a)         静态测试是不运行程序本身而寻找程序代码中可能存在的错误或评估程序代码的过程。

    b)        动态测试是实际运行被测程序,输入相应的测试实例,检查运行结果与预期结果的差异,判定执行结果是否符合要求,从而检验程序的正确性、可靠性和有效性,并分析系统运行效率和健壮性等性能。

    c)        黑盒测试一般用来确认软件功能的正确性和可操作性,目的是检测软件的各个功能是否能得以实现,把被测试的程序当作一个黑盒,不考虑其内部结构,在知道该程序的输入和输出之间的关系或程序功能的情况下,依靠软件规格说明书来确定测试用例和推断测试结果的正确性。

    d)        白盒测试根据软件内部的逻辑结构分析来进行测试,是基于代码的测试,测试人员通过阅读程序代码或者通过使用开发工具中的单步调试来判断软件的质量,一般黑盒测试由项目经理在程序员开发中来实现。

    e)         α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由程序员或测试员完成。

    f)         β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。

    3、  答案如下:

    a)         来自WikipediaSQA的定义,软件质量保证(SQA):

    Software Quality Assurance (SQA) consists of the software engineering processes and methods used to ensure quality. SQA encompasses the entire software development process, which may include processes such as reviewing requirements documents, source code control, code reviews, change management, configuration management, release management and of course, software testing.

    SQA由一套软件工程过程和方法组成,以保证(软件的)质量。SQA贯穿整个软件开发过程,()应包括需求文档评审、代码控制、代码评审、变更管理、配置管理、版本管理和软件测试。

    b)        国家标准:

                             i.              GB/T 8567-2006 计算机软件文档编制规范

                           ii.              GB/T 11457-2006 信息技术 软件工程术语

                          iii.              GB/T 16260.1-2006 软件工程 产品质量 1部分:质量模型

                         iv.              GB/T 16260.2-2006 软件工程 产品质量 2部分:外部度量

                           v.              GB/T 16260.3-2006 软件工程 产品质量 3部分:内部度量

                         vi.              GB/T 16260.4-2006 软件工程 产品质量 4部分:使用质量的度量

                        vii.              GB/Z 20156-2006 软件工程 软件生成周期过程 用于项目管理的指南

                      viii.              GB/T 20157-2006 信息技术 软件维护

                         ix.              GB/T 20158-2006 信息技术 软件生成周期过程 配置管理

    4、  答案如下:

    a)         功能性:适应性、准确性、互操作性、依从性、安全性。

    b)        可靠性:成熟性、容错性、以恢复性。

    c)        可使用性:易理解性、易学习性、易操作性。

    d)        效率:时间特性、资源特性。

    e)         可维护性:易分析性、易变更性、稳定性、易测试性。

    f)         可移植性: 适应性、易安装性、遵循性、易替换性。

    5、  答案如下:

    a)         软件测试的原则:

    教材的说法:

                             i.              软件测试应尽早执行,并贯穿于整个软件生命周期

                           ii.              软件测试应追溯需求

                          iii.              测试应由第三方来构造

                         iv.              穷举测试是不可能的,要遵循Good-enough原则

                           v.              必须确定预期输出(或结果)

                         vi.              必须彻底检查每个测试结果

                        vii.              充分注意测试中的群集现象

                      viii.              缺陷的二八定理

                         ix.              严格执行测试计划,排除测试的随意性

                           x.              注意合法合理的输入,也要注意非法的非预期的输入

                         xi.              检查程序是否是否做了不该做的

                        xii.              测试应从“小规模”开始,逐步转向“大规模”

                      xiii.              反复使用同样的测试会使软件具有抵抗力

                      xiv.              关注缺陷的修复

    另一种说法:

                             i.              应当把“尽早和不断地测试”作为开发者的座右铭。

                           ii.              程序员应该避免检查自己的程序,测试工作应该由独立的专业的软件测试机构来完成。

                          iii.              设计测试用例时,应该考虑到合法的输入和不合法的输入,以及各种边界条件,特殊情况下要制造极端状态和意外状态,比如网络异常中断、电源断电等情况。

                         iv.              一定要注意测试中的错误集中发生现象,这和程序员的编程水平和习惯有很大的关系。

                           v.              对测试错误结果一定要有一个确认的过程。一般有A测试出来的错误,一定要有一个B来确认,严重的错误可以召开评审会进行讨论和分析。

                         vi.              制定严格的测试计划,并把测试时间安排得尽量宽松,不要希望在极短的时间内完成一个高水平的测试。

                        vii.              回归测试的关联性一定要引起充分的注意,修改一个错误而引起更多错误出现的现象并不少见。

                      viii.              妥善保存一切测试过程文档,意义是不言而喻的,测试的重现性往往要靠测试文档。

    b)        软件测试策略:在一定的软件测试标准、测试规范的指导下,依据测试项目的特定环境约束而规定的软件测试的原则、方式、方法的集合。

    6、  答案如下:

    a)         结构化系统测试技术:用于验证所开发的系统及程序的运行情况。目标是要确保产品设计在结构上合理,功能上正确。为确定实现的配置及其各功能共同作用以完成特定任务提供了一种机制。结构化测试技术由以下几种:

                             i.              1)压力测试:确定系统以期望的容量执行。
    压力测试技术用于检查系统面对意外情况下的大数据量时是否可以正常运行。所涉及的方面包括输入事务、内部表、磁盘空间、输出、通信、计算机容量以及人机交互等。
    当应用系统所能正常处理的工作量并不确定时需要使用压力测试。压力测试意图通过对系统施加超负载事务量来达到破坏系统的目的。弱点在于准备测试的时间与在测试的实际执行过程中所消耗的资源数量都非常之大,通常在应用程序投入使用之前这种技术是无法进行的。

                           ii.              执行测试:系统能达到期望的熟练性。
    举例:事务轮转时间充分;软硬件使用良好。
    执行测试技术用于检查系统是否达到了预期在产品状态下的成熟度。执行测试可以验证系统的响应时间、轮转时间及设计性能。
    在开发过程的早期就应该进行执行测试,尽早制定已经完成的系统没有达到性能指标是非常有价值的。在关键时间点进行。关键时间点指的是当前的结果会影响甚至改变系统结构的时间点。

                          iii.              恢复测试:系统失效之后可以恢复到可操作状态。
    举例:引入失败;评估备份数据的充分性。
    恢复测试技术用于确保系统在经历灾难后可以继续正常运行,它不仅可以验证恢复过程,而且可以验证过程各组件的有效性。

  • B/C结构与C/S结构

    2008-09-14 11:23:43

    一、     什么是C/S和B/S


    第一、什么是C/S结构。C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

    传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件, 加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高, 效率低。如我院使用的上海超兰公司“案件统计”管理软件就是典型的C/S体系结构管理软件。

    第二、什么是B/S结构。B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。目前我院内网(Intranet)、外网(Internet)和北京东方清大公司“案件、办公管理软件”就是B/S 结构管理软件,干警在局域网各工作站通过WWW浏览器就能实现工作业务。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

    第三、管理软件主流技术。管理软件技术的主流技术与管理思想一样,也经历了三个发展时期。首先,界面技术从上世纪DOS字符界面到Windows图形界面(或图形用户界面GUI),直至Browser浏览器界面三个不同的发展时期。其次,今天所有电脑的浏览器界面,不仅直观和易于使用,更主要的是基于浏览器平台的任何应用软件其风格都是一样的,使用人对操作培训的要求不高,而且软件可操作性强,易于识别;再者,平台体系结构也从过去单用户发展到今天的文件/服务器(F/S)体系、客户机/服务器(C/S)体系和浏览器/服务器(B/S)体系。

    二、C/S和B/S 之比较

    C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国 Borland公司最早研发,B/S是美国微软公司研发。目前,这两项技术以被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可谓仁者见仁,智者见智。

       1、C/S架构软件的优势与劣势

    (1)、应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。

    (2)、数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。

    (3)、C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。

    其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。

    2、B/S架构软件的优势与劣势

    (1)、维护和升级方式简单。目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

    (2)、成本降低,选择更多。大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。 现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。


    比如说很多人每天上“新浪”网,只要安装了浏览器就可以了,并不需要了解“新浪”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。

    (3)、应用服务器运行数据负荷较重。由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。
  • 程序员怎么样保证自己的程序没有BUG

    2008-09-10 17:28:03


      毫无疑问,程序员是善于思考问题的一族。一个程序的编写都是通过:思考、设计、编写、调试、测试以及运行这些基本的阶段。

      但大部分程序员都有一个问题,就是不太愿意测试自己的代码。他们草草的调式完成以后就认为工作结束,测试那是测试人员的工作。

      按照理论上,如果代码存在问题,那么测试人员和最终的用户肯定可以发现这些 BUG ,而等待哪个时候再返回来查找问题到底错在什么地方确实代价不小,其代价有:

      1. 影响了程序员自己的声誉

      2. 影响了产品的质量

      3. 影响了客户的信任度

      4. 这个时候再 DEBUG 难度增大了许多。

      大的不说,就说多自己声誉的影响吧。如果你的程序总会有这样那样的 BUG ,你得到收益会减少,即使你写了很多代码。

      其实最后一点也很重要; 在我们面对一块代码的时候,什么方法都好办,但如果将这块代码防到庞大的系统中之后,简单的问题也难以被立即找出来。为了自己考虑,节省自己 DEBUG 的时候,我们应该让我们的程序尽量没有 BUG 。

      那么怎么样才能保证自己的代码没有 BUG 来?

      程序员必须克服一些自身的致命缺点才能够从根本上解决这个问题。那么这个问题是什么?前面我们已经提到,程序员对自己的代码都非常宽容,认为那是正确的没有问题。实际上这种想法比较正常,程序是通过程序员思考和设计之后才写出来,程序员不会将自己认为不正确的东西写到代码里,而到这个时候都一直假设程序是正确的; 但人非圣贤,怎么可能不犯错误来。实际上程序员在对待其他程序员时候的态度就很好,带着一种挑剔和学习的态度; 但一旦对待自己的代码就很难这么做; 这就是最致命的。程序员也必须对自己的代码带着挑剔和学习的态度; 这个基础是假设自己的代码是错误的,然后需要做的是怎么样证明自己的代码是正确的。程序员自身可以在程序生成的每个阶段做这些工作:仔细的设计(这个时候画点时间是值得的,必须保证我们对自己的程序有清晰的轮廓后才能开始动手写)、编写代码时、单元测试(单元测试的重要性就不在赘婿了)、功能测试。

      仔细的设计:这个的仔细是说在程序员编写代码之前,其必须对代码的整个结构以及逻辑结构有明确的清晰的了解,只有这个时候才可以去写代码。这里没有谈到文档,但我说到了一定要清晰的思路,但清晰的思路不是每个人都可以在脑袋中直接形成的,很多人都是普通人,没有办法在脑袋瓜中把所有问题都想清楚,那么就记下来,特别对于复杂的逻辑。

      编写代码:对于没有把握的代码,例如:新设计的算法,最好保证其正确性。可以单独将这部分测试,这可以让代码模块化的同时又保证了代码的正确性。一句话:少量的代码保证质量还是比较简单的。

      单元测试:单元测试的重要性不在赘叙了,现在也有许多工具可以帮助程序员并减少工作量。

      功能测试:程序员保证自己代码质量的最后一关; 为了做这样的工作我们可能必须写一些代码来测试,甚至是测试工作。使用大量的 CASE 来测试,以及错误的 CASE 。这里和测试人员的测试不同之处在于:仍然让程序员的注意力放在其自己的代码范围内,减小了排错的难度。

      如果你通过了以上的步骤都找不出你程序中有任何问题的话,那么我想你的程序应该足够健壮了。其实还有一点必须说明的就是:代码 REVIEW 。

      前面说道了程序员对待别人代码的态度是挑剔和学习的态度,所以让其他程序员来 REVIEW 你的代码也是检查程序有没有逻辑错误的很好的办法。团队中应该交叉 REVIEW 代码,这是实践的经验。

      作为一个好的程序员必须有以上的习惯,以及对待自己代码象孩子一样,我们要爱惜我们的代码,同时也要让代码走正确的路。
  • 转:自动测试闲言杂语

    2008-09-09 17:24:49


      项目的自动化测试有了一个比较理想的结果,易于扩展、维护和使用的测试架构,接近80%的覆盖率,项目组积极的反馈结果,半年的努力没有白费。回想起刚到公司时接下这个重任,自己并没有把握,甚至有些心虚,毕竟自动测试并不是我所擅长的,而且,陌生的测试工具、庞大而复杂的测试系统,对我来说都是一种挑战。心里没有把握自然不能跟老板说,打电话给一个在这方面经验很丰富的朋友,他告诉我“要自信,要靠自己”,于是,摒弃了所有的杂念和依赖,一头扎进了自己底气不足的自动化测试。

      很感激我的mentor,在刚进公司的前两周,没有马上让我接手自动化测试,使我有足够的时间熟悉系统的基本功能,就这么一个缓冲,了解了系统的基本功能,也研究了一个基本的自动化测试架构的组成,对测试系统、对自动化测试自己有了感觉。熟悉测试系统,这是软件自动化测试的第一步。

      我的一些刚来的新同事或实习生,总是迫不及待地想学习自动化测试或者是想通过自动测试脚本学习业务,我总会告诉他们,熟悉业务是自动测试的基础,不要小看手工测试过大夸大自动化测试。如果一个系统你都没有亲自手工测试过,又怎会做好自动化测试呢?

      用什么工具,我没有选择,因为项目组在我来之前就已经决定了。关于工具的选择,我看重的首先是它是否能够满足项目的需要,是否容易扩展,可以满足系统任何功能的测试自动化;其次是它是否易用,能否容易上手;当然最重要的是它的稳定性,是否不需要人工干预就能稳定地批量运行所有的自动化测试脚本。这三点,项目组所选择的工具都满足了,我自然乐于接受。选择合适的测试工具,是软件测试自动化的第二步。

      开始做自动化测试,是从系统的基本功能开始,目标是每次出built都需要花半小时以上的手工smoke test cases测试自动化。在我接手前,已经有同事做了页面相关的功能测试,看了一些以前的脚本,只是简单的录制、回放,因为没有整理过,也就没有业务逻辑和注释,花了很大的精力才弄清一个脚本的步骤和功能。而且,这些脚本中,关键字的参数化做得不好,每次运行都需要手工修改,需要手工来干预的脚本,只能算是半自动化。最严重的问题是,同样的功能,同样的脚本,会被重复地拷贝,当这个功能或业务流程被改变的时候,所有相关的脚本都需要修改,那将会是很大的维护代价。思考了一天,我决定放弃原有的所有脚本,重新设计系统的架构。放弃原有的两百多个脚本,有些可惜,但如果按照原来的思路走下去,我将会付出更大的维护代价。有舍才会有得。

      问题我看到了,知道要改,但至于怎样改,心里并没有把握,我知道自己需要时间去研究。我将用于smoke test的系统最基本的功能挑出来,作为设计的研究对象。Web测试自动化,无非就是录制、整理和回放,录制和回放都是简单的事情,关键是整理,好的脚本,应该容易扩展、维护和使用。这十几个脚本,我花了很多心思,不断地思考、不断地改进、不断地与我的同事讨论。慢慢地,自己的思路清稀了起来,做出了自己想要的架构。首先是容易扩展,能够满足现在的功能需求,也能满足以后需要测试的功能的需求。第二,容易维护,当业务流程、接口或页面变动的时候,只需要做一些简单的修改就可以实现。第三,可读性强,别人能够容易读懂和接手维护。第四,容易使用,项目组的其他人想要使用的时候能够简单地搭建和运行。第五,有统一的编码规范、存储规范和编写风格。最后,是最重要的一点,是脚本具有很高的可信性以及自动运行的稳定性。

      我像绣花一样一点一点地将这个自动测试架构绣了出来,比别人多花了N倍的心思和时间,晚上从公司走出来,傻傻的望着夜空数星星,虽然累很仍然很快乐。

      从系统的基本功能入手,设计自动测试架构,这是软件测试的关键一步。架构的好与坏很重要,它影响到系统的扩展、维护和使用,如果想要系统容易扩展和维护,一定要多花心思在设计上。很多同行问我使用什么测试工具,我会告诉他们,用什么测试工具其实并不那么重要,不同的人使用同样的测试工具,会做出效果完全不一样的东西,那是因为他们的架构不同,设计比工具重要得多。

      架构出来之后,就是系统功能的自动化脚本编写,因为项目的原因,当时的自动测试团队已经解散,我面临的是只有一个人的自动测试团队,怎样将上千个测试案例自动化,成了我头疼的问题。至今仍然很感激我的老板和项目经理,调配给我足够的资源,真正的打开了项目的软件测试自动化之门。团队中的其它成员,都是没有自动化测试经验的同事,给他们足够的培训和技术支持很关键。他们所负责的功能,我都会写一个例子,他们可以参照例子按照我们自动测试架构编写规范写脚本,遇到技术问题或业务问题,我会协助解决,在整体的架构上,我会全局把握。那一段时间,特别忙,架构的扩展、业务的熟悉、问题的跟踪解决,有时候同时有好几个问题在等着我解决,但就是这么一段忙碌的日子,从对系统基本业务的理解到系统业务的全面理解,从原来的只有十几个测试案例的自动化测试脚本到上千个自动化测试脚本的实现。很感激我的这些同事,现在他们大部分都回到了他们原来的角色,我也将要开始担任新的角色,但那一段一起工作的日子,我会记在心里。也是因为大家一起的努力,老板原要求实现web页面自动测试或系统30%功能的自动化测试,我们最终实现的是几乎所有接口所有检查点的自动化测试,接近80%的测试覆盖率。

      自动化脚本的编写,当然要注意全局的把握和review,不同的人会有不同的风格,稍不注意就会问题多多。

      脚本编写完成之后,自然是使用。脚本在前期的使用是功能测试和数据准备,在项目稳定之后的最大价值就是回归测试。我将脚本分为了三个级别:基本流程测试脚本,用于每次出新built安装后做smoke test;关键功能测试脚本,每次出新built后对所有重要功能进行回归测试,确保改动不会对原有功能的造成影响;全面回归测试脚本,一般每周跑三次或者是系统经过比较大的修改后作回归测试。自动测试脚本在回归测试中发挥了出色的作用,特别是系统在上线前夕,为了适应客户的需求,功能不断修改,对于原有的功能,自然不可能都手工测试,脚本在这个时候的意义特别大。

      同事或朋友经常问我,自动化测试应该在什么时候介入?如果系统的功能需求和接口定义都很清晰,系统开发完成并且基本功能手工测试成功后,就可以开始编写自动化测试脚本了,一方面可以利用脚本做功能测试和bug验证,另一方面也可以用来做回归测试。但如果系统的变化比较大或接口的定义不够清晰,最好还是先手工测试,待功能比较稳定之后再写脚本,因为如果功能的变化太大,维护脚本的付出可能远远小于脚本可以带来的效益。

      当然,并不是所有的系统都适合做自动测试,如果只是一些短期的项目,或者是脚本不会被重复利用,就没有做自动化测试的必要,成本会远远大于收益,也就没有做自动化测试的必要了。反之,如果是产品的测试或长期的项目或是自动化测试脚本会被反复使用,自动化测试就显得很有必要了,做完一套脚本之后就会反复被使用,当然可以节省很多成本,也可以提供测试的效率。

      这个架构,自己付出了很多心思,付出所得到的回报找到了自动测试的感觉,底气不足变成了胸有成竹。项目组的其它团队也看到了自动化测试的好处并打算参考我们的架构实现自动化测试,再做设计,扬长避短、一气呵成。

      敲完这些文字,也就意味着我的自动化测试工作暂告一段落,下周开始,因为项目的需要,将会开始我的另一个全新的角色。这个架构,绝对不是完美的,肯定还存在可以改进的空间,希望接替我自动化测试工作的同事,也能像绣花一样用心去完善它。
  • ASP.NET负压测试

    2008-09-09 17:08:00

    前 言

      对于直接面对互联网用户的WEB应用,在开发设计的时候必须格外小心,因为谁也不知道在单位时间内WEB程序访问和运行的速度。所以,在程序设计完成以后,最后针对程序进行一些严格的甚至是苛刻的测试,以确定程序在复杂的网络环境和服务器高压负荷下是否可以保持正常和相对稳定的效率。

      什么是负压测试

      负压测试一般针对WEB应用进行,比如网站等。进行负压测试的目的是为了确定WEB应用在现实的网络环境中是否可以正确而安全的处理各种用户提交的不确定请求,检验程序的健壮性。

      负压测试的另外一个目的在于故意提供足够多的请求,观察程序在这种情况下的反应能力。

      为什么要负压测试

      可能大家现在都已经很熟悉一个很著名的搜索引擎Google,我们知道,这个搜索引擎不但搜索结果准确,而且,搜索速度更是奇快无比。搜索结果准确,那是程序算法在一个方面的表现,搜索速度快,则关系到整个系统的构件和程序的健壮行。如果希望自己编写的程序也可以在大访问量的情况下“从容不迫”,就有必要对程序进行负压测试。

      对于访问量较大的网站或者程序,特别是提供一些比较热门话题程序,最好在正式将网站或者程序公布以前进行比较完备的负压测试,并且根据测试即使优化程序或者合理配置服务器硬件,这样网站不至于在用户量急剧增加的情况下出丑甚至崩溃。

      使用ACT进行测试

      ACT简介

      ACT(或者MSACT)是微软的Visual Studio 和Visual Studio.NET带的一套进行程序测试的工具,也正是我们的负压测试需要用到的。ACT不但可以记录程序运行的详细数据参数,用图表显示程序运行状况,而且安装和使用都比较简单,结果阅读也很方便,是一套较理想的测试工具。

      安装ACT

      最起码,当然我们需要Visual Studio,ACT似乎还没有单独的版本出现。在这里,我们测试一个WEB Service的在高负荷情况下的运行性能。首先,在Visual Studio中打开ACT(如图)



      程序会提示是否建立一个新的工程,点击“是”,然后输入一个文字说明,出现以下界面(图二):



      打开ACT以后,我们可以开始测试了。

      建立一个新的测试

      点击菜单【Action】->【New Test】(如图三)



      会出现一个向导界面(图四)



      向导我们太熟悉了,仔细阅读每个界面的说明文字, 选择就可以了。

      编辑测试

      经过以上的设置,会出现以下界面(图五):



      很明显,以上界面我们人为的将它分为了三个部分,而且每个部分颜色各不相同。以上不同颜色的三个部分分别为:

      左边蓝色部分:导航栏,测试入口和结果人口;

      右上绿色:提示信息栏;

      右下红色:VBS代码栏,在这里编辑测试需要的一些VBS代码,测试成功有效与否,全部依靠这些代码的执行情况。所以,这些代码最好仔细考虑并且多次测试;

      在进行测试之前,首先设置测试的一些选项(菜单【Action】—>【Properties】)如图六



      在以上界面,主要设置两个参数:

      (1) Test duration设置,这里设置测试进行时间,默认为5分钟;

      (2) 在Counters标签页设置一些测试性能数据;

      以上设置完成以后,就可以开始修改VBS代码了,我们没必要遍历整个VBS代码,只看一些主要的:

      Test.SendRequest("http://localhost/")

      以上是默认代码,我们可以修改为以下代码:

      Test.SendRequest("http://localhost/philipq/wsmessages/wsmsg.asmx/MPost?webKey=w2k&UName=Ad&UPassword=pwd&UTo=Admin&UMessage=ACT+Test")

      以上代码的编写应该根据自身程序的特点来修改,以达到最好测试效果。

      执行测试

      点击工具栏的【Start】按钮开始测试如图):



      测试进行的时候,会出现以下窗口提示(如图):



      以上界面显示程序测试的时间、剩余时间、每秒提交的Request数量、提交的Request总量、错误数量等。点击按钮【Show details】可以查看详细数据。
      测试结束以后,就可以查看测试的结果了。

      阅读测试结果

      测试完成以后,可以在图二左边的Result分支点击查看测试结果,在右方的报表栏我们可以查看到以下数据:OverView、Graphs、Requests等,下图是一个OverView的数据举例:



      从以上报告可以看到,测试的程序每秒提交request23次,总共1400次。

      测试结果的使用

      根据测试的结果,我们可以知道程序运行的情况、在高负荷下服务器的承受能力。根据这些数据,我们来确定程序的性能和服务器的性能,以此来预测在程序正式使用以后可能遇到的情况和服务器需要的改进。

      其他选择

      上面介绍的ACT虽然很不错,但是,毕竟不是每一个用户都使用Visual Studio,这时候,我们可以考虑其他工具来进行测试。

      Microsoft Web Application Stress Tool (WAS)

      这个工具和ACT一样是微软的产品,但是,这个工具没有和Visual Studio集成,可以单独使用。感觉这个程序现在还在测试,但是一些基本的功能已经很完备,可以完成ACT几乎所有功能,而且,WAS使用更加简单,设置也更加完备明了。这个工具的另外一个特点是,它的报表是纯文本文件,而不是流行的HTML文件格式,但是,内容方面一点也不逊色。

      关于这个工具的更多信息,可以在这里查阅:

      http://homer.rte.microsoft.com/

      Open System Testing Architecture (OpenSTA)

      OpenSTA的特点是可以模拟很多用户来访问需要测试的网站,它是一个功能强大、自定义设置功能完备的软件,但是,这些设置大部分需要通过scrīpt来完成,因此,在真正的使用这个软件之前,必须学习好它的scrīpt编写。如果需要完成很复杂的功能,scrīpt的要求还比较高,当然,这也是它的优点,一些程序员不会在意这些scrīpt的。

      这个软件完全免费而且源代码可以下载,感兴趣的朋友可以自己修改达到要求。

      关于这个工具的更多信息,可以在这里查阅:

      http://www.opensta.org/

      http://opensta.sourceforge.net/
  • 转:如何学习自动化测试

    2008-09-09 16:51:19

    转自:http://www.51testing.com/?action/viewspace/itemid/92200.html

       从事了几年测试工作,也着实见证了测试的发展,如今测试行业对从业者的要求是越来越高,不再仅仅局限于要求会写测试用例、会细致的执行测试、能有效的发现系统缺陷等;越来越多的企业对应聘者本身的技能要求也越来越高,招聘信息中诸如“精通VBscrīpt、Perl/Rbuy等至少一门脚本语言”、“至少熟悉一门开发语言”、“精通QTP、LR等自动化测试工具”、“有大型项目自动化实施成功经验”此类的字眼也逐渐增多。目前看来,除白盒测试内容和测试管理外,主流的方向有两个:功能自动化测试和性能测试。这就要求从业人员能够在短时间内快速的掌握这些知识,才能获取到更好的工作机会。本人是名功能自动化测试的工程师,以自己学习、工作的过程结合QTP讲讲该如何学习自动化测试

        首先,想从事自动化测试,必须先了解What/Why/How,也就是常说的去了解什么是自动化测试、为什么要进行自动化测试、该如何进行自动化测试,这类的资料在网上有很多,这里就不做重复了

        其次,需要根据项目的特点,选择合适的自动化测试工具,并了解工具的特性。以QTP为例,该如何去掌握它呢?对于初学者,大多数都是通过录制的方式来生成脚本,这个阶段应该掌握的基础知识有

    1)      QTP是如何去识别对象的,对于新手经常会出现录制的脚本回放的时候报错的现象,这个时候就应该考虑为什么呢?如果很了解QTP识别对象的原理啊,我想就能很快定位到原因了

    2)      去掌握一些QTP对象的方法,如GetROPreperty、GetTOPreperty、ChildObjects等等,对于相似的方法应该去搞清楚到底区别在哪?像GetROPreperty、GetTOPreperty有什么区别等

    3)      什么是Action参数、什么又是Test参数?两者有什么区别,又有什么联系,在同一Test和不同Test间这些参数如何工作

    4)     什么是环境变量?环境变量是如何建立和使用的,环境变量在参数传递中和action参数、test参数有什么不同

    5)     了解检查点的知识,明白什么是内置检查点,什么又是自定义检查点。并搞清楚在什么时候该如何使用检查点

    6)     掌握对象库的操作,了解对象库对于测试的意义,象是否启用智能识别对测试脚本有何影响、为什么同一对象识别起来会有_1、_2之类的后缀等都是需要去研究清楚的问题

        这几个问题都搞清楚的话,那基本就能够利用QTP生成正确的脚本了,当然以上只是部分必须掌握的内容,其实还是很多细节的设置,就需要在实际运用中去掌握了

        接下来,就可以进一步提升自己的QTP运用水平了,这个阶段就需要去学习vbs知识和如何运用描述性编程实现脚本了,同时在这个过程中还需要去学习html知识、DOM、XML、以及像excel、word等的API知识了,总的来说,这个阶段应该掌握的内容大体上包括

    1)     VBscrīpt的基础知识,熟悉常用的方法和函数,掌握文件对象的操作等

    2)     熟练掌握XML技术;excel、word等API对象,可以根据需要创建日志

    3)     熟练掌握DOM和HTML知识,能够结合这些技术对Web页面进行解析

    4)     掌握数据库的基本操作语句,能够利用ADO对象进行数据操纵

    5)     熟练掌握正则表达式,很多时候处理对象问题相当方便

    6)     掌握如何调用dll进行工作

    7)     能够利用QTP的自动化对象模型创建出需要的运行模式

    8)     掌握WMI知识

        以上只是我考虑到的部分,并不全面,呵呵,供大家参考,当然这些技术主要是针对Web系统运行,因为我们的系统就是B/S的,呵呵。如果这些知识都能够扎实的掌握的话,个人认为,基本上能够处理自动化过程中的绝大多数问题了,这个时候你对自动化测试的技术应该是有一定积累了

        接下来就需要考虑自动化测试框架问题了。当脚本规模到了一定的程度,就会面临一些问题,如:

    1)       如何有效的管理并调度脚本

    2)     如何实现脚本运行的无人值守,测试过程中能够自动进行错误处理并进行日志记录

    3)     如何生成简介明确的测试报告

    4)     如何能够更加高效的维护测试脚本

    5)     实现框架代码和业务代码的分层、业务脚本和业务数据的分离

        这个阶段主要体现的是测试人员的测试思想,是可以脱离工具独立存在的过程。当然各个公司项目的实际情况不同,导致设计出来的思想不同,但总体上来说一般包括数据驱动和关键字驱动两种模式。后者实现的技术难度大于前者,大多数公司目前都采用的数据驱动模式。这个阶段不应局限于技术运用上,而需要从测试全局考虑,进行分层设计、模块化实现,减少代码之间的耦合

        如果以上三个方面都能够做的很好的话,那么恭喜你,你已经可以独立负责项目的自动化测试建立工作了,呵呵!

        总之,学习自动化测试需要在实际项目中进行,这样提高的会比较快,项目中运用了很多种技术,自动化实施过程会碰见各种各样的问题,是很好的学习机会,关键要善于总结、积累经验,只要能够把各个细节做好,那么你一定能够成为一名优秀的自动化测试工程师

数据统计

  • 访问量: 5585
  • 日志数: 9
  • 建立时间: 2008-09-09
  • 更新时间: 2008-11-12

RSS订阅

Open Toolbar