测试路漫漫, 吾将上下求索. 两年多开发经验, 六年整测试经验. 比较熟悉web自动化测试, especially in Ruby & Watir. 正在探讨Agile 测试, Junit testing in Agile. 联系方式:myfengliu@hotmail.com

发布新日志

  • 测试交流

    2013-09-30 15:55:43

    推广一下自己的公众微信号:yibeitest
    作者简介:从事电子商务方面测试,在测试设计,系统测试,自动化测试,白盒测试有所心得。
    在这里,你将看到一个测试工作者的测试生活的每一天。

    目录清单:
    01. 测试之道
    02. 实习生应该做什么
    03. 如何统计测试的有效性
    04. 测试如何设计
    05. 如何提高测试效率 
    06. 你是一个有责任心的人吗?
    07. 开发和测试的关系
    08. 集成测试
    09. 工作中遇到的问题
    10. 日志测试
    11. 电商后端自动化测试solution
    12. 自动化测试的理解
    13. 一次严重宕机引发的思考
    14. 如何跟上潮流
    15. 一次上火的自动化测试
    16. 敏捷测试
    17. 接口测试
    18. 你喜欢测试吗?
    19. 老员工,你想跳槽吗?
    20. 质量是设计出来的
    21. 很忙,瞎忙
    22. 情绪与行动
    23. how google tests software part I
    24. 测试如何服务开发
    25. Sonar and RWD
    26. The 10 Minute Test Plan
    27. 沉没的项目
    28. how google tests software - part II a

  • Thinking in Java Continue

    2011-07-27 12:38:42

  • hudson introduction

    2011-04-08 22:01:19

  • agile 测试 初试

    2011-03-18 21:13:58

    最近刚刚做了一个项目。 按要求用agile开发, 但是由于项目太大,需要多个部门协调开发。开发接口迟迟不能定下来。

    这样导致每个sprint

    1. 开发人员根本不能提供一个清晰的目标。

    2. 也没有专门负责做协调audit的人员

    3. 前期无视QA的存在

    最终演变成,传统的开发模式。一直到某个日期,开发人员一下子deliver出好多module。

    遇到这种情况作为QA应该如何应对呢:

    1. 跟开发人员确定好每个sprint清晰的目标

    2. 利用前期QA搭建好测试框架。

    3. 积极的参与到开发人员的讨论。

    4. 做好加班的准备。

     

     

  • 转贴-测试架构师应该具备的能力

    2011-03-04 12:25:25


    来自:http://www.51testing.com/html/15/n-230915.html

    最近看了一些关于软件开发架构师的能力模型。对照其中的要求,我发现对于测试架构师至少也应该具备如下能力,才能有做架构师的理由和优势:

      1、沟通力

      点评——沟通力不够你就无法从一线测试人员那里获悉他们的困惑,从多个项目组获取不同人的不同需求;同时你也难把你的新想法推荐给相关利益人;

      2、抽象力(具体问题->高层抽象)

      点评——抽象力不够你如何进行共性测试技术的提取,如何构建出具有共性的各类测试框架。而且抽象力不够,也会让你止步于问题的表面原因,而无法找到测试领域的根因,从而提供的解决方案适用面非常窄,也许就只能在单个项目的单个问题有用,而没有大范围的共享DNA;

      3、规划力

      点评——规划力不够做出的1-3年规划就是空中楼阁,就无法把握好每年技术演进的节奏,无法适用下一年的变化,甚至当年也很难落地满足当前的形势;无法系统地把相关利益人,相关知识技术,相关活动做为一个整体系统来组织和管理;

      4、学习

       点评——学习力不仅是公司内部产品知识的学习,还包括具有从公司外广泛获取测试技术和自己产品业务测试知识的能力;具备对知识进行评估和改造的能力,评 估是指:任何技术都有其优势也有其局限性,学习力不够会导致轻易否定新技术新观点,眼中看到的是新技术的不足;学习力够则能专注挖掘出新技术可为我所用让 我有小改进的价值,同时用其它技术来补充它的不足。只有具备这种能力才能具备技术平衡力,这是架构师必备能力之一。

      5、领域能力

       点评——具备了领域知识和学习领域知识的基本能力,才能提出领域问题,分析领域问题,解决领域问题,这是设计建模中领域建模的基础。领域知识包括:被测 对象的业务知识,测试技术领域的知识(如:压力测试技术领域;可靠性测试技术领域;可测试性技术领域;安全性测试技术领域;静态测试技术领域;开发者测试 技术领域)

  • watir pop up

    2010-12-29 09:05:17

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

    2010-07-20 08:06:14

    本文网址:http://bbs.bitscn.com/72875 复制

    1. Linux 脚本编写基础
    1.1 语法基本介绍
    1.1.1 开头
           程序必须以下面的行开始(必须放在文件的第一行):
           #!/bin/sh
        符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。  当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
        要使脚本可执行:   编译 chmod +x filename 这样才能用./filename 来运行
    1.1.2 注释
      在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。
    1.1.3 变量
      在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
            #!/bin/sh
            #对变量赋值:
            a="hello world"
            # 现在打印变量a的内容:
            echo "A is:"
            echo $a
           有时候变量名很容易与其他文字混淆,比如:
            num=2
            echo "this is the $numnd"
           这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
            num=2
            echo "this is the ${num}nd"
            这将打印: this is the 2nd
    1.1.4 环境变量
           由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录
    脚本中使用环境变量。
    1.1.5 Shell命令和流程控制
           在shell脚本中可以使用三类命令:
           1)Unix 命令:
          虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
            常用命令语法及功能
      echo "some text": 将文字内容打印在屏幕上
      ls: 文件列表
      wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
      cp sourcefile destfile: 文件拷贝
      mv oldname newname : 重命名文件或移动文件
      rm file: 删除文件
      grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt
      cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
      cat file.txt: 输出文件内容到标准输出设备(屏幕)上
      file somefile: 得到文件类型
      read var: 提示用户输入,并将输入赋值给变量
      sort file.txt: 对file.txt文件中的行进行排序
      uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
      expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
      find: 搜索文件比如:根据文件名搜索find . -name filename -print
      tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
      basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
      dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
      head file: 打印文本文件开头几行
      tail file : 打印文本文件末尾几行
      sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。 不要和shell中的通配符相混淆。比如:将linuxfocus 替换为LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
      awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
    cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA
            命令输出结果为:Adam Bor, IndiaKerry Miller, USA
            2) 概念: 管道, 重定向和 backtick
      这些不是系统命令,但是他们真的很重要。
      管道 (|) 将一个命令的输出作为另外一个命令的输入。
                     grep "hello" file.txt | wc -l
      在file.txt中搜索包含有”hello”的行并计算其行数。
      在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
      重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
          > 写入文件并覆盖旧文件
          >> 加到文件的尾部,保留旧文件内容。
            反短斜线
         使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
             命令:
               find . -mtime -1 -type f -print
         用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
                 #!/bin/sh
                 # The ticks are backticks (`) not normal quotes ('):
                  tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
           3) 流程控制
            1.if
        "if" 表达式 如果条件为真则执行then后面的部分:
                if ....; then
               ....
               elif ....; then
               ....
               else
               ....
               fi
               大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
        通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
                     [ -f "somefile" ] :判断是否是一个文件
                     [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
                     [ -n "$var" ] :判断$var变量是否有值
                     [ "$a" = "$b" ] :判断$a和$b是否相等
        执行man test可以查看所有测试表达式可以比较和判断的类型。
       直接执行以下脚本:
                   #!/bin/sh
                   if [ "$SHELL" = "/bin/bash" ]; then
                        echo "your login shell is the bash (bourne again shell)"
                   else
                        echo "your login shell is not bash but $SHELL"
                   fi
       变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
            
            快捷操作符
            熟悉C语言的朋友可能会很喜欢下面的表达式:
                      [ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
      这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:
                     #!/bin/sh
                     mailfolder=/var/spool/mail/james
                     [ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
                     echo "$mailfolder has mail from:"
                     grep "^From " $mailfolder
            该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
      -打印错误信息
      -退出程序
      我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
      不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

             2.case
                   case :表达式可以用来匹配一个给定的字符串,而不是数字。
                          case ... in
                                ...) do something here ;;
                          esac
             让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
                         file lf.gz
                       这将返回:
                             lf.gz: gzip compressed data, deflated, original filename,
                             last modified: Mon Aug 27 23:09:18 2001, os: Unix
                 我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
                   #!/bin/sh
                   ftype=`file "$1"`
                   case "$ftype" in
                           "$1: Zip archive"*)
                      unzip "$1" ;;
                             "$1: gzip compressed"*)
                        gunzip "$1" ;;
                              "$1: bzip2 compressed"*)
                         bunzip2 "$1" ;;
                               *) echo "File $1 can not be uncompressed with smartzip";;
                    esac
             您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。
    也就是说,当我们运行:
                        smartzip articles.zip
                        $1 就是字符串 articles.zip
                    3. selsect
                      select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。
                        select var in ... ; do
                             break
                                done
                                .... now $ var can be used ....
                       下面是一个例子:
                             #!/bin/sh
                             echo "What is your favourite OS?"
                             select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
                        break
                                    done
                               echo "You have selected $var"
                  下面是该脚本运行的结果:
                                   What is your favourite OS?
                                        1) Linux
                                        2) Gnu Hurd
                                        3) Free BSD
                                        4) Other
                                      #? 1
                                    You have selected Linux
             注:var是个变量,可以换成其它的值。break用来跳出循环,如果没有break则一直循环下去。done与select对应。
                      4.loop
                          loop表达式:
                                while ...; do
                                          ....
                                   done
                 while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.
    关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
      
                         for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
                              1,   for var in ....; do
                                     ....
                                    done
                           在下面的例子中,将分别打印ABC到屏幕上:
                                #!/bin/sh
                                        for var in A B C ; do
                                     echo "var is $var"
                                         done

                               2,   for (( 条件一; 条件二; 条件三 );do
                                    ...
                                    done
                            例:
                         
                       for ((i=1;i<10;i=$[$i+1]));do

                                 echo "a"
                              done
    输出:

    a
    a
    a
    a
    a
    a
    a
    a
    a

    条件一:这可以看成是『初始值』,如上面的例子中,初始值是 i=1 啦!
    条件二:这可以看成是『符合值』,如上面的例子中,当 i<=100 的时候都是符合条件的!
    条件三:这可以看成是『步阶』!也就是说, i 每次都加一! 所以啦!上面的例子是说:由 i=1 开始到 i<= 100 ,每次 i 都加一来执行底下的程序段(就是 s=s+i ),当 i >100 (也就是 i=101 )就跳出这一段程序段!怎样!不难吧!




                            下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:
                              #!/bin/sh
                              # list a content summary of a number of RPM packages
                              # USAGE: showrpm rpmfile1 rpmfile2 ...
                              # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
                                for rpmpackage in $*; do
                             if [ -r "$rpmpackage" ];then
                             echo "=============== $rpmpackage =============="
                              rpm -qi -p $rpmpackage
                              else
                               echo "ERROR: cannot read file $rpmpackage"
                             fi
                                  done
                       这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。
                            如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
                                       此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.



    『until:直到条件相同的时候才离开程序』;
    『while:当条件相同的时候,就继续做!』  

    until [ condition1 ] && { || } [ condition2 ] ...




                     5. 引号
                       在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防 止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。
              编译SHELL脚本
              #ch#!/bin/sh mod +x filename
     cho *.jpg       ./filename 来执行您的脚本。
      这将打印出"mail.jpg tux.jpg"的结果。
        引号 (单引号和双引号) 将防止这种通配符扩展:
                 #!/bin/sh
                 echo "*.jpg"
                 echo '*.jpg'
      这将打印"*.jpg" 两次。
      单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
             #!/bin/sh
             echo $SHELL
             echo "$SHELL"
             echo '$SHELL'
       运行结果为:
                 /bin/bash
                 /bin/bash
                 $SHELL
      最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:
               echo *.jpg
               echo $SHELL
      这将输出:
               *.jpg
               $SHELL
             6. Here documents
              当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 "Here document" 以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:
             #!/bin/sh
             # we have less than 3 arguments. Print the help text:
                if [ $# -lt 3 ] ; then
                     cat <
                     ren -- renames a number of files using sed regular expressions
                     USAGE: ren 'regexp' 'replacement' files...
                     EXAMPLE: rename all *.HTM files in *.html:
                  ren 'HTM$' 'html' *.HTM
                     HELP
                  exit 0
                fi
                OLD="$1"
                NEW="$2"
              # The shift command removes one argument from the list of
              # command line arguments.
              shift
              shift
              # $* contains now all the files:
             for file in $*; do
              if [ -f "$file" ] ; then
                 newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
                 if [ -f "$newfile" ]; then
                      echo "ERROR: $newfile exists already"
                 else
                      echo "renaming $file to $newfile ..."
                      mv "$file" "$newfile"
                  fi
                fi
               done
            这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。 如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从 参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我 们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目 的:得到了旧文件名和新
    文件名。然后使用mv命令进行重命名。
              4)函数
                 如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
              functionname()
              {
                     # inside the body $1 is the first argument given to the function
                     # $2 the second ...
                                 body
                }
              您需要在每个程序的开始对函数进行声明。
       下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。
               这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
                   #!/bin/sh
                   # vim: set sw=4 ts=4 et:
                   help()
                   {
                  cat <
                         xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
                         USAGE: xtitlebar [-h] "string_for_titelbar"
                          OPTIONS: -h help text
                         EXAMPLE: xtitlebar "cvs"
                         HELP
                 exit 0
                   }
                   # in case of error or if -h is given we call the function help:
                   [ -z "$1" ] && help
                   [ "$1" = "-h" ] && help
                   # send the escape sequence to change the xterm titelbar:
                     echo -e "33]0;$107"
                    #
                在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。
            命令行参数
      我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。 但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。
             #!/bin/sh
             help()
             {
                cat <
                   This is a generic command line parser demo.
                   USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
                   HELP
                exit 0
             }
              while [ -n "$1" ]; do
            case $1 in
           -h) help;shift 1;; # function help is called
           -f) opt_f=1;shift 1;; # variable opt_f is set
            -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
            --) shift;break;; # end of options
           -*) echo "error: no such option $1. -h for help";exit 1;;
           *) break;;
              esac
              done
              echo "opt_f is $opt_f"
              echo "opt_l is $opt_l"
              echo "first arg is $1"
              echo "2nd arg is $2"
      您可以这样运行该脚本:
                     cmdparser -l hello -f -- -somefile1 somefile2
      返回的结果是:
                 opt_f is 1
                 opt_l is hello
                 first arg is -somefile1
                 2nd arg is somefile2
      这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.


    第2部分 实例

        现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
    cp framework.sh myscript.
     然后再插入自己的函数。
      让我们再看两个例子:
      二进制到十进制的转换
      脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
    #!/bin/sh
    # vim: set sw=4 ts=4 et:
    help()
    {
     cat <
    b2h -- convert binary to decimal
    USAGE: b2h [-h] binarynum
    OPTIONS: -h help text
    EXAMPLE: b2h 111010
    will return 58
    HELP
     exit 0
    }
    error()
    {
      # print an error and exit
      echo "$1"
      exit 1
    }
    lastchar()
    {
      # return the last character of a string in $rval
      if [ -z "$1" ]; then
        # empty string
        rval=""
        return
      fi
      # wc puts some space behind the output this is why we need sed:
      numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
      # now cut out the last char
      rval=`echo -n "$1" | cut -b $numofchar`
    }
    chop()
    {
      # remove the last character in string and return it in $rval
      if [ -z "$1" ]; then
        # empty string
        rval=""
        return
      fi
      # wc puts some space behind the output this is why we need sed:
      numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
      if [ "$numofchar" = "1" ]; then
        # only one char in string
        rval=""
        return
      fi
      numofcharminus1=`expr $numofchar "-" 1`
      # now cut all but the last char:
      rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
    }
    while [ -n "$1" ]; do
    case $1 in
      -h) help;shift 1;; # function help is called
      --) shift;break;; # end of options
      -*) error "error: no such option $1. -h for help";;
      *) break;;
    esac
    done
    # The main program
    sum=0
    weight=1
    # one arg must be given:
    [ -z "$1" ] && help
    binnum="$1"
    binnumorig="$1"
    while [ -n "$binnum" ]; do
      lastchar "$binnum"
      if [ "$rval" = "1" ]; then
        sum=`expr "$weight" "+" "$sum"`
      fi
      # remove the last position in $binnum
      chop "$binnum"
      binnum="$rval"
      weight=`expr "$weight" "*" 2`
    done
    echo "binary $binnumorig is decimal $sum"
       该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:
    0 * 1 + 1 * 2 = 2
      为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。
        文件循环程序
      或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的 脚本rotatefile可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于outmail.1就 变成了outmail.2 等等等等...
    #!/bin/sh
    # vim: set sw=4 ts=4 et:
    ver="0.1"
    help()
    {
      cat <
    rotatefile -- rotate the file name
    USAGE: rotatefile [-h] filename
    OPTIONS: -h help text
    EXAMPLE: rotatefile out
    This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
    and create an empty out-file
    The max number is 10
    version $ver
    HELP
      exit 0
    }
    error()
    {
      echo "$1"
      exit 1
    }
    while [ -n "$1" ]; do
    case $1 in
      -h) help;shift 1;;
      --) break;;
      -*) echo "error: no such option $1. -h for help";exit 1;;
      *) break;;
    esac
    done
    # input check:
    if [ -z "$1" ] ; then
    error "ERROR: you must specify a file, use -h for help"
    fi
    filen="$1"
    # rename any .1 , .2 etc file:
    for n in 9 8 7 6 5 4 3 2 1; do
      if [ -f "$filen.$n" ]; then
        p=`expr $n + 1`
        echo "mv $filen.$n $filen.$p"
        mv $filen.$n $filen.$p
      fi
    done
    # rename the original file:
    if [ -f "$filen" ]; then
      echo "mv $filen $filen.1"
      mv $filen $filen.1
    fi
    echo touch $filen
    touch $filen
      这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。
    调试
      最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。
      shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:
    sh -x strangescript.
      这将执行该脚本并显示所有变量的值。
      shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
    sh -n your_script.
      这将返回所有语法错误。
  • 开个贴学习 Java 编程思想02版

    2010-07-15 12:03:21

    之前看过很多杂七杂八的java教程,不系统,对很多概念也不是很清楚。这一次准备系统看看。

    第一章:对象导论。

    只要是OO的语言,都会讨论这个。

    这里几点特别的:

    对象的内存分配是动态生成的。

    geniric object 是动态绑定的。符合is a 关系。

    迭代器,每一种语言都有这玩意。





  • 转贴smart testing

    2010-07-15 11:57:17

    http://www.51testing.com/html/78/n-217078.html
  • Rails Study material

    2009-03-03 17:11:44


    http://www.cnblogs.com/dahuzizyd/archive/2007/04/13/Ruby_On_Rails_windows_InstatnRails_study_All.html


    http://www.netbeans.org/kb/trails/ruby.html



  • ruby book

    2009-03-03 14:20:39

    Programming Ruby

    http://www.ruby-doc.org/docs/ProgrammingRuby/

    Learn to Program


    http://www.pragprog.com/titles/fr_ltp/learn-to-program


    Ruby Languange:
    http://www.ruby-lang.org/en/

    ruby IDE
    http://www.netbeans.org/

  • watir guide

    2009-02-23 13:53:25

    http://wiki.openqa.org/display/WTR/Tutorial

    http://wtr.rubyforge.org/rdoc/

    IE Dom Inspector is very helpful tool to identify the elements in the web page

    If you are not sure about where to load the file you execute, you can use
    puts $LOAD_PATH to check

    if the ruby string is too long, use \ to change line
  • 回家过年了

    2009-01-20 15:57:38

    订到了21号回家的票,明天就可以踏上回家的火车了.
    兴奋啊!

    2009年是充满挑战的一年, 希望自己能在09年做好转型.
  • ruby net协议实现download file 和http头信息读取

    2009-01-09 15:46:01

    require 'net/http'
    require 'uri'

    url = URI.parse('http://test/testapi?wsdl')
    res = Net::HTTP.start(url.host, url.port) {|http|
        http.get("testapi?wsdl")
      }

    str = res.body
     
      open("/wsdl.xml", "wb") { |file|
        file.write(res.body)
       }

    如果是读取redirect中间页面的信息:
     res =Net::HTTP.get(URI.parse(http://test/testapi.html))
  • 是否需要进行automation

    2009-01-06 14:20:37

    其实这不是一个新话题, 很多老鸟已经给出了很多见解.在此, 只是谈谈自己在这方面得一些理解.

    首先让我们先想想, automation 的目的是什么, 无非就是让机器代替人做一些回归测试, release出部分resource.
    了解了这一点, 就不难回答这个问题, 企业是否有必要做automation.

    1. 如果是原有的功能经常变动, 很显然, 这种是不适合做auotmation的, 因为对于automation scrīpt的维护成本也是很高的
    2. 如果是在原有的功能基础上增加new feature, 这种还是可以automation的
    3. 如果是其他的功能经常改变, 但是整个产品是一个code base, 这种必须automation, 而且automation维护的成本会比较底.

    不难看出, 其实是否要做automation还是比较容易得出结论的.



  • 谈谈过程改进的一点看法

    2008-12-24 21:23:07

    今天跟老大one one, 谈起今年的工作总结, 以及明年的发展方向. 中间聊起我今年的一些测试工作.

    在我加入到现在公司之前,大家测试都是一种模式, 那就是纯手工的功能测试, 也没有任何的测试工具引入.

    随着我对现有公司业务的熟悉, 在测试中,不断的引入测试辅助工具(比如产生测试数据的工具, 帮助验证测试结果的工具), 以及测试自动化提前实施.

    其实这些说到底,这些东西主要是一种测试方法的体现, 再提高一点说, 现有的测试是在原有的基础的一种测试过程改进. 但是,从自身的实践来看, 测试过程改进说起来容易,真正推广起来还是难度挺大.

    主要是以下一些问题:

    一是,我们测试部门的测试业务较杂,且都具有自有的特点;

    二是,测试人员的素质不一,较多的测试人员都不具备编程功底(这个问题比较严重);

    三是,过程改进比较缓慢,得不到领导的有力支持.

    所以, 要实现目前测试过程改进, 首先得培养业务专家,而且测试专家具有较强抽象设计能力, 其次是领导要

    大力支持,统一测试team思想; 如此,可以想象会将来测试效率会大力提升.

  • Email check automation solution

    2008-12-16 23:20:31

    If you have a lot of emails to check in testing, believe you are sick of do the contect check day by day. If the machine can help you to do the email check, that will be great news for you. How could let machine help you do that? We should think about below steps:
    1. Email trigger, emails should be automated trigger out
    2. Construct mail content expected result, meanwhile contstruct regular expression that will be used to fetch the real email content.
    3. Compare expected content and real content
    4. Log the compare result.
    In the implement, we abstract an email checker to help us do email compare, the logic of the email checker:
    1. Download email from pop server, it may be mail list
    2. Get the right email by time stamp
    3. Decode mail content, normally mail content is encoded
    4. Using regular expression to fetch real email content
    5. Compare real email content and expect content
    6. Log the compare result 
    After that, an email check automation solution comes out. It seems very simple,then maybe someone askes what technology we use to implement this, --Ruby. 
  • QA 要不要做"周扒皮"

    2008-12-14 09:47:39

    前天晚上, 跟一PD闲聊, PD提到我们有些QA在测试中跟"周扒皮"似的? "周扒皮", 大家都知道,在旧社会就是一反面角色,压榨长工的一家伙.但是把周扒皮用在测试中,说实在的,这还是我第一次听说.要是硬把周扒皮定义在PD对QA的评价, 我认为可能是有两方面因素:
    1. 原则性强,用PD的话说,把PRD当圣旨
    2. 对PRD扣的很细,挖地三尺
    对于第二点,在此先一放. 对于第一点,从中不难看出,PD和QA在沟通上出现了问题,尤其是在PRD的理解上.遇到这种问题一般怎么办呢,如果是PRD确实写的模糊,我想最简单的就是跟PM进一步确认即可;如果是PRD写的比较明确,但是PD做出来的东西跟PRD确实有出入,在这种情况下,有两种选择,一可以跟PM确认(其实是跟PM谈判,我们没有做成那样,你看这样行不行),二是,QA坚持原则,给PD发Bug(自然会被PD认为,把PRD当圣旨).

    其实是不是把PRD当成圣旨,就是QA要不要当这个"周扒皮",我想视情况而定:

    如果QA在对某一行业知识,经验相对比较浅,而且对PD引入的出入确实不认同,我想最好还是按照PRD办事,坚持原则发bug,以免被引入歧途.即使认同PD的做法,也需要跟和PM进一步确认.这个"周扒皮"一定要做.

    如果QA比较资深,对行业知识也是比较资深,甚至在某些方面胜过PM,针对这中问题, QA可以主动出击,跟PM讲清缘由,"PD的这种做法可能回更好", 这样既赢得了PD的好感,又对产品有利,何乐而不为呢. 显然,这时候"周扒皮"就做不得了.

    总得来说,对QA来说,对于吃不准得东西,宁做"周扒皮",也不要随PD"浊流".
  • Why we think little about Test strategy in test plan

    2008-12-12 16:29:28

    AS we know, in the test plan, it shouod include test strategy. Normally I believe every company has his own test plan template. In the template, it may define Test Approach, Risk Assesment, Test Criteria and some Metrics.

    But sometimes, What QAs' job is just filling Feature test in the template, they don't care about test strategy in the template.

    Why we think little about test strategy in test plan? Below is the status:

    First, I guess the majority QA just regard it as virtual thing. QA just goes through the process, and everytime when a project comes, QA will only do black box test, function test. What QA's done is falling into make feature understanding. they don't like to think more about how to improve test effectiveness and efficency.

    Second, the time is very tough, QA has no much more time to think more. In this kind of case, maybe the project is very urgent or the whole project just breaks the normal process. 

    Third, QA has no sense about this part. Maybe the QA is fresh man, he even can't understand what test it is, how can we ask them to think more about test strategy.

    To resovle the problem, I think QA team should think more serious about test strategy; We may take some measures to check the test plan, especial for test strategy. If we have little time on this, we may write in simple way, at least it should explain why we don't think more about this. If the project is tested by a fresh man, Ok, I think the QA can ask a staff QA to give some advice. 

    As we know, test strategy is very important for QA, it presents our core ability. Before we test, we should indeed should think:

    • What end user focus?
    • What are the first priority?
    • Whether need we invovle third party help?
    • What mothodology should we take?
    • Whether need we to come out some test assistant tool?
    • What risk maybe introduce?
  • 也论自动化测试是否能够取代手工测试

    2008-12-12 07:47:18

    前两天在blog上看到一篇撰文,大概是讨论自动化测试和手工测试,其大意是自动化测试是趋势,自动化测试能够替代手工测试(http://www.51testing.com/?action_viewnews_itemid_99320.html). 在此小可不敢苟同. 小可使用自动化测试两年有余, 主要是web方面的.对自动化测试也略有心得.
       的确, 自动化测试确实可以很好的辅助测试,为什么说是辅助呢? 对于一些逻辑的检查,文字的检查这种东西确实可以交给自动化测试. 但是有两点自动化测试就有些问题:
       第一,用户体验测试.作为QA, 我们测试中除了对功能的检查外,还有一部分功能外的检查,比方说用户体验,这部分有可能在产品规格里不是很明确的定义.让自动化做用户体验检查,不敢想象,那需要多大的代价,至少我想需要引入人工智能,让machine具有自我学习,思维能力.而对于人工测试,这方面测试就方便的多,在功能测试当中,顺带就可以作一些用户体验方面的测试.
    第二,工期紧的项目 AD Hoc Test.大家知道,构建自动化测试需要投入一定的时间,即使你有一些libray可以利
    用,象我前期提到的automation upstream,但是如果工期很紧,从了解需求到测试到release时间很紧,
    in another word,测试时间跟本不够,QA能作的是设计一些比较high level的测试用例,在测试中,再设计些
    AD Hoc测试.我想在这方面,自动化的测试效果肯定是不理想的.
    还得回过头来,自动化测试还是很重要的,但是引入自动化测试是有些前提的,但是如果一句话说自动化测试能够替代手动测试,那是万万不可能的. 
    以上纯属个人观点,欢迎大家在这方面继续交流.

    转载请保留:本文出自frankyliu的51Testing软件测试博客:http://www.51testing.com/?40276
271/212>
Open Toolbar