发布新日志

  • vi指令

    2008-08-29 11:26:26

    vi visual edit 的缩写
    文本编辑器是所有计算机系统中最常用的一种工具。UNIX下的编辑器有ex,sedvi等,

    其中,使用最为广泛的是vi,而vi命令繁多,论坛里好像这方面的总结不多,以下稍做
    总结,以资共享!渴望更正和补充!

    进入vi的命令
    vi filename :打开或新建文件,并将光标置于第一行首
    vi +n filename :打开文件,并将光标置于第n行首
    vi + filename :打开文件,并将光标置于最后一行首
    vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
    vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
    vi filename....filename
    :打开多个文件,依次进行编辑


    移动光标类命令
    h :光标左移一个字符
    l :光标右移一个字符
    space:光标右移一个字符
    Backspace:光标左移一个字符
    kCtrl+p:光标上移一行
    jCtrl+n :光标下移一行
    Enter :光标下移一行
    wW :光标右移一个字至字首
    bB :光标左移一个字至字首
    eE :光标右移一个字至字尾
    ) :光标移至句尾
    ( :光标移至句首
    }:光标移至段落开头
    {:光标移至段落结尾
    nG:光标移至第n行首
    n+:光标下移n
    n-:光标上移n
    n$:光标移至第n行尾
    H :光标移至屏幕顶行
    M :光标移至屏幕中间行
    L :光标移至屏幕最后行
    0:(注意是数字零)光标移至当前行首
    $:光标移至当前行尾

    屏幕翻滚类命令
    Ctrl+u:向文件首翻半屏
    Ctrl+d:向文件尾翻半屏
    Ctrl+f:向文件尾翻一屏
    Ctrlb;向文件首翻一屏
    nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

    插入文本类命令
    i :在光标前
    I :在当前行首
    a:光标后
    A:在当前行尾
    o:在当前行之下新开一行
    O:在当前行之上新开一行
    r:替换当前字符
    R:替换当前字符及其后的字符,直至按ESC
    s:从当前光标位置处开始,以输入的文本替代指定数目的字符
    S:删除指定数目的行,并以所输入文本代替之
    ncwnCW:修改指定数目的字
    nCC:修改指定数目的行

    删除命令
    ndwndW:删除光标处开始及其后的n-1个字
    do:删至行首
    d$:删至行尾
    ndd:删除当前行及其后n-1
    xX:删除一个字符,x删除光标后的,而X删除光标前的
    Ctrl+u:删除输入方式下所输入的文本

    搜索及替换命令
    /pattern:从光标开始处向文件尾搜索pattern
    ?pattern
    :从光标开始处向文件首搜索
    pattern
    n
    :在同一方向重复上一次搜索命令

    N:在反方向上重复上一次搜索命令
    s/p1/p2/g:将当前行中所有p1均用p2替代
    n1,n2s/p1/p2/g:将第n1n2行中所有p1均用p2替代
    g/p1/s//p2/g:将文件中所有p1均用p2替换

    选项设置
    all:列出所有选项设置情况
    term:设置终端类型
    ignorance:在搜索中忽略大小写
    list:显示制表位(Ctrl+I)和行尾标志($)
    number
    :显示行号

    report:显示由面向行的命令修改过的数目
    terse:显示简短的警告信息
    warn:在转到别的文件时若没保存当前文件则显示NO write信息
    nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
    nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
    mesg:允许vi显示其他用户用write写到自己终端上的信息

    最后行方式命令
    n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
    n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
    n1,n2 d :将n1行到n2行之间的内容删除
    w :保存当前文件
    e filename:打开文件filename进行编辑
    x:保存当前文件并退出
    q:退出vi
    q!:不保存文件并退出
    vi
    !command:执行shell命令
    command
    n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指

    n1n2,则表示将整个文件内容作为command的输入
    r!command:将命令command的输出结果放到当前行

    寄存器操作
    "?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
    "?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
    "?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
    "?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以
    是一个数字
    ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

    进入vi
    vi test
    离开
    vi
    :q!
    离开vi,并放弃刚在缓冲区内编辑的内容。

       :wq 将缓冲区内的资料写入磁盘中,并离开vi
       :ZZ wq
    wq
    :w
    将缓冲区内的资料写入磁盘中,但并不离开vi

      :q 离开vi,若文件被修改过,则会被要求确认是否放弃修改的内容,此指令可与:
    w
    配合使用。

    Vi 的操作模式
    Vi 提供两种操作模式:
    输入模式(insert mode
    指令模式(command mode
    当使用者进入vi后,既处于指令模式下,此刻键入任何字元皆被视为指令。
    输入模式:a(append) 游标之后加入资料。
    A 该行之末加入资料
    i (insert) 游标之前加入资料
    I 该行之首加入资料
    o (open) 新增一行与该行之下供输入资料
    O 新增一行与该行之上供输入资料
    指令模式:B     移至该行第一个字符,若光标在该行第一字符则光标移至上一
    行第一字符。
       b   由游标所在位置之前一个字串的第一个字元
         cc 删除整行,修改整行的内容。
         D     以行为单位,删除游标在内后面的所有字符。
    db 删除该行光标前字符
         dd 删除该行
         de 删除自光标开始后面的字符
         d加字符   删除光标所在位置至字符之间的单
         E      移至该行最后字符,若光标在该行最后字符则光标移至下一
    行最后字符
     e      由游标所在位置至该字串的最后一个字元
         G 移至该档案的最后一行 
         h 向前移一个字元
    j 向下移一个字元
    k 向上移一个字元
    0 移至该行之首
    M 移至视窗的中间那行
    L 移至视窗的最后一行
         l 向后移一个字符
    0 由游标所在位置该行的第一个字元
    nG 移至该档案的第n
    n+ 自游标所在位置向后移n行至该行的第一字符
    n- 自游标所在位置向前移n行至该行的第一字符
    R 进入取代状态,直到《ESC》为止
    s 删除游标所在字元,并进入取代模式直到《ESC
    S 删除游标所在之该行资料,并进入输入模式直到《ESC
    w 由游标所在位置之下一个字串的第一个字元
    x 删除游标所在该字元。
    X 删除游标所在之前一字元。
    r 用接于此指令之后的字元取代(replace)游标所在字元
    yy yank整行,使游标所在该行复制到记忆体缓冲区
    <ctrl><g> 显示该行之行号、档案名称、档案中最末之行号、游标所在行号占
    总行号之百分比
    $ 由游标所在位置至该行的最后一个字元。
    )由游标所在位置至下一个句子的第一个字元。
    (由游标所在位置至该句子的第一个字元。
    { 由游标所在位置至该段落的最后一个字元。
    } 由游标所在位置至该段落的第一个字元
    yankdelete可将指定的资料复制到记忆体缓冲区,而藉有put指令可将缓冲区内的资
    料复制到荧幕上
    例如:搬移一行:在该行执行dd
    游标移至目的地

    执行p
    复制一行:在该行执行
    yy
    游标移至目的地

    执行p
    视窗移动:

    <ctrl><f> 视窗往下卷一页
    <ctrl><b> 视窗往上卷一页
    <ctrl><d> 视窗往下卷半页
    <ctrl><u> 视窗往上卷半页
    <ctrl><e> 视窗往下卷一行
    <ctrl><y> 视窗往上卷一行
    删除、复制及修改指令介绍:
    d(delete)c(change)y(yank)这一类的指令在vi 中的指令格式为:
    operation+scope=command
    (
    运算子)(范围)
    运算子:
    d 删除指令。删除资料,但会将删除资料复制到记忆体缓冲区。
    y 将资料(字组、行列、句子或段落)复制到缓冲区。
    p 放置(put)指令,与dy配合使用。可将最后deleteyank的资料放置于游标所在
    位置之行列下。
    c 修改(change)指令,类似deleteinsert的组合。删除一个字组、句子等资料,并
    插入新键入的

    转载自http://user.qzone.qq.com/171457020/blog/1219920092

  • 自动生成CVS用户

    2008-08-28 13:19:48

    #!/bin/bash
    #ALLUSER="name1:passwd1 name2:passwd2 ....."#用户名:密码
    LOGNAME="creatUser.log"                     #日志文件名
    HOMEDIR="/home/users"                       #新建用户的工作目录
    ALLUSER="liyong:ironyagami zhanghua:123 chenzf:321 jiangjs:88031
    `echo >>./$LOGNAME`
    `echo >>./$LOGNAME`
    `echo "****************************************" >>./$LOGNAME`
    `date >> ./$LOGNAME`
    `echo "****************************************" >>./$LOGNAME`
    `echo >> ./$LOGNAME`
    for user in $ALLUSER                        #遍历用户信息,取出用户名和密码         
    do
         declare -a userInfo
         declare -a flag
         userInfo=($(echo $user|awk -F ':' '{print $0}'|sed "s/:/ /g"))
         name=${userInfo[0]}                    #用户名
         passwd=${userInfo[1]}                  #密码
    #    echo $name
    #    echo $passwd
         flag=($(grep $name /etc/shadow|awk -F ':' '{print $0}'|sed "s/:/ /g"))
         if [ -z "${flag[0]}" ] ; then
    #creat user info 用户不存在则新建用户
         mkdir -p $HOMEDIR/$name                #新建工作目录
         chown $name:cvsroot $HOMEDIR/$name
        `echo "new user is creaing,the name is $name">>./$LOGNAME`
         useradd -s /sbin/nologin -d $HOMEDIR/$name -g ALLUSER $name >> ./$LOGNAME
         echo $passwd |passwd $name --stdin >> ./$LOGNAME
        `echo "user is created sucessfullly!!!" >>./$LOGNAME`
        `echo >> ./$LOGNAME`
     else
    #modify user info 否则就修改用户信息
        mkdir -p $HOMEDIR/$name
        chown $name:cvsroot $HOMEDIR/$name
        `echo "$name is exsit,it will be modified">>./$LOGNAME`
        usermod -s /sbin/nologin -d $HOMEDIR/$name -g ALLUSER $name >> ./$LOGNAME
        echo $passwd |passwd $name --stdin >> ./$LOGNAME
        `echo "user is modified sucessfullly!!!" >>./$LOGNAME`
        `echo >> ./$LOGNAME`
     fi
    done

    `echo >>./$LOGNAME`
    #creat /home/cvsroot/CVSROOT/passwd
    CVSROOT="/home/cvsroot"
    for user in $ALLUSER                 #在shadow中取出用户的密码信息,写入CVSROOT/passwd
    do
            declare -a userInfo
            declare -a arr
            userInfo=($(echo $user|awk -F ':' '{print $0}'|sed "s/:/ /g"))
            name=${userInfo[0]}
            passwd=${userInfo[1]}
    #       echo $name
    #       echo $passwd
    #       `echo "new passwd is added or modified in $CVSROOT/CVSROOT/passwd,the name #       is $name">>./$LOGNAME`
            arr=($(grep $name /etc/shadow|awk -F ':' '{print $0}'|sed "s/:/ /g"))
            flag=($(grep -n $name $CVSROOT/CVSROOT/passwd|awk -F ':' '{print $0}'|sed "s/:/ /g"))
    #        echo ${flag[0]} #行号
     if [ -n "${flag[1]}" ] ; then              #存在则修改
           `echo $name is exsit,no change the passwd!!! >>./$LOGNAME`
           sed "${flag[0]} d" $CVSROOT/CVSROOT/passwd $CVSROOT/CVSROOT/passwd.copy
           mv -f $CVSROOT/CVSROOT/passwd.copy $CVSROOT/CVSROOT/passwd
           `echo the passwd is modified sucessfully!!! >>./$LOGNAME`
           `echo >> ./$LOGNAME`
     else                                       #不存在就直接写入
           `echo creating passwd for new user:$name !!! >>./$LOGNAME`
           `echo ${arr[0]}":"${arr[1]}":"$name >>$CVSROOT/CVSROOT/passwd`
           `echo ${arr[0]}":"${arr[1]}":"$name >>./$LOGNAME`
           `echo "passwd is created sucessfullly!!!" >>./$LOGNAME`
           `echo >> ./$LOGNAME`
     fi
    done

  • 代码发布简易流程

    2008-08-28 12:09:36

     

  • web项目性能测试方案

    2008-08-28 11:54:04

    任务:
     测试JBOSS环境下UBSS项目的性能
     目标:测试缴费部分(前台缴费,IC卡充值)在并发数从50-100递增的性能指标,不要求对结果进行分析

    步骤:
     1.搭建测试环境,要求与真实环境大概一致(关注在现有license情况下,UBSS系统支持的最大并发数)
     2.准备数据脚本(SQL和存储过程)
     3.准备测试脚本(Vuser scrīpts,scenario)
     4.进行性能测试

    测试范围
     针对UBSS项目,抽取对系统影响最大、最为典型的业务交易,构建场景,以此评判系统的整体性能和实际性能表现
     a.用户前台缴费
     b.标准用户IC卡充值

    测试内容
     1.基准测试
      概念:检查每个业务的基准响应时间(系统整体空闲,无额外进程运行并占用系统资源)
      方法:单用户运行业务多次,获取该业务的平均响应时间

      序号 功能名称 并发用户数 循环次数 操作间隔 循环间隔
      1-1    前台缴费     1        100       3       3
      1-2    IC卡充值     1        100       3       3

     2.单个交易负载测试
      概念:设定负载序列,并发用户数为X{20,30,50,....},收集系统单个交易在不同负载级别的性能表现
      方法:设置并发用户数等于X,关键步骤处设置并发点,每个用户运行N个iteration,获取平均响应时间和吞吐量

      用户登陆方式:每2秒登陆2个
      序号 功能名称 并发用户数 循环次数 操作间隔 循环间隔
      2-1  前台缴费      5        50       3       3
      2-2  前台缴费      10       50       3       3
      2-3  前台缴费      15       50       3       3   注:响应时间超过30S 
      2-4  前台缴费      20       50       3       3    注:阻塞,不进行测试
      2-5  IC卡充值      5        50       3       3
      2-6  IC卡充值      10       50       3       3
      2-7  IC卡充值      15       50       3       3
      2-8  IC卡充值      20       50       3       3

     3.组合交易负载测试
      概念:多个交易组合在一起,设定负载序列,并发数为X{20,30,50,....},收集系统在不同负载级别的性能表现
      方法:设置并发总数,各用户数按比例分配,每个用户运行N分钟,获取平均响应时间和吞吐量

      序号      功能名称        并发用户总数  比例    持续时间 操作间隔 循环间隔
      3-1  前台缴费,IC卡充值      5          2:3      20m         3       3
      3-2  前台缴费,IC卡充值      10         2:3      20m         3       3
      3-3  前台缴费,IC卡充值      15         2:3      20m         3       3
      3-4  前台缴费,IC卡充值      20         2:3      20m         3       3

    性能指标
     1.主机系统性能指标
      CPU使用率
      内存占用率
      磁盘读写

     2.数据库性能指标(略),可直接看应用系统所在主机情况

     3.中间件指标(略),可直接看应用系统所在主机情况

     4.业务指标
      平均响应时间
      最长响应时间
      吞吐率

    衩测系统环境描述
     1.系统架构
      J2EE架构,多层结构,即展示层、应用服务层、数据服务层

     2.主机环境
      主机名         型号   主机IP CPU数  内存  磁盘  用途
      数据库主机  192.168.1.8   
      应用主机  192.168.1.33 1   2G 

     3.软件环境
      项目  信息  备注
      操作系统 window xp 应用主机
        linux  数据库主机
      数据库  oracle10G
      中间件  EOS5.3 for JBOSS 
      测试工具 LoadRunner8.1 破解

     4.数据库环境
      数据库实例 orcl
      数据规模 
        用户数量:837,060
        客户数量:857,043
        帐户数量:832,727
        未缴费帐单:403,839
        IC卡用户信息:404,607
        发票数量:1,169,600
        用户表具信息:846,999
        计费策略:845,771
        已缴费帐单:5,593,951


     5,测试客户机
      序号 IP  操作系统  配置    用途
      1 192.168.1.30 window xp pentium4 3.2GHz memory 1G generator+controoler

    测试报告
     由anilys自动生成

  • LoadRunner使用笔记

    2008-08-28 10:37:35

    工具介绍
     LoadRunner: LoadRunner是一种预测系统行为和性能的工业标准级负载测试工具。通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题。
     10字真言:虚拟的用户,真实的负载
     VuGen: 脚本录制工具
     Controller:场景控制器
     Analysis: 结果分析工具

    经验总结
     1.测试需求及目标
      a.性能测试的第一步工作就是要“明确客户的需求“,这一阶段我称之为命题作文。作文如果跑题了即使长篇大论也无济于事。
      b.这一阶段的参与者包括需求提出人员和测试人员,由于性能测试一般没有需求变更的情况,要求需求人员一定是比较权威。
      c.一般来说,项目级性能测试客户自身会根据系统使用者范围(总用户数或在线用户数),系统使用环境(集中或分布),高峰作业量(并发用户)提出明确的要求,测试人员也可以提出一些供参考的经验值作为预期的目标。
      d.如果系统测试属于产品测试,那么除了经验值目标外还应包含产品比对,这也是很多产品性能测试采用的一般模式。
      e.性能测试的需求的大致分为两种:
       一种是压力需求,要求××场景××并发用户下平均响应时间小于可接受值;
       另一种是负载需求,要求××场景响应时间在××内支持××用户数。
       二种测试的方法略有不同,但都能够通过测试工具简单操作完成切换。


     2.测试设计
      a.测试设计的原则:从简单到复杂
      b.测试设计主要是测试人员根据测试目标准备测试方案和选取案例。
      c.对于项目级测试,在测试需求中一般都会进行相关的说明,大多数情况下是将系统中关键业务处理场景作为性能测试案例,
      d.考虑到减少测试的复杂性,可以对业务场景中的测试案例进行进一步加工,比如实际场景中可能在一次请求中包含多次子操作(既查询,又修改),那么可以将这些操作拆分,这样更有利于分析结果数据,同时可以抛开业务操作功能之外的消耗(比如有些复杂页面包含很多查询结果,可以拆开分别进行测试,或者页面中包含较多的图片或flash也可以剥离出去,当然也可以利用测试工具中功能达到类似效果)


     3.测试环境
      a.测试环境=硬件环境+软件环境
      b.测试环境在整个性能测试中是一个非常重要的工作。因为在测试报告中测试环境是最客观的指标,同时也是整个性能测试结果的基础
      c.测试环境包括网络环境、硬件环境和软件环境。测试的服务器最好在同一个网段,硬软件最好和真实环境一致。说起来简单做起来难,在搭建环境的过程中一定要自己检查,尤其是软件环境涉及操作系统、应用服务器、数据服务器,更要做到完全一致,因为性能测试的数据都是上万级,结果数据往往相差都是毫秒级,一个小小的索引都会导致极大的差异。


     4.脚本录制和测试工具
      a.环境搭建好之后,可以开始录制脚本,录制脚本使用LoadRunner Virtual User Genorator工具,具体使用的方法网上有很多介绍,我的体会还是很容易上手,下面介绍一些经验和体会
      b.事务设置
       由于实际业务可能包括多个子操作,新增、查询、修改、删除。可以考虑使用事务分别进行监控,事务的使用也很简单,loadrunner的菜单栏提供加入事务功能。
      c.参数变量和函数的使用
       在测试中,我们可能需要录入一个随机数据或者一个枚举的顺序数据,比如业务场景中的数据主键可能一个日期+唯一序列码,同时业务场景中主键是由系统程序(java代码)而不是数据库生成,这时候可以使用LoadRunner提供的参数来实现,参数被定义来自一个文件、一个随机数或者是一个顺序枚举,我仅尝试了后两种。(实际操作中定义参数后可以使用函数将参数和日期拼接成主键值)
      d.Loadrunner提供一系列脚本函数,我使用其中的一部分,感觉还是很好用的。包括日志输出、数据转换、页面交互(以Web_***开头的),尤其是在作删除事务的时候,由于需要取得新增数据的主键,可以考虑在新增数据后把主键值保存在页面,loadrunner会在请求的时候从返回数据中得到这个主键值并保存在脚本变量中,删除的时候可以使用这个变量来进行删除工作。使用web_reg_save_param可以达到这个目的,比如web_reg_save_param(”userid”,”LB=ABC”,”RB=EFG”,LAST)就是把返回页面中的正则匹配ABC***EFG中的***保存在userid变量中,”LB”标志数据的左边界,同时”RB”标志数据的右边界,使用时同时要注意,这个函数相当于一个过滤器filter,所以一定要把它放在发出请求的事务前面。如果页面返回的数据比较多可以设置buffer值来增大返回数据的容量。
      e.所有函数的用法都可以在工具提供的帮助文件中找到,个人体会比使用Google要好。
      f.即使是测试本地系统,录制脚本的目标URL不要设置为http://localhost:7073/*.do或者http://127.0.0.1:7073/*.do,而应该使用真实的本地ip。
      g.运行结束后,LoadRunner会弹出一个测试结果窗口,同时运行时的页面还可以通过在LoadRimmer User Generator中切换察看树形视图进行检查。
      h.通过检查数据库可以确认脚本是否按照预期进行了正确的数据操作。
      i.在做关联的时候,应该从数据第一次出现的位置之前做关联,否则就会出现找不到数据的情况


     5.测试计划及测试工具
      a.脚本调试完毕,我们进入正式的测试工作,开始使用LoadRunner的控制台进行详细的测试计划编排和设置
      b.关于如何使用控制台大家可以找到很多参考,我这里仅列出几点体会:
       i  .运行测试之前一定要先进行脚本验证,保证在无并发用户的情况下脚本能正确执行。
       ii .运行测试一般设置测试运行的duration即可,但是为了对测试所执行的数据监控,也可以采取设置运行次数RunLogic来达到目的,比如并发用户10个,每个用户运行10次,那么如果每个用户执行一次插入数据动作,最终应该产生100条数据。
       iii.取消浏览器模拟browser emulation可以阻止测试中页面非测试数据的下载进而让测试结果更干净。
       iv .no thinktime模式服务器压力比较大,如果是稳定性测试可以在事务间加入适当的thinktime,因为稳定性测试并不是压力测试。
       v  .并发用户较大时应该采用逐步增加用户的方式来执行计划(比如每隔15秒增加10个用户),执行计划时间一定要达到足够产生稳定的数据。(通过测试监控观察,可以在测试运行中随时增加新的用户来延长测试时间)


     6.测试结果分析
      a.测试分析是性能测试的最后一关,如果前面的工作没有失误的话,应该是水到渠成,可是大多数情况下我们还是需要对结果进行进一步分析,并调整我们的测试策略(包括环境、案例及脚本)
      b.Loadrunner提供强大的测试分析工具-analysis,可以将测试数据提取出来进行事后分析。
      c.其中最重要的是响应时间response time和吞吐量(hps),顾名思义,响应时间越小越好,吞吐量越高越好。当然资源消耗(CPU,MEMORY)越少越好。但是其实并不完全,对于一个系统来说,也要讲和谐,也既是所有的资源使用应该使用率应该保持一致。如果测试显示应用服务器CPU特别高,数据服务器特别低,那么系统运行肯定不正常,这时候需要检查是否网络正常,数据服务器是否有死锁等。
      d.一般我们可以对测试结果做一点处理让数据更准确,比如设置过滤器去除不稳定数据,可以设置时间段截取稳定运行时间内的数据作为标本数据。
      e.一旦分析完毕,可以将结果导出到网页作为测试报告

    注:本文为转载,希望作者能来认领,呵呵

我的存档

数据统计

  • 访问量: 5509
  • 日志数: 5
  • 文件数: 1
  • 建立时间: 2008-08-28
  • 更新时间: 2008-08-29

RSS订阅

Open Toolbar