将"测试"进行到底!~!

发布新日志

  • [转载]性能测试中批量数据制作实例的多种方法讨论

    2008-02-09 22:01:39

     摘 要: JAVA编程批量制造数据,UNIX SHELL脚本批量制造数据,ULTRAEDIT结合EXCEL批量制造数据
            关键词: 批量制作数据,ULTRAEDIT,EXCEL,JAVA,UNIX SHELL
    一、 前言
            在测试工作中经常遇到批量制造数据的情况,有时测试数据只需要一两行,而有时会需要数百行,数千行,甚至数万行,数百万行,制造数据的效率直接关系到测试工作的整体效率,所以如何高效制造数据对于测试工作非常重要。
            本文以一个性能测试中实际遇到的制造批量数据为例子,通过对不同的解决方法的分析执行,得到最有效最实用的批量制造数据的方法。
    二、 任务引入
            由于项目性能测试需要,要生长大量的sql语句,具体要求如下:
    1、 将以下内容:
    INSERT INTO `tbl_topic_object` VALUES ('1', '弃权', '1', '1', '2007-08-28 18:33:08', '', '3', '-1', '1', null);
    INSERT INTO `tbl_topic_object` VALUES ('2', '代表1183225', '1', '1', '2007-08-28 18:33:14', '', '0', '1', '2', null);
    INSERT INTO `tbl_topic_object` VALUES ('3', '代表2183225', '1', '1', '2007-08-28 18:33:14', '', '0', '2', '3', null);
    INSERT INTO `tbl_topic_object` VALUES ('4', '代表3183225', '1', '1', '2007-08-28 18:33:14', '', '0', '3', '4', null);
    INSERT INTO `tbl_topic_object` VALUES ('5', '弃权', '2', '1', '2007-08-28 18:34:40', '', '3', '-1', '1', null);
    INSERT INTO `tbl_topic_object` VALUES ('6', '代表1183358', '2', '1', '2007-08-28 18:34:46', '', '0', '4', '2', null);
    INSERT INTO `tbl_topic_object` VALUES ('7', '代表2183358', '2', '1', '2007-08-28 18:34:46', '', '0', '5', '3', null);
    INSERT INTO `tbl_topic_object` VALUES ('8', '代表3183358', '2', '1', '2007-08-28 18:34:46', '', '0', '6', '4', null);
    INSERT INTO `tbl_topic_object` VALUES ('9', '弃权', '3', '1', '2007-08-28 18:37:14', '', '3', '-1', '1', null);
    INSERT INTO `tbl_topic_object` VALUES ('10', '代表1183632', '3', '1', '2007-08-28 18:37:20', '', '0', '7', '2', null);
    INSERT INTO `tbl_topic_object` VALUES ('11', '代表2183632', '3', '1', '2007-08-28 18:37:20', '', '0', '8', '3', null);
    INSERT INTO `tbl_topic_object` VALUES ('12', '代表3183632', '3', '1', '2007-08-28 18:37:20', '', '0', '9', '4', null);

    生成类似下面的内容,生成四百行:
    INSERT INTO `tbl_topic_object` VALUES ('1  ', '弃权       ', '1  ', '1', '2007-08-28 18:33:08', '', '3', '-1 ', '1', null);
    INSERT INTO `tbl_topic_object` VALUES ('2  ', '代表1000001', '1  ', '1', '2007-08-28 18:33:14', '', '0', '1  ', '2', null);
    INSERT INTO `tbl_topic_object` VALUES ('3  ', '代表2000001', '1  ', '1', '2007-08-28 18:33:14', '', '0', '2  ', '3', null);
    INSERT INTO `tbl_topic_object` VALUES ('4  ', '代表3000001', '1  ', '1', '2007-08-28 18:33:14', '', '0', '3  ', '4', null);
    INSERT INTO `tbl_topic_object` VALUES ('5  ', '弃权       ', '2  ', '1', '2007-08-28 18:34:40', '', '3', '-1 ', '1', null);
    INSERT INTO `tbl_topic_object` VALUES ('6  ', '代表1000002', '2  ', '1', '2007-08-28 18:34:46', '', '0', '4  ', '2', null);
    INSERT INTO `tbl_topic_object` VALUES ('7  ', '代表2000002', '2  ', '1', '2007-08-28 18:34:46', '', '0', '5  ', '3', null);
    INSERT INTO `tbl_topic_object` VALUES ('8  ', '代表3000002', '2  ', '1', '2007-08-28 18:34:46', '', '0', '6  ', '4', null);
    INSERT INTO `tbl_topic_object` VALUES ('9  ', '弃权       ', '3  ', '1', '2007-08-28 18:37:14', '', '3', '-1 ', '1', null);
    INSERT INTO `tbl_topic_object` VALUES ('10 ', '代表1000003', '3  ', '1', '2007-08-28 18:37:20', '', '0', '7  ', '2', null);
    INSERT INTO `tbl_topic_object` VALUES ('11 ', '代表2000003', '3  ', '1', '2007-08-28 18:37:20', '', '0', '8  ', '3', null);
    INSERT INTO `tbl_topic_object` VALUES ('12 ', '代表3000003', '3  ', '1', '2007-08-28 18:37:20', '', '0', '9  ', '4', null);

    2、 注意需要转换的部分
    A.首先将整个列格式调整整齐;
    B.第一列数据从1生成400;
    C.第二列数据从:
    '弃权       ',
    '代表1000001',
    '代表2000001',
    '代表3000001',

    生成到:
    '弃权       ',
    '代表1000100',
    '代表2000100',
    '代表3000100',

    D.第三列数据从四行 1 生成到四行100
    E.第八列数据从:
    '-1 '
    '1  '
    '2  '
    '3  '

    生成到:
    '-1 '
    '298'
    '299'
    '300'

    3、 可以使用任何方法。

    三、 三种解决方法
    1、 JAVA编程批量制造数据
    //==============Insert.java=====================
    public class Insert
    {
     public static void main(String []args)
     {
      int count1 = 0;
      int t1 = 0;
      int t2 = 0;
      
      while(count1 < 100)
      {
       count1 += 1;
       int count2 = 0;
       while(count2 < 4)
       {
        count2 += 1;
        t1 += 1;
        
        switch(count2)
        {
         case 1:
         System.out.println("INSERT INTO `tbl_topic_object` VALUES ('" + t1 + "', '弃权', '" + count1 + "', '1', '2007-08-28 18:33:08', '', '3', '-1', '1', null);");break;
         case 2:
         t2 = 3 * (count1 - 1) + 1;
         System.out.printf("INSERT INTO `tbl_topic_object` VALUES ('" + t1 + "', '代表2000");
         System.out.printf("%03d",count1);
         System.out.printf("', '" + count1 + "', '1', '2007-08-28 18:33:14', '', '0', '" + t2 + "', '2', null);");
         System.out.println();break;
         case 3:
         t2 = 3 * (count1 - 1) + 2;
         System.out.printf("INSERT INTO `tbl_topic_object` VALUES ('" + t1 + "', '代表2000");
         System.out.printf("%03d",count1);
         System.out.printf("', '" + count1 + "', '1', '2007-08-28 18:33:14', '', '0', '" + t2 + "', '3', null);");
         System.out.println();break;
         case 4:
         t2 = 3 * count1;
         System.out.printf("INSERT INTO `tbl_topic_object` VALUES ('" + t1 + "', '代表2000");
         System.out.printf("%03d",count1);
         System.out.printf("', '" + count1 + "', '1', '2007-08-28 18:33:14', '', '0', '" + t2 + "', '4', null);");
         System.out.println();break;
         default:
          System.out.println("Error!");   
        }
       } 
       } 
      System.out.println("Successful!");
      }
    }

    评:使用关键字替换的方法,避免了大量的字符串拼接,使代码看起来干净清晰。
    2、 UNIX SHELL脚本批量制造数据
    HEAD="INSERT INTO \`tbl_topic_object\` VALUES ("
    F4F5F6="'1', '2007-08-28 18:34:46', '', "
    TAIL="null);"
    COUNT1=0
    COUNT2=1
    cat /dev/null > out.txt

    while [ $COUNT1 -le 99 ]
    do
     while [ $COUNT2 -le 4 ]
     do
      TMP=`expr $COUNT2 + \( $COUNT1 \* 4 \)`
      printf "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bProcess: 400 / $TMP"
      F1=`printf "%-3s" $TMP`
      TMP=`expr $COUNT1 + 1`
      F3=`printf "%-3s" $TMP`
      
      if [ $COUNT2 -eq 1 ]
      then
       F2="'弃权       '"
       F7="'3'"
       F8=`printf "%-3s" -1`
      else
       F7="'0'"
       TMP=`expr $COUNT1 \* 3 + $COUNT2 - 1`
       F8=`printf "%-3s" $TMP`
       TMP=`expr $COUNT1 + 1`
       TMP1=`expr $COUNT2 - 1`
       TMP2=`printf "%03d" $TMP`
       F2="'代表"$TMP1"000"$TMP2"'"
      fi
      F9="'$COUNT2'"
      TMP_STR=$HEAD"'$F1', "$F2", '"$F3"', "$F4F5F6$F7", '"$F8"', "$F9", "$TAIL
      echo "$TMP_STR" >> out.txt
      COUNT2=$((COUNT2+1))
     done
     COUNT1=$((COUNT1+1))
     COUNT2=1
    done
    echo "Process successfully!"

    评:使用两层循环,算法清晰简洁,部分使用算术表达式,语句上也来得更好看,最后结果也是经过格式整理的,比较齐整,不过要注意这些补进去的空格在插入数据表后会不会对后续工作有影响。

    3、 ULTRAEDIT结合EXCEL批量制造数据
    步骤:
    1) 用Excle生成400行“INSERT INTO `tbl_topic_object` VALUES ('”; 
    2) 将上面的生成的内容复制到UE中,在首行末选择“列块——》插入行号”,进行如下设置:
                c

    点击“确定”,将自动生成1——400行数字;
    3) 在Excle中自动生成400行“', '弃权
    ', '代表1
    ', '代表2
    ', '代表3”,将其复制到上面生成的结果之后;
    4) 在Excle中自动生成400行“000”,将其复制到上面生成结果之后;
    5) 接下来生成“
    001
    001
    001

    002
    002
    002”;
    (1)在UE中生成插入100行行号,参考第二步:
                    cccc

    与第二步不同之处为要选择“补0左对齐”复选框,确定后生成所需的“001——100”;
    (2)在“列块模式”下在全部行的行前增加“p”,将结果复制2次,变成如下结果:
    p001p001p001
    p002p002p002
    ……
    p100p100p100;
    然后选择替换“p”为换行,如图所示:
                  ccc

    此时,生成所需的

    001
    001
    001
      
    002
    002
    002”;
    第一个p将被转换为空行;
    (3)将上面的结果复制到第4步之后;
    6) 在Excle中生成400行“', '”,将其复制到上一步结果之后;
    7) 参考5(2)中生成“1
                          1
                          1
                          1
                          2
                          2
    ……,与5(2)中不同的是没有第一个的空行:
    1  p1  p1  p1
    2  p2  p2  p2
    ……
    100p100p100p100
    转换结果为:
    1
    1
    1
    1
    2
    2
    2
    ……
    100
    100
    100
    100
    将以上内容复制到第6步结果中;
    8) 将“', '1', '2007-08-28 18:33:08', '', '3', '
    ', '1', '2007-08-28 18:33:14', '', '0', '
    ', '1', '2007-08-28 18:33:14', '', '0', '
    ', '1', '2007-08-28 18:33:14', '', '0', '”
    复制到Excle中,生成400行内容,将其复制到第7步的结果中;
    9) 在Excle中编辑公式,生成如下内容:
    1     2      3
    4     5      6
    ……
    298  299   300
    将其复制到UE中,修改为一下内容:
    -1p1 p2   p3
    -1p4 p5   p6
    ……
    -1p298  p299 p300,替换:
                   cc

    结果为:
    -1

    2
    3
    -1

    5
    6
    ……
    -1
    298
    299
    300
    ,将以上内容复制到第8步的结果中;
    10) 在Excle中生成400行“', '1', null);
    ', '2', null);
    ', '3', null);
    ', '4', null);”,将其复制到上面生成的结果的之后。

            评:此方法适合不会编程和shell的测试人员,虽然有些复杂,但是操作熟练的话,也可以达到实用效果(本方法中的一些数字变化,也可以参考附录中的内容,效率会更高)。

            附加信息:用excel生成规则数据的方法
    A. 设置单元格格式为缺省(数字),直接将1,2,3列向下拉,得到1到400;
    B. 设置单元格格式为缺省,填写第一行为: =CEILING(ROW()/4, 1),向下拉,得到1,1,1,1,2,2,2,2到100
    C. 设置单元格格式为缺省,填写第一行为: =IF((MOD(ROW(),4)=1),"",TEXT(CEILING(ROW()/4, 1),"000000")),向下拉,得到000001,000001,000001,000001,000002,000002,000002,000002到000100
    D. 设置单元格格式为缺省(数字),填写第一行为:=IF((MOD(ROW(),4)=1),-1,(ROW()-(CEILING(ROW()/4,1)))),向下拉,得到-1,1,2,3,-1,4,5,6....-1,298,299,300
    四、 思考
            通过对该任务的分析执行,或许可以获得一些启迪:
            一个技术人员的能力也包括对环境和工具的掌握的熟练和深入程度;
            解决同一个问题的方法有很多,戏法人人会变,巧妙各有不同,技术没有高下之说,只有适合不适合实际情况之分。刮胡子用刮胡刀,切菜用菜刀,砍柴用斧头,各有各用处。这里是制造四百条数据,如果是制造四百万条数据,适合的方法就会大不相同了;
            要做一个好的技术人员,需要有个丰富的兵器库,才能面临问题的时候,左右逢源,得心应手。
            些许经验,共享之,错漏难免,不吝赐教。

Open Toolbar