脑袋里装的浆糊咩?总是记不住,总是做不对。。。。要说你多少次???

发布新日志

  • 存档:软件测试面试题

    2010-07-23 19:35:35

    软件测试面试题分享

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿  | 每周一问,答贴有奖

      1、软件质量的定义是什么?

      2、软件测试的对象包括哪些?

      3、试结合软件开发流程模型,描述对应不同的阶段测试需要哪些工作

      4、单元测试、集成测试、系统测试、验收测试各测试的正确策略含义和被测对象是什么?

      5、单元测试、集成测试、系统测试的侧重点是什么?

      6、alpha测试和Beta测试的定义是什么?并描述Alpha、Beta测试的区别?

      7、白盒和黑盒测试的定义是什么?

      8、软件测试过程中都有哪些工作要做,分别由哪些不同的角色来完成这些任务?

      9、测试计划的目的是什么,测试计划主要包括哪些部分,每一部分主要的内容和作用是什么,其中哪些是最重要?做好测试计划工作的关键是什么?

      10、测试计划的目的是什么?测试计划的内容都包括哪些?其中哪些是最重要的?

      11、什么是测试用例,它由哪些基本元素组成?并举例说明

      12、什么是测试脚本,测试用例与测试脚本两者的关系是什么?

      13、你认为提前做好测试用例有用吗?为什么?

      14、如果业务层和数据层之间有信赖关系,你该怎么写单元测试?

      15、对于产品的用户友好性测试,你认为从哪些方面来测试

      16、bug中需要包括哪些内容并举例说明。如何提高bug记录的质量?

      17、bug管理系统的主要功能是什么,以及在项目中各个角色的使用者是如何使用bug管理系统的?

      18、若你提交了一个bug但开发人员说这不是问题,你该如何处理?

      19、你认为一个测试工作人员最基本的素质是什么?从(能力、责任心)选一个,简答为什么?

      20、怎么认为测试可以结束了?在你以前的工作中,对于分配给你的模块你用什么标准来衡量自己测试完毕了?

    21、你认为一个合格的测试人员应该具备哪些素质?请说明原因

      22、你认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?以前做过性能测试吗?使用哪些工具进行的?

      23、设要对一个自动饮料售货机软件进行黑盒测试,设软件的规格说明如下:

      有一个处理单价为1元5角的盒装饮料的自动售货机软件。若投入1元5角硬币,按下“可乐”“雪碧”或“红茶”按钮,相应的饮料就送出来,若投入2元硬币,在送出饮料的同时退还5角硬币

      (1)、试用因果图法,建立该软件的因果图;

      (2)、设计测试该软件的全部测试用例。

      24、设计最少的测试用例实现条件覆盖:

    if(A>0 and B>0)
    X=X/A;
    if(A>1 or X>1)
    X=X+1;
    System.out.printf("X="+x);

      25、使用你熟练的一种语言,将一个单向链表反转

      26、有两表

      表一 AA

      种类 T  库存总量 S
      A        997
      B       1234

      表二  BB

      种类T   出库数量 S
      A        105
      A        213
      B        115
      B        211
      B        303

      用一条SQL语句求出A、B两类货物库存各剩多少?

      27、下面是一个注册入口,输入用户名和有效的邮箱,点击“立即注册”按钮。你会在输入的邮箱中收到一个注册验证的邮件,该邮件中有一个链接,点击后,就能注册成功。请你考虑应该从哪些测试要点来展开测试?

  • 存档:必须掌握的shell编程

    2010-07-20 20:21:01

    转贴Linux Shell编程(基础教程)

    Linux Shell在线模拟器
    http://www.masswerk.at/jsuix/index.html

    一个在网页上的linux shell模拟器,是可以为那些不熟悉linux 的人们在Microsoft Win环境下练习linux 的一个工具。既不耽误学习,也不耽误正常的工作,哈。


    E w+^Ipl16573151Testing软件测试网x6g3rq'Z$E
    1. Linux 脚本编写基础
    ^1T0CO^_;i1657311.1 语法基本介绍51Testing软件测试网)S4lk a*z YI'b9X/X
    1.1.1 开头51Testing软件测试网 |5}^$ws:i;Im y
           程序必须以下面的行开始(必须放在文件的第一行):51Testing软件测试网](J:a&c j,qH
           #!/bin/sh
    ncC S[u*y5`-O W165731    符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。  当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
    ?WJZ"Q8Y?~165731    要使脚本可执行:   编译 chmod +x filename 这样才能用./filename 来运行51Testing软件测试网 UB%tl-c2H)V"k
    1.1.2 注释51Testing软件测试网S,N%?RF&N7G b
      在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。51Testing软件测试网"uJP/C:?:vI a6nMsI
    1.1.3 变量51Testing软件测试网CB T1H5j r ty
      在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
    Z7ZD!C%v[Tt `165731        #!/bin/sh51Testing软件测试网-jB#t0P8CJj
            #对变量赋值:51Testing软件测试网D`*z7o,D X/z
            a="hello world"
    :]g$K~7Ms;ecU165731        # 现在打印变量a的内容:51Testing软件测试网$jd W;OW
            echo "A is:"51Testing软件测试网2x(r5A d"q [ ~i
            echo $a51Testing软件测试网(ap&| {Z
           有时候变量名很容易与其他文字混淆,比如:
    n3gf'|oE#S165731        num=251Testing软件测试网$kfk1AY
            echo "this is the $numnd"
    ;z3_5|6\En165731       这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:51Testing软件测试网,y!Qs R:H9L/{
            num=251Testing软件测试网CT,^g#y
            echo "this is the ${num}nd"51Testing软件测试网.^ n#P2^;?0q
            这将打印: this is the 2nd51Testing软件测试网8F na^1Rf
    1.1.4 环境变量
    `|%G3oW#Rx)F165731       由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录51Testing软件测试网 A0f S;D{;d
    脚本中使用环境变量。51Testing软件测试网\ BM!s;`@
    1.1.5 Shell命令和流程控制
    6? kD$c8\-_5j*K+h165731       在shell脚本中可以使用三类命令:51Testing软件测试网z0jr6SIg$m
           1)Unix 命令:
    8pDQe }8}BC165731      虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。51Testing软件测试网/m|&@M Q;as
            常用命令语法及功能51Testing软件测试网Q l\5e:SS&kw9y-G
      echo "some text": 将文字内容打印在屏幕上51Testing软件测试网9Qb1I k t
      ls: 文件列表51Testing软件测试网x6JQ E_
      wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数51Testing软件测试网"E c}+s%QV?ds&T!f
      cp sourcefile destfile: 文件拷贝
    -t @:lU6V'K n(j.n165731  mv oldname newname : 重命名文件或移动文件
    Fu.nv2^/U8PEi]0p165731  rm file: 删除文件51Testing软件测试网'w5t3c2j+b@ d
      grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt51Testing软件测试网&o8g Ft8R&}o1j
      cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
    j5zZ HeH#VdbH165731  cat file.txt: 输出文件内容到标准输出设备(屏幕)上51Testing软件测试网)AtC D@S*ZSy^
      file somefile: 得到文件类型
    s b?^Dv O#q1X165731  read var: 提示用户输入,并将输入赋值给变量51Testing软件测试网6`IP8LUk)P#zB
      sort file.txt: 对file.txt文件中的行进行排序51Testing软件测试网)H'U$aX$P+c*R F)WF2T
      uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq51Testing软件测试网!pE0}4u'M|
      expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
    .N3G9j@&q$f.A165731  find: 搜索文件比如:根据文件名搜索find . -name filename -print
    "]5Z!}xZ3O \165731  tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile51Testing软件测试网9]R$V)ax}
      basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
    v1zHfI6{)x165731  dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin51Testing软件测试网^G s0cgt)h
      head file: 打印文本文件开头几行
    R/xfC3?7`T165731  tail file : 打印文本文件末尾几行
    fBvQX2Wvf165731  sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
    LmFsy1Q165731  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。51Testing软件测试网]Q5h"p C
    cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA
    +a5{F5@4j"b4cX&|:p165731        命令输出结果为:Adam Bor, IndiaKerry Miller, USA
    t]_4| i5}9F165731        2) 概念: 管道, 重定向和 backtick
    I&JS2uJ"L0C @165731  这些不是系统命令,但是他们真的很重要。
    :jT0prMst!\165731  管道 (|) 将一个命令的输出作为另外一个命令的输入。
    Yd w,Z ~ r O165731                 grep "hello" file.txt | wc -l51Testing软件测试网6R G9F#FVMcj P
      在file.txt中搜索包含有”hello”的行并计算其行数。
    ng"V o;B4v,o1Xx165731  在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。51Testing软件测试网[Lf]*h;oq
      重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。51Testing软件测试网9N!MH`+Q
          > 写入文件并覆盖旧文件
    _+g0`4fH$h:VJ:[1x165731      >> 加到文件的尾部,保留旧文件内容。
    )aZ2O:PRG3q165731        反短斜线
    1fu8l-DVV+e2TNt165731     使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
    j YN#U\&M165731         命令:
    1S4}*k;wg165731           find . -mtime -1 -type f -print51Testing软件测试网.r&qp;Vec)u7x O.AE
         用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
    {[k^ P7C S'N!FY165731             #!/bin/sh
    x+O0L X%Q1Zp#JG165731             # The ticks are backticks (`) not normal quotes ('):
    \@ KL%c$K6vv y/P/X2P165731              tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`51Testing软件测试网(? W\D6h U
           3) 流程控制51Testing软件测试网 TE0ylH\+?-]
            1.if
    "N6Lv,i"S[165731    "if" 表达式 如果条件为真则执行then后面的部分:51Testing软件测试网/gB8a2Vn"zH
                if ....; then51Testing软件测试网 v R3U@.C;{6Ml D
               ....51Testing软件测试网un6\:v3kY&o7{!w
               elif ....; then51Testing软件测试网AF%NW5U
               ....51Testing软件测试网k%X}:KZiQ]G1n
               else
    QK&r6R?Z165731           ....
    jn,cv;j165731           fi51Testing软件测试网wX9P0soF;q
               大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…51Testing软件测试网9\$nC D7` G
        通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。51Testing软件测试网lxx O/u/Ka
                     [ -f "somefile" ] :判断是否是一个文件51Testing软件测试网4UE0RJ(~0X'|~
                     [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限51Testing软件测试网-j+O,lmT
                     [ -n "$var" ] :判断$var变量是否有值51Testing软件测试网|j$^ Jv(uiX,g
                     [ "$a" = "$b" ] :判断$a和$b是否相等
    O-bL!a}"J \165731    执行man test可以查看所有测试表达式可以比较和判断的类型。
    "Xq1JZ'ZU%Ft&GM P W165731   直接执行以下脚本:51Testing软件测试网kK6mE+H2|.vK
                   #!/bin/sh
    2G*Qs Uc,Epsfc#t165731               if [ "$SHELL" = "/bin/bash" ]; then
    v.Q*aCTj165731                    echo "your login shell is the bash (bourne again shell)"51Testing软件测试网B!e^ v\+N e4Qq
                   else
    !Wjw5o"cym g]6Jm165731                    echo "your login shell is not bash but $SHELL"51Testing软件测试网 g:wc%ECq C2{$X
                   fi
    Aa1Kx fa L165731   变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
    /QNplQ z$A ]jt165731        51Testing软件测试网!I1g*G zU0?^'cv
            快捷操作符
    D0}.f;N D.z!e165731        熟悉C语言的朋友可能会很喜欢下面的表达式:51Testing软件测试网#}^9W}v!D
                      [ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
    j(~{^^s%j165731  这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:51Testing软件测试网h*V_B8`ko gS)H
                     #!/bin/sh
    qGp?TZ9m6p%w?165731                 mailfolder=/var/spool/mail/james
    0Q(o%j"~7or165731                 [ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
    9X'^,HY?165731                 echo "$mailfolder has mail from:"
    F7fn;vksx v;X165731                 grep "^From " $mailfolder51Testing软件测试网9[&ZcS)VVr+W$^H]$B$W
            该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:51Testing软件测试网3@%J| G!R U
      -打印错误信息51Testing软件测试网v9w/S t/O.Y6G%?Z
      -退出程序
    4j-B*v@9uyO)W165731  我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。51Testing软件测试网x b7Iqm0o(w g
      不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。51Testing软件测试网Mycc+T0@#cla C(}
    51Testing软件测试网.Lb[0dZ$_!G
             2.case51Testing软件测试网 UrG5} qS3lv
                   case :表达式可以用来匹配一个给定的字符串,而不是数字。
    6J!?6H5n:q{9c W(`165731                      case ... in
    h h+k0e-J165731                            ...) do something here ;;
    m {xQ{/s v P3m165731                      esac
    L%n]8K5wwLh}165731         让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
    &X;[G6P'B165731                     file lf.gz
    hp0PS'Un@165731                   这将返回:51Testing软件测试网 d"A&_1I4o
                             lf.gz: gzip compressed data, deflated, original filename,51Testing软件测试网/H-ikt;qJH/I
                             last modified: Mon Aug 27 23:09:18 2001, os: Unix
    9G-r0F\L Q a6LUF165731             我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:51Testing软件测试网4o.Yq4y!Z
                   #!/bin/sh
    q^_/o/@kJi)i4y165731               ftype=`file "$1"`
    ;Fo|3Km0hX165731               case "$ftype" in
    5[F*x }$C165731                       "$1: Zip archive"*)
    T } h&v$e-I"{t165731                  unzip "$1" ;;51Testing软件测试网Z\Iiw$]9Lil3Q!}!O
                             "$1: gzip compressed"*)51Testing软件测试网!Kq$@!R&b6rw}
                        gunzip "$1" ;;51Testing软件测试网o;~2bL}8OS
                              "$1: bzip2 compressed"*)51Testing软件测试网x;Dp}suB
                         bunzip2 "$1" ;;
    M8Q9?2? thm(c_d+_5k165731                           *) echo "File $1 can not be uncompressed with smartzip";;51Testing软件测试网MHW1I5}{Rt1n,X
                    esac51Testing软件测试网rZ*{0?@.]
             您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。51Testing软件测试网 O0} U,Rp
    也就是说,当我们运行:51Testing软件测试网"Q#j8w n%|V?V^
                        smartzip articles.zip51Testing软件测试网 m{ F pk g @
                        $1 就是字符串 articles.zip
    .F M~#}gg.yL&c4z!e165731                3. selsect
    M:RD7VoTOnL:h165731                  select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。
    K~:o+{ fq z3B165731                    select var in ... ; do
    #U-d]jf5w)W-?w165731                         break
    a'iy/u)G;u"d ^`n165731                            done51Testing软件测试网!dqC.IJp
                                .... now $ var can be used ....
    6Hn#z`lIh6n fa|165731                   下面是一个例子:51Testing软件测试网N%Y4\ I Q#J3ev)Q
                             #!/bin/sh
    K.CF]4v;D F*{7o165731                         echo "What is your favourite OS?"51Testing软件测试网'F,ddZrp7jR
                             select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
    ^7` c1ygjGF1i)C165731                    break51Testing软件测试网b"a H(b?{ j HG
                                    done51Testing软件测试网X1o] [crq9G}-U
                               echo "You have selected $var"51Testing软件测试网6rU+I @fuqR(P
                  下面是该脚本运行的结果:
    5sC&|HP165731                               What is your favourite OS?
    V1t?Ziwh165731                                    1) Linux51Testing软件测试网6m/r \;x/S(h?,@
                                        2) Gnu Hurd51Testing软件测试网;`&m[;?a,L`
                                        3) Free BSD
    ^5d!q~,~1J)H"bv165731                                    4) Other51Testing软件测试网m?X }+R3_A
                                      #? 1
    :UN-J*^S5@%`k165731                                You have selected Linux51Testing软件测试网%ftS%B-z5y+uG
             注:var是个变量,可以换成其它的值。break用来跳出循环,如果没有break则一直循环下去。done与select对应。
    (m{n(S xZ;kF8B165731                  4.loop51Testing软件测试网u|ea%i
                          loop表达式:
    %JQ\0l GQ165731                            while ...; do
    }\J'lj5q&kag(K!\165731                                      ....51Testing软件测试网{+t'S_;{#Ppa
                                   done51Testing软件测试网/D8}V[X)q
                 while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.51Testing软件测试网1Rbo)K$U(y9z
    关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。51Testing软件测试网s4e+T4P)C/O
      51Testing软件测试网*Vs1|0} i;u$v~;{)l
                         for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
    9Up}qj wnE0m165731                          1,   for var in ....; do51Testing软件测试网 tio'}})TMi
                                     ....
    At)k x3dY0w165731                                done51Testing软件测试网/oM5f|VC
                           在下面的例子中,将分别打印ABC到屏幕上:51Testing软件测试网{'Kimi)C3Q
                                #!/bin/sh
    H6j/k]&}1z165731                                    for var in A B C ; do51Testing软件测试网~ [ _;o7LK~
                                     echo "var is $var"51Testing软件测试网)m4taT'Bu'y ]Ib
                                         done
    +X)o!hX.i+L16573151Testing软件测试网X:{Z,e;U
                               2,   for (( 条件一; 条件二; 条件三 );do
    /\f'n9W7mdM165731                                ...
    -q8W [0aj165731                                done
    :uiZ:Z9i(tg}\165731                        例:
    #] EO{#r$a:j H165731                     51Testing软件测试网5d$b qW6q6tr
                       for ((i=1;i<10;i=$[$i+1]));do51Testing软件测试网Hkj&}+c

    _*M4m@ K9Zz165731                             echo "a"
    g%_)W m4u YH9q{165731                          done51Testing软件测试网8P'n%i9f |ijK
    输出:
    $n1X,_+U*Er cn165731
    OH_8mi5M-P E v?165731a
    ~M[F q/\165731a
    ;T7sp8P1IWV/F&_165731a
    "K*^;^:OW4jvX165731a
    v3E[r/f.[s(~6f165731a
    9jW/V+o/X165731a51Testing软件测试网/rt+](| W m(PU-m'S
    a
    4]`h@9Y0o165731a51Testing软件测试网 iRi:`,oQ-h
    a51Testing软件测试网]i*e~8q3U*YR

    $_'Bn;L0\2sa1g R165731条件一:这可以看成是『初始值』,如上面的例子中,初始值是 i=1 啦!51Testing软件测试网HpOK F!YVE|"tp
    条件二:这可以看成是『符合值』,如上面的例子中,当 i<=100 的时候都是符合条件的!
    gt5hO1c#w.wB165731条件三:这可以看成是『步阶』!也就是说, i 每次都加一! 所以啦!上面的例子是说:由 i=1 开始到 i<= 100 ,每次 i 都加一来执行底下的程序段(就是 s=s+i ),当 i >100 (也就是 i=101 )就跳出这一段程序段!怎样!不难吧!51Testing软件测试网8y%CvN9gJ
    51Testing软件测试网.aXwaoA Z0uX5b4h
    51Testing软件测试网9L&C T F8hCG0Z1O*e

    $l$U-M:hBi:J;s1s |165731
    2Mf@fA:Q165731                        下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:51Testing软件测试网yeUp/s:E8_*j*g9YAc
                              #!/bin/sh51Testing软件测试网bh;IQ,Y`$P'|-G&g t
                              # list a content summary of a number of RPM packages
    OC]l rS`g165731                          # USAGE: showrpm rpmfile1 rpmfile2 ...51Testing软件测试网 E2T f$M N'v\/v:r"a'u
                              # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
    M [_kG1q [.gYE-D165731                            for rpmpackage in $*; do51Testing软件测试网!P3?/f*[|z ?*R
                             if [ -r "$rpmpackage" ];then
    )R/\_~7G4t5{k165731                         echo "=============== $rpmpackage =============="
    Z T;V)\ mA165731                          rpm -qi -p $rpmpackage
    }nfV U!k165731                          else51Testing软件测试网sNp9LY+x;ug.B^
                               echo "ERROR: cannot read file $rpmpackage"51Testing软件测试网 YY u'~%bm$\3A
                             fi51Testing软件测试网f$nd*n5se3`.j
                                  done51Testing软件测试网H,Ev,`.v2^
                       这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。
    2y.h0v%_L}165731                        如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
    .vqJ'wpbLMd"N165731                                   此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
    `/^(SJ;cIB.L9X165731
    j&o n {5rfU6y/@Q16573151Testing软件测试网/L4h[V&^d:Ybv#\3hG

    .lk u(bHzo0c.g165731『until:直到条件相同的时候才离开程序』;51Testing软件测试网8T1g8_6Z5bc"\6v5Li
    『while:当条件相同的时候,就继续做!』  51Testing软件测试网%Pf)la[ {V/S

    yov~i,f ?165731until [ condition1 ] && { || } [ condition2 ] ...
    u4R1p5K4]B6u165731
    L w,o p zF0G'[165731
    %{-qKcdI(\16573151Testing软件测试网 CbCa9@
    51Testing软件测试网p4LZ%p"z+J3H
                     5. 引号
    U3[0[[kK T165731                   在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。51Testing软件测试网)J _D]%cS"J#w&l
              编译SHELL脚本
    J {bRK`*? qT165731          #ch#!/bin/sh mod +x filename51Testing软件测试网J-G6[3z8i7x
     cho *.jpg       ./filename 来执行您的脚本。51Testing软件测试网j.r:fi l+NV.I.X;{
      这将打印出"mail.jpg tux.jpg"的结果。
    G'a3_y-E-\},vE{C165731    引号 (单引号和双引号) 将防止这种通配符扩展:
    'e7UW#U\3e/Yuh&X165731             #!/bin/sh
    nu2jT I"hz9g165731             echo "*.jpg"51Testing软件测试网&?T.{? @4[H-iN ]
                 echo '*.jpg'51Testing软件测试网LK{sk,g*^
      这将打印"*.jpg" 两次。
    K^S*l9Hz;Lm%?165731  单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。51Testing软件测试网Ytsv-K
             #!/bin/sh
    zg#Vf"mLA0S6yu165731         echo $SHELL
    $A.|1B:M6j8i'EC9?o:_165731         echo "$SHELL"51Testing软件测试网cBV%E~
             echo '$SHELL'51Testing软件测试网RJ(P!{ E}c
       运行结果为:51Testing软件测试网(S$c ^W O)v?
                 /bin/bash51Testing软件测试网|;p!FK-g(_"K4r| D
                 /bin/bash
    6c,U(P1?p165731             $SHELL51Testing软件测试网M8oP:ukC
      最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:
    j_LG^8l5h!`"Ru165731           echo *.jpg
    xL6r%z.Xf165731           echo $SHELL
    !E6Q5lHX*H|165731  这将输出:
    #x5i J K0}165731           *.jpg51Testing软件测试网s!M&U j&d
               $SHELL
    cjy?/Ju.s}N165731         6. Here documents
    :_^f.J/mm/[165731          当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 "Here document" 以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:
    :L~1bJ3MN165731         #!/bin/sh
    3c^0Z(k!N9d4c165731         # we have less than 3 arguments. Print the help text:
    |k `!R G165731            if [ $# -lt 3 ] ; then51Testing软件测试网G+B vf8E8\
                     cat <51Testing软件测试网z'}#ed/|4d;]giW
                     ren -- renames a number of files using sed regular expressions51Testing软件测试网vPD"Y*Y'e
                     USAGE: ren 'regexp' 'replacement' files...51Testing软件测试网H0Z+h.J5K
                     EXAMPLE: rename all *.HTM files in *.html:51Testing软件测试网 J#@|;n\W9V
                  ren 'HTM$' 'html' *.HTM51Testing软件测试网3`V-NJoVgw
                     HELP51Testing软件测试网J`7j M0i5o'j
                  exit 051Testing软件测试网)T'd$_*u-nf*S.uS
                fi
    "Ax_ pry KXl165731            OLD="$1"
    &V$CD#I1trwZM165731            NEW="$2"51Testing软件测试网Go4qt(})Y)a2Rq7g
              # The shift command removes one argument from the list of
    yQ#JY v%d[5l165731          # command line arguments.
    X6\1m4pL8U\4W165731          shift
    TWfg"r165731          shift
    .X`;`Yuz$D%N165731          # $* contains now all the files:
    JuQ0bNx|165731         for file in $*; do
    +s6OV-u/r`X%h(W l165731          if [ -f "$file" ] ; then51Testing软件测试网9uU5A,P+d1M7V"N
                 newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
    o\:t6R%gl H4z165731             if [ -f "$newfile" ]; then
    Q(LX)dK+u165731                  echo "ERROR: $newfile exists already"
    ft%Fn Hb@165731             else
    B4ZYxP`l165731                  echo "renaming $file to $newfile ..."
    4J1l P8yKs165731                  mv "$file" "$newfile"
    5s5pK4VvZ165731              fi
    m']b(Q%P!p8Q~i165731            fi
    K"Dp {/p[165731           done
    [WR6|!h%eq#]i4zh7K165731        这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新
    &J I'[D1S165731文件名。然后使用mv命令进行重命名。51Testing软件测试网P4|;U"Md
              4)函数
    #MN }"KQ'L165731             如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:51Testing软件测试网*@~9L o,T K
              functionname()
    p:y7i%k1yB \O165731          {51Testing软件测试网,l+N}xI7?0@!\Y5A{
                     # inside the body $1 is the first argument given to the function
    3Fae j-F165731                 # $2 the second ...
    .dNf7@/z8L(J&sC&t165731                             body51Testing软件测试网]r2B:O~ o1y
                }
    Qs6`j @v(a165731          您需要在每个程序的开始对函数进行声明。
    gRK'SII2z C165731   下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。
    )I^ [AY%x165731           这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
    ;yI q8` Or1B]k165731               #!/bin/sh51Testing软件测试网P X"M9dI(u\
                   # vim: set sw=4 ts=4 et:
    v ?@?r:]8g@165731               help()51Testing软件测试网g*H4Dh g6T|
                   {
    t3{pdl~S X~b,p165731              cat <51Testing软件测试网t.V}6C {$^:^} QV$Z
                         xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
    G2z)?%qg165731                     USAGE: xtitlebar [-h] "string_for_titelbar"51Testing软件测试网6_N,}2j:W,Wg
                          OPTIONS: -h help text51Testing软件测试网9Q t;_e6W8wQ)~
                         EXAMPLE: xtitlebar "cvs"
    e V:w"GQ;\fp Z0z(yyhF165731                     HELP
    M;hc;kCB['ap-W165731             exit 0
    S'\U] ZpA165731               }51Testing软件测试网d,h'K0b eq#S4S0|n3o6{
                   # in case of error or if -h is given we call the function help:
    -UUBks165731               [ -z "$1" ] && help51Testing软件测试网&hcF[$xZ9_q
                   [ "$1" = "-h" ] && help
    4e _:Nsx1W+^m H J165731               # send the escape sequence to change the xterm titelbar:
    YY.PesO6^165731                 echo -e "33]0;$107"51Testing软件测试网l} z"W&R`nA
                    #51Testing软件测试网:s Nm"pV+s['n
                在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。51Testing软件测试网Z4_1w,VU
            命令行参数51Testing软件测试网G C;^A7Jf:[a
      我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。51Testing软件测试网Q];M2F O#HJ(z(j0P
             #!/bin/sh51Testing软件测试网?Gn7iOL"{ h z
             help()51Testing软件测试网 \$i0UcZ0bPE
             {
    1I/A vB(Q7A9f165731            cat <51Testing软件测试网ds{)S_y.H
                   This is a generic command line parser demo.
    lyNmgp165731               USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile251Testing软件测试网,J"X]x+S.y"u%_(D3g
                   HELP
    VK%r M c"Qs165731            exit 051Testing软件测试网PO,oBz"_:^
             }51Testing软件测试网.SF1c c6d6M\ C
              while [ -n "$1" ]; do
    n da"G}l/M165731        case $1 in51Testing软件测试网#nOy|1kq+H
           -h) help;shift 1;; # function help is called51Testing软件测试网n_)lzV~*LC@a1s$]
           -f) opt_f=1;shift 1;; # variable opt_f is set51Testing软件测试网7NXA"l m b
            -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 251Testing软件测试网Q"h5Wy4G
            --) shift;break;; # end of options
    7i-F-rUS8|-Y*H165731       -*) echo "error: no such option $1. -h for help";exit 1;;
    @.G$VD[;H7T165731       *) break;;51Testing软件测试网;v$D7[.M0d`'y%r!j
              esac
    3uDIV[y165731          done
    i}wAa-s"y&[K8I165731          echo "opt_f is $opt_f"
    p_ g$Y*z9U#_W U165731          echo "opt_l is $opt_l"51Testing软件测试网hC } Z8jG:b6G e
              echo "first arg is $1"51Testing软件测试网 n T sw:pb4f2rG
              echo "2nd arg is $2"51Testing软件测试网*PK0m2`1f([-I#@Ku
      您可以这样运行该脚本:51Testing软件测试网9U2l_Y#W!gf9wT-}
                     cmdparser -l hello -f -- -somefile1 somefile2
    &B@we4T165731  返回的结果是:51Testing软件测试网p'|9Xji6N
                 opt_f is 151Testing软件测试网T H8iV.]*FU
                 opt_l is hello51Testing软件测试网 Uq[ KM,u.X
                 first arg is -somefile151Testing软件测试网9]5E/x_ z+lK
                 2nd arg is somefile2
    \$g2}5_*BGuj165731  这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.51Testing软件测试网$T h6{.?i N9keJ
    51Testing软件测试网o _:dDug8R.q

    E,yb5N tp`-e&WT165731第2部分 实例51Testing软件测试网^k-l^;r|d0J

    MXp,[;IC/@[b165731    现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
    LK!f@r8Y&CA|h165731cp framework.sh myscript.
    FI Un#[,O_165731 然后再插入自己的函数。51Testing软件测试网$]eO@#_|M
      让我们再看两个例子:
    &ew \s!He-U$ik.a5YAb165731  二进制到十进制的转换
    5t F"g_Rz9Gx165731  脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:51Testing软件测试网j)? e` A Z
    #!/bin/sh
    |1u @$G.V ^t165731# vim: set sw=4 ts=4 et:
    ;V}!}p5J*A-Fco165731help()51Testing软件测试网 Y7zf3PQPjO
    {51Testing软件测试网|2o.d DTn
     cat <
    -mO'uJazi&VMd165731b2h -- convert binary to decimal
    ]k:b$~h165731USAGE: b2h [-h] binarynum51Testing软件测试网8u$rcx }B
    OPTIONS: -h help text
    %s{G-F'U*p I1Y8M165731EXAMPLE: b2h 11101051Testing软件测试网J5}6R%BR1xiz
    will return 5851Testing软件测试网S4~.uu#] zW
    HELP
    3a*OD'{Y(~8C"eXZ165731 exit 0
    0HL*n'@RNlE_Z\165731}
    2Zu2^3Emhe165731error()
    A w!O4n0br'TX165731{51Testing软件测试网 `la$O.rzHY
      # print an error and exit
    aM5O+USSLzB S165731  echo "$1"
    5Ir't5T9O.t4N8P8j165731  exit 1
    6@`;lq*N4c"AE165731}51Testing软件测试网;gI&rY\&Y}
    lastchar()51Testing软件测试网$Hf`Q7N
    {51Testing软件测试网5G%Q?7X+bD"x
      # return the last character of a string in $rval51Testing软件测试网DlA4p+Z8a9HC s[2]D
      if [ -z "$1" ]; then51Testing软件测试网 U/\g2V8J~5Aa E9C
        # empty string51Testing软件测试网mM(n AZG
        rval=""51Testing软件测试网V5S {y;S
        return51Testing软件测试网 vk*WL ]S9f'r R
      fi51Testing软件测试网2XYE@8{2Gx
      # wc puts some space behind the output this is why we need sed:51Testing软件测试网;`GN(nr(ev
      numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
    7_'U9O,B5Wh.t ]]'u165731  # now cut out the last char51Testing软件测试网 Z&Y.R]p$s7P}%O;eI'C
      rval=`echo -n "$1" | cut -b $numofchar`
    ;S1r-f_/N;z&w165731}51Testing软件测试网bZd4m9e
    chop()51Testing软件测试网*l2H$O-f }?_"Zr9N9Z`
    {51Testing软件测试网p)R1Z%NLfY ac`U
      # remove the last character in string and return it in $rval51Testing软件测试网FN+``ga0[FI
      if [ -z "$1" ]; then51Testing软件测试网 |qInc.WP-KX
        # empty string
    EL j+?d165731    rval=""
    (kcCAJG%C_GF165731    return51Testing软件测试网 M,SH8C'`8h|
      fi
    n V/s l,o9O165731  # wc puts some space behind the output this is why we need sed:51Testing软件测试网m'c&Di^ sZ2w1k_
      numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
    3Y r/t-E K VgO)f.h165731  if [ "$numofchar" = "1" ]; then
    F/_!}u)hk#p165731    # only one char in string
    @%Wd'p9g}165731    rval=""51Testing软件测试网a+y La VP
        return
    )^.I:_ Yo165731  fi51Testing软件测试网g`MY)bV;{
      numofcharminus1=`expr $numofchar "-" 1`
    5q1s o7C0J O,?~ n165731  # now cut all but the last char:51Testing软件测试网a kMxXu:g g$V!e!f
      rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`51Testing软件测试网?0y-W"zQMb
    }
    d-nb{ ^6l5A165731while [ -n "$1" ]; do
    6K/Kt g iQc zk*Q165731case $1 in51Testing软件测试网9~:ZG|~;t*dJ
      -h) help;shift 1;; # function help is called51Testing软件测试网z7^ d;y g-bz[xw
      --) shift;break;; # end of options
    G'Q%IZ@)T&}Sb(m165731  -*) error "error: no such option $1. -h for help";;
    NU`wUoT T,T165731  *) break;;
    (Q7{nKzfmJ165731esac51Testing软件测试网5aY%G%\s:t
    done51Testing软件测试网g9yua4`D.\
    # The main program
    $ER*W|C ?'H*o&j165731sum=051Testing软件测试网'YL!k8["W(u~
    weight=151Testing软件测试网cl+V"w V*rk
    # one arg must be given:51Testing软件测试网%k_7mEd.yv(m
    [ -z "$1" ] && help51Testing软件测试网 T,|A,e5E%Vkq\[
    binnum="$1"
    F)_e3_ J ?165731binnumorig="$1"51Testing软件测试网ZmX8o|j C
    while [ -n "$binnum" ]; do51Testing软件测试网2K Hs/P0O9u+xK,F
      lastchar "$binnum"
    /h VU:L{`K165731  if [ "$rval" = "1" ]; then51Testing软件测试网L'BL9A,K;A?%R%W
        sum=`expr "$weight" "+" "$sum"`
    _I _?4d~A165731  fi51Testing软件测试网*h6aJE%}k
      # remove the last position in $binnum
    w'~^ N*l4H165731  chop "$binnum"51Testing软件测试网+lmr`Yj:w
      binnum="$rval"
    1p&t0paQ165731  weight=`expr "$weight" "*" 2`
    w-nGrm_l1J165731done
    7{3_0c-m#C |.j0m165731echo "binary $binnumorig is decimal $sum"
    d b N?gJs9c165731   该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:51Testing软件测试网6SNN$@XjU#Ni
    0 * 1 + 1 * 2 = 2
    s0b(A"P |'J9
  • 存档【网络转载】:我总记不住的loadrunner关联

    2010-06-18 13:16:47

    如何在脚本中做关联 (Correlation)
    当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本。在VuGen的Recording Log中,您可以找到浏览器与服务器之间所有的对话,包含通讯内容、日期、时间、浏览器的请求、服务器的响应内容等等。脚本和Recording Log最大的差别在于,脚本只记录了client端要对server端所说的话,而Recording Log则是完整纪录二者的对话。

    当执行脚本时,您可以把VuGen想象成是一个演员,它伪装成浏览器,然后根据脚本,把当初真的浏览器所说过的话,再对网站伺服器重新说一遍,VuGen企图骗过服务器,让服务器以为它就是当初的浏览器,然后把网站内容传送给VuGen。
    所以纪录在脚本中要跟服务器所说的话,完全与当初录制时所说的一样,是写死的(hard-coded)。这样的作法在遇到有些比较聪明的服务器时,还是会失效。这时就需要透过「关联(correlation)」的做法来让VuGen可以再次成功地骗过服务器。
    何谓关联(correlation)?
    所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。
    举一个常见的例子,刚刚提到有些比较聪明的服务器,这些服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器。一般称这个辨识码为Session ID。对于每个新的交易,服务器都会产生新的Session ID给浏览器。这也就是为什么执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器会发现这个Session ID是失效的或是它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了。
    下面的图示说明了这样的情形:
    当录制脚本时,浏览器送出网页A的请求,服务器将网页A的内容传送给浏览器,并且夹带了一个ID=123的数据,当浏览器再送出网页B的情求时,这时就要用到ID=123的数据,服务器才会认为这是合法的请求,并且把网页B的内容送回给浏览器。
    在执行脚本时会发生什么状况?浏览器再送出网页B的请求时,用的还是当初录制的ID=123的数据,而不是用服务器新给的ID=456,整个脚本的执行就会失败。

    要对付这种服务器,我们必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代掉脚本中有用到Session ID的部份,这样就可以成功骗过服务器,正确地完成整个交易了。
    哪些错误代表着我应该做关联(correlation)?
    假如脚本需要关联(correlation),在还没做之前是不会执行通过的,也就是说会有错误讯息发生。不过,很不幸地,并没有任何特定的错误讯息是和关联(correlation)有关系的。会出现什么错误讯息,与系统实做的错误处理机制有关。错误讯息有可能会提醒您要重新登入,但是也有可能直接就显示HTTP 404的错误讯息。
    要如何做关联(correlation)?
    关联(correlation)函数
    关联(correlation)会用到下列的函数:
    • web_reg_save_param:这是最新版,也是最常用来做关联(correlation)的函数。
    语法:
    web_reg_save_param ( “Parameter Name” , < list of Attributes >, LAST );
    • web_create_html_param、web_create_html_param_ex:这二个函数主要是保留作为向前兼容的目的的。建议使用 web_reg_save_param 函数。
    详细用法请参考使用手册。在VuGen中点选【Help】>【Function reference】>【Contexts】>【Web and Wireless Vuser Functions】>【Correlation Functions】。
    如何找出要关联(correlation)数据
    简单的说,每一次执行时都会变动的值,就有可能需要做关联(correlation)。
    VuGen提供二种方式帮助您找出需要做关联(correlation)的值:
    1. 自动关联
    2. 手动关联
    自动关联
    VuGen内建自动关联引擎(auto-correlation engine),可以自动找出需要关联的值,并且自动使用关联函数建立关联。
    自动关联提供下列二种机制:
    • Rules Correlation:在录制过程中VuGen会根据订定的规则,实时自动找出要关联的值。规则来源有两种:
    o 内建(Built-in Correlation):
    VuGen已经针对常用的一些应用系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,内建关联规则,这些应用系统可能会有一种以上的关联规则。您可以在【Recording Options】>【Internet Protocol】>【Correlation】中启用关联规则,则当录制这些应用系统的脚本时,VuGen会在脚本中自动建立关联。
    您也可以在【Recording Options】>【Internet Protocol】>【Correlation】检视每个关联规则的定义。
    o 使用者自订(User-defined Rules Correlation):
    除了内建的关联规则之外,使用者也可以自订关联规则。您可以在【Recording Options】>【Internet Protocol】>【Correlation】建立新的关联规则。
    • Correlation Studio:有别于Rules Correlation,Correlation Studio则是在执行脚本后才会建立关联,也就是说当录制完脚本后,脚本至少须被执行过一次,Correlation Studio才会作用。Correlation Studio会尝试找出录制时与执行时,服务器响应内容的差异部分,藉以找出需要关联的数据,并建立关联。
    Rule Correlation
    请依照以下步骤使用Rule Correlation:
    1. 启用auto-correlation
    1. 点选VuGen的【Tools】>【Recording Options】,开启【Recording Options】对话窗口,选取【Internet Protocol】>【Correlation】,勾选【Enable correlation during recording】,以启用自动关联。
    2. 假如录制的应用系统属于内建关联规则的系统,如AribaBuyer、BlueMartini、BroadVision、InterStage、mySAP、NetDynamics、Oracle、PeopleSoft、Siebel、SilverJRunner等,请勾选相对应的应用系统。
    3. 或者也可以针对录制的应用系统加入新的关联规则,此即为使用者自订的关联规则。
    4. 设定当VuGen侦测到符合关联规则的数据时,要如何处理:
     【Issue a pop-up message and let me decide online】:跳出一个讯息对话窗口,询问您是否要建立关联。
     【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都无法侦测出来,这时您就需要自行做手动关联了。
    手动关联
    手动关联的执行过程大致如下:
    1. 使用相同的业务流程与数据,录制二份脚本
    2. 使用WinDiff工具协助找出需要关联的数据
    3. 使用web_reg_save_param函数手动建立关联
    4. 将脚本中有用到关联的数据,以参数取代
    接下来将详细的说明如何执行每个步骤
    使用相同的业务流程与数据,录制二份脚本
    1. 先录制一份脚本并存档。
    2. 依照相同的操作步骤与数据录制第二份脚本并存盘。注意,所有的步骤和输入的数据一定都要一样,这样才能找出由服务器端产生的动态数据。
    有时候会遇到真的无法使用相同的输入数据,那您也要记住您使用的输入数据,到时才能判断是您输入的数据,还是变动的数据。
    使用WinDiff工具协助找出需要关联的数据
    1. 在第二份脚本中,点选VuGen的【Tools】>【Compare with Vuser…】,并选择第一份脚本。
    2. 接着WinDiff会开启,同时显示二份脚本,并显示有差异的地方。WinDiff会以一整行黄色标示有差异的脚本,并且以红色的字体显示真正差异的文字。(假如没看到红色字体,请点选【Options】>【View】>【Show Inline Differences】)。
    3. 逐一检视二份脚本中差异的部份,每一个差异都可能是需要做关联的地方。选取差异的脚本,然后复制。
    在复制时,有时并不需要取整行脚本,可能只会选取脚本中的一部分。
    注意:请忽略lr_thik_time的差异部份,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间。

    4. 接着要在Recording Log(单一protocol)或是Generation Log(多重protocol)中找这个值。将鼠标光标点到Recording Log的第一行开头,按下Ctrl+F,开启【Find】窗口,贴上刚刚复制的脚本,找出在Recording Log第一次出现的位置。

    结果会有二种:
    o 在Recording Log中找不到要找的数据,这时请先确认您找对了脚本,毕竟现在开启了二个几乎一样的脚本,很容易弄错。
    o 在Recording Log中找到了要找的数据,这时要确认数据是从服务器端传送过来的。首先可以先检查数据的标头,从标头的Receiving response可以知道数据是从服务器端传送到client端的。假如此数据第一次出现是在Sending request中,则表示此数据是由client端产生,不需要做关联,但是有可能需要做参数化(parameterized)。
    您要找的标头格式如下:
    *** [tid=b9 Action1 2] Receiving response from host astra.merc-int.com:80 ( 25/11/2002 12:04:00 )

    5. 现在您已经找到录制二次都不一样,而且是由服务器所产生的动态数据了,而此数据极有可能需要做关联。
    使用web_reg_save_param函数手动建立关联
    在找到是由服务器所产生的动态数据之后,接下来要做的就是找出适当的位置,使用web_reg_save_param函数,将这个动态数据撷取到某个参数中。
    1. 要在哪里使用web_reg_save_param函数?
    在之前的步骤,我们已经在Execution Log找到可能需要关联的动态数据。在Execution Log中选取动态数据前的文字然后复制,我们将会利用这段文字,来帮助我们找出要关联的动态数据。

    不过在这之前我们要先找出使用web_reg_save_param函数的正确位置,所以我们要再重新执行一遍脚本,而且这次会开启所有的Log。
    1. 在VuGen中点选【Vuser】>【Run-Time Settings】。
    2. 点选【General】>【Log】。
    3. 勾选【Enable logging】、【Always sends messages】、【Extended log】,以及【Extended log】下的所有选项。
    4. 按下【OK】就可以执行脚本了。
    执行完脚本之后,在Execution Log中搜寻刚刚复制的字符串。找到字符串后,在字符串前面会有A.tion1.c(7),这个7就是到时候要插入web_reg_save_param函数的位置,也就是要插入到脚本的第7行。
    在脚本的第7行前插入一行空白行,然后输入
    web_reg_save_param(“UserSession”,
    “UserSession” 这个 “UserSession” 就是到时要使用的参数名称,建议给个有意义的名字。
    注意:到这里整个web_reg_save_param函数还没完成。

    2. 找出web_reg_save_param中要用到的边界
    web_reg_save_param函数主要是透过动态数据的前面和后面的固定字符串,来辨识要撷取的动态数据的,所以我们还需要找出动态数据的边界字符串。
    找出左边界字符串
    再回到Execution Log中,选取动态数据前的字符串并且复制它。
    这时会有个问题,到底要选取多少字符串才足以唯一识别要找的动态数据呢?建议是越多越好,但是尽量不要包含到特殊字符。
    在这边我们选取「input type=hidden name=userSession value=」字符串。选好之后,还要再确认一次这段字符串真的是可以唯一识别的,所以我们在Execution Log中透过Ctrl+F的搜寻,找找看这段字符串是否可以找到要找的动态数据。假如找不到,web_reg_save_param函数还有个ORD参数可以使用,ORD参数可以设定出现在第几次的字符串才是要找的字符串。
    将这个边界字符串加到未完成的web_reg_save_param函数中:
    web_reg_save_param(“UserSession”, “LB= input type=hidden name=userSession value=”,
    找出右边界字符串
    接下来要找出动态数据的右边界字符串,这个字符串就比较好找了,从动态数据的最后一个字符开始,通常就是我们要找的右边界字符串了。
    以这个例子来看,就是「>」,所以再把右边界字符串加入,web_reg_save_param函数中,这时web_reg_save_param函数已经快完成了。最后再加上「LAST);」就完成整个web_reg_save_param函数了。
    web_reg_save_param(“UserSession”, “LB= input type=hidden name=userSession value=”, “RB=>”, LAST);

    将脚本中有用到关联的数据,以参数取代
    当使用web_reg_save_param建立参数后,接下来就是用“UserSession”参数去取代脚本中写死的(hard-coded)资料。
    范例:

    “Name=userSession”, “Value=75893.0884568651DQADHfApHDHfcDtccpfAttcf”, ENDITEM,
    换成
    “Name=userSession”, “Value={UserSession}”, ENDITEM,

    到这里您已经完成了一个关联了,接下来就是执行脚本,是否能成功运行,假如还是有问题,就要检查看看是否还需要再做另一个关联。
    关于 web_reg_save_param 函数
    对于关联(correlation)来说,web_reg_save_param是最重要的一个函数,其功能是在下载的网页内容中,透过设定的边界字符串,找出特定的数据并将其储存在一个参数中,以供后续脚本使用。
    接下来将针对web_reg_save_param做比较详细的说明。
    Service and registration type function
    web_reg_save_param是一个Service function。service function主要是用来完成一些特殊的工作的,如关联、设定proxy、提供认证信息等,当其作用时,不会对网页的内容做任何的修改。
    web_reg_save_param同时也是一个registration type function (只要函数名称中包含_reg_的字眼,表示其为registration type function)。registration type function意味着其真正作用的时机是在下一个action function完成时执行的。举例来说,当某个web_url执行时所接收到的网页内容中包含了要做关联的动态数据,则必须将web_reg_save_param放在此web_url之前,则web_reg_save_param会在web_url执行完毕后,也就是网页内容都下载完后,再执行web_reg_save_param找寻要做关联的动态数据并建立参数。
    所以要记住一点,要使用registration type function时,要注意其放置的位置必须在要作用的action function之前。
    语法
    int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);
    参数说明
    ParamName:存放动态数据的参数名称
    list of Attributes:其它属性,包含 Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, 以及 SaveLen。属性值不分大小写,例如 Search=all。以下将详细说明每个属性值的意义:
    • Notfound:指定当找不到要找的动态数据时该怎么处置。
    o Notfound=error:当找不到动态数据时,发出一个错误讯息。假如没设定此属性,此为LoadRunner的默认值。
    o Notfound=warning:当找不到动态数据时,不发出错误讯息,只发出警告,脚本也会继续执行下去不会中断。在对角本除错时,可以使用此属性值。
    • LB:动态数据的左边界字符串。此属性质是必须要有的,而且区分大小写。
    • RB:动态数据的右边界字符串。此属性质是必须要有的,而且区分大小写。
    • RelFrameID:相对于URL而言,欲搜寻的网页的Frame。此属性质可以是All或是数字,而且可有可无。
    • Search:搜寻的范围。可以是Headers(只搜寻headers)、Body(只搜寻body部分,不搜寻header)、Noresource(只搜寻body部分,不搜寻header与resource)或是All(搜寻全部范围,此为默认值)。此属性质可有可无。
    • ORD:指明从第几次出现的左边界开始才是要撷取的数据。此属性质可有可无,默认值是1。假如值为All,则所有找到符合的数据会储存在数组中。
    • SaveOffset:当找到符合的动态数据时,从第几个字符开始才开始储存到参数中。此属性质不可为负数,其默认值为0。
    • Convert:可能的值有二种:
    o HTML_TO_URL: 将HTML-encoded数据转成URL-encoded数据格式
    o HTML_TO_TEXT:将HTML-encoded数据转成纯文字数据格式
    • SaveLen:从offect开始算起,到指定的长度内的字符串,才储存到参数中。此参数可有可无,默认值是-1,表示储存到结尾整个字符串。
    范例
    web_reg_save_param("A", "LB/ic=<a href=", "RB='>", "Ord=All", LAST);nner会搜寻网页中所有以 「<a href=」 开头,且以 「’>」结束,当中包含的字符串,并且储存在「A」参数中。
    Tips and Tricks
    以下提供一些关联的常见问题:
    • 如何打印出参数值?
    lr_output_message这二个函数来做到。例如:
    lr_output_message(“Value Captured = %s”, lr_eval_string(“{ParameterName}”));
    lr_eval_string与lr_output_message函数的使用说明请参考LoadRunner Online Function Reference。
    • 在脚本的data目录下找不到路制时的快照(snapshot)
    造成在脚本的data目录下找不到路制时的快照(snapshot)的可能原因如下:
    o 脚本是由VuGen 6.02或更早的版本所录制的
    o 汇入的Action不会包含快照(snapshot)的档案
    o 脚本是储存在只读的目录下,早成VuGen无法储存执行时撷取的快照(snapshot)
    o 某些步骤并不会产生快照(snapshot),如浏览某个资源
    o 快照(snapshot)功能被取消
    【Tools】>【General options】>【Correlation】tab >【Save correlation information during replay】
    • 开启WinDiff时出现「File no longer available」的错误讯息
    WinDiff这个工具有些限制,无法开启包含空格符的目录或是脚本,所以建议命名时不要使用空格符,并且尽可能将名称取短一点。
    • 录制时突然跳出【Correlation warning】对话窗口
    当你有勾选自动关联的【Issue a popup message and let me decide online】选项,当VuGen发现有可能要做关联的数据时,就会跳出【Correlation warning】的窗口,询问你要做关联(Correlation in scrīpt)还是要忽略(Ignore)。
    另外你也可以勾选【Perform. correlation in scrīpt】,让VuGen自动作关联,不会再跳出询问窗口。
    或是勾选【Disable correlation engine】,关闭自动关联的功能。

    • 如何手动启动「Scan action for correlation」的功能
    要手动启动「Scan action for correlation」的功能,请先执行脚本一次后,点选【Vuser】>【Scan Action for Correlation】。

    • 执行完脚本后并未出现【Scan Action for Correlation】窗口
    要启用【Scan Action for Correlation】功能,请点选【Tools】>【General options】>【Correlation】tab,勾选【Show Scan for correlation popup after replay of Vuser】选项。

  • 存档:打开关闭excel的vbs函数

    2010-06-18 12:53:01

    作者:郝宁

    '*********************************************************************************************
    ' 函数说明:打开工作薄
    ' 参数说明:
    '          (1)ExcelSH:Excel中要使用的Sheet对象;
    '          (2)sheetName:要打开的工作薄Sheet名称;
    '          (3)path:要打开的工作薄路径;
    ' 返回结果:
    '          (1)成功:工作表对象ExcelSH
    '          (1)失败:Nothing
    ' 调用方法:
    '          OpenExcel (excelSH, "Test Data","C:\Documents and Settings\Administrator\Desktop\Test_Data.xls")
    ' @Version 1.0           
    ' @Version
    '*********************************************************************************************
    Function OpenExcel (byRef excelSH, filePath, sheetName)
    On Error Resume Next
    Set excelApp = CreateObject("Excel.Application")
    excelApp.Visible = True
    Set excelWK = excelApp.Workbooks.Open(filePath)
    Set excelSH = excelWK.Worksheets(sheetName)
    On Error GoTo 0
    End Function

    '*********************************************************************************************
    ' 函数说明:关闭Excel应用程序;
    ' 参数说明:
    '          (1)ExcelApp:Excel应用程序名称;
    ' 调用方法:
    '           CloseExcel(ExcelApp)
    ' @Version 1.0           
    ' @Version
    '*********************************************************************************************
    Sub CloseExcel ()
    On Error Resume Next
    excelWK.Save
    excelApp.Quit
    Set excelSH = Nothing
    Set excelWK = Nothing
    Set excelApp = Nothing
    err = 0
    On Error GoTo 0

    End Sub
    提高技术的脚步从未停止过,也决不会停止。
  • 存档:假装不在^_^

    2010-06-18 12:41:03

    作者:假装不在

    很久很久以前,有一个人,路过这里.....其实他也很想说。

    我有同事做了同一个项目快4年,进项目前,项目的脚本就已经成型,而这4年里面就是跑跑脚本。4年后突然发现,原来自己学到的非常少,知道的更是少。甚至那时候就觉得自动化也就这样,很简单。

    这故事告诉我们,当接触的东西不多的时候,看外面世界的缝就越小。不要整天拿个“破”web说什么自动化也就不过如此,QTP对web的支持已经算是做得非常不错了,做起来自然很简单。但即使如此也不能说自己精通web自动化测试,不知道精通这个词是否已经被用到烂掉了,SAP Web 有试过?

    自动化先别说什么框架什么思想,先从最基础的说,自动化基础是什么?就是对象识别+对象操作。如果你框架再巨大,织布织得多厉害,连穿针引线都不会,就别说织布其实很简单。

    不说脱离QTP去干一番啥事业,就算靠着QTP也未必能把目前主流预言的程序对象征服完,试问下测试过的语言有多少种?如果说Only one,或者我觉得还是需要多些认知。4年的自动化不算什么,如果4年里都只跑跑脚本,或者都只弄同一个东西,哪其实1年的经验就等同于4年的经验,没必要说测试了多少年,经历比工作年限重要。

    我也培训新人,但我不是这么傲慢和他们说什么QTP其实没什么,很简单,什么录制回放,不耐性的说:Excel哪些到时候都去问百度谷歌吧。我说,QTP要入门简单,要学精不容易,但起码要多动自己的脑筋,这样可以让你学习进步得更快。我和他们说,在企业里,老板看中的是你能剥削的价值和可替代性。因为为了能被剥削,你就要去学点自动化,如果自动化都不会,你连被剥削的权利都没有;因为为了不可替代性,需要的是研究研究再研究,拓展拓展再拓展。不要再哪里撞个3 4年钟出去了还是2 3年前一样。你的敌人永远在读书,如果今天不走,明天就要用跑的。

    最后总结的,知道得越多,越觉得自己无知!如果自己没发现自己无知,哪就应该去多看看外面的世界。学习自动化不要停下来,遇到瓶颈的时候可以试着帮别人去解决问题,或者静心思考自己还能做什么,是因为你不敢去想,不敢去发挥创意,才会有瓶颈的出现!

    我的测试博客:http://www.51testing.com/?uid/174770
    MSN:luchenzhi@hotmail.com
    M群:group283284@msnzone.cn
    热烈欢迎大家讨论自动化难题与QTP问题
  • 穷人家的孩子一定要成功!(李阳)

    2010-04-02 09:57:29

     
    The future of China depends on us!
    中国的未来由我们决定。
    We cannot afford to waste our lives!
    我们的生命浪费不起!
    We must do as much as we can, as soon as we can!
    我们必须全力以赴!
     
           今天晚上,李阳和大家分享了一些观点:
       一、大多数人做的事不一定是对的!
    The things that the majority do are not necessarily correct!
       二、时光不会倒流!要抓住当下的每一分钟苦练英语!
       三、跪下来读英语,是为了将来让世界在我面前下跪。
       四、只要不饿死,就能改变这个世界。
       五、穷人家的孩子没有自卑和堕落的权力。
       六、在最短的时间里读最多的次数,你就可以超越千万人!
       七、笑话你的人越多,成功的速度越快。
       八、不成功的原因是自己不够穷!
       九、随时随地提醒自己:我还可以更努力、更出色!
       十、成功的秘诀就是拥有可以和这个世界交换的能力。
     
        The reason you're not successful is that you are not poor enough. You're not faced with constant hardship and struggle. Poor people have no reason to feel frustrated and hopeless. The only choice they have is to work incredibly hard to rise above their poverty.
         亲爱的朋友们,请把上面这段话脱口而出!
  • 【转】如何在应聘职位前准备可能面试到的内容?

    2010-03-07 16:19:02

    原文地址http://bbs.51testing.com/viewthread.php?tid=182451&page=2#pid1427669

    由 Christina_LL 于 2010-2-25 22:48 编辑 ]

    一、做好充分的准备

    如果打算换工作,应该提前一或者半年做准备工作,一般情况我是不赞成换工作的。但是如果确实不适合现在的工作,不换不得已,那就只能走了,适时地放弃意味着又一次选择,探明此路不通的努力远非白费。既然因为不得已离开现在的工作,那就给自己的工作做个总结,吸取教训,首先问问自己一下的问题,自己回答清楚了再离开,不然很可能就要频繁的换工作了。

    1、为什么离开这家公司

    就像我,因为身体吃不消不得已离开以前的公司,所以我再找工作的时候就首先本着可持续发展的道路,工作时间一定要合理。

    2、知己知彼

    我在这家公司学到了什么,有什么经验可作为找新工作的资本,只有考虑清楚了这些,才能在面试的时候展示自己的亮点,有了亮点才能让招聘者认可你。知己知彼首先要知己,知己才能知道目标,也就是知彼此,才能百战不殆。除了知已,还要清楚自己以后的发展方向,在哪个领域,做个长期的打算。有句话说,有志人立长志,无志人常立志。相信大家都想做个有志的人,那就从实际做起吧。

    3、我还需要学习什么

    如果你的实力不足以让你找到一份满意的工作,那么从现在开始为自己充电吧。

    4、我是冲动吗

    自己是因为冲动离开现在的公司吗,冲动是魔鬼。

    二、面试技巧

    1、认真对待每次面试

    在面试的时候,把每次机会都当成最后一次机会,珍惜这个机会。当有很多机会的时候,才可以去挑选。如果机会溜走了,就没得挑选了。我就是拿了好几份offer的。

    2、面试时怎么说话

    首先说话要清晰,可能好多人觉得这个很easy,觉得我口齿很清晰呀。口齿清晰的人不一定能说话清晰,不一定能表达清楚自己的意思。怎么做到说话清晰呢?首先,还是要知己知彼,就像是两个很好的朋友,用几个简单的词就能清楚的表达自己的意思,但是碰到陌生人,用很长的一大段也说不清,这个例子想说的是文化的差异,如果是与外国人面试,就更要多研究研究文化的差异了。还有就是语言的差异,就像芬兰人会把/t/当成/d/,/p/当成/b/,如果不清楚这些,很难交流的。说话清楚了,对方就能感知你的意思了。然后要思路清晰,这是表达你的交流能力的,很多人会在简历中写道,很强的交流能力,如果在面试的时候表达都没条例,何谈很强的交流能力。还有就是说话大声、清晰,否则会显得你很羞涩,或者没经过场,是面试又不是相亲,是展露自己才华的时候。要想说话大声、清晰首先要消除心理障碍,不要怕。就算面试官很牛又怎么样呢,不然他就不会来面试你了,归根结底都是人,没什么好怕的,坦诚对待一切。

    3、坦诚

    面试是一个让面试官了解你的过程,你有的才能,不用谦虚地掩盖;你没有的才能,也不用编造。人才是德才兼备的人。小事靠才,大事靠德。所以建议展示真是的自己。

    4、巧答技术问题

    对于面试官提出的技术性问题,如果你只讲理论,面试官会以为你不懂实际;如果你只说实际的东西或者例子,面试官会以为你理论基础不扎实;所以最好的策略是,先讲理论,然后举例子。不建议先举例子,再讲理论。老师再学校讲课通常是先举例子,然后将理论,因为老师面对的是学生。而现在我们面对的是面试官,面试官是明知故问的。

    5、巧答发散思维问题

    对于这样的问题,首先分类,然后一一作答。比如,你喜欢什么样的交流方式,MSN,e-mail,面对面地交谈,还是电话?你说喜欢任何一个都显示你有某方面的不足,你如果选择MSN,表现了你不擅于与人面对面的交流,逻辑思维不强(不然可能用e-mail);如果你选择了电话,你是否考虑到公司的财政;......。

    6、分析问题

    除了技术型的问题,面试官还会问很多其他的问题,当听到这些问题时,首先要清楚面试官的目的是什么,大多数的答案是多选或者单选型的,相信每个人都知道善恶美丑,选什么样的选项不是个问题。只有知道了面试官的目的,才能给面试官想要的结果。不然就像面试官展示了你理解力不强的弱项。

    7、怎么说怎么圆

    不管自己说什么,都要给出合适的理由,以理服人。是是非非,有理就行。所以一定要解释理由,但是不是强词夺理,要合理的理由,有理有据。

    结束语

    最后祝愿大家找到理想的工作!

Open Toolbar