我相信:一片叶子也能倾倒整个季节

发布新日志

  • vi 命令傻瓜讲解

    2008-10-27 20:17:59

     
    正文

    下面介绍vi 的一般用法,本文适合初学者入门,但不适合作为手册进行查询,如果需要以命令导向的手册,请使用$ man vi|more ,或看这里的:vi 命令一览表。
    打开文件进入编辑

    编辑一个文件:

    $ vi example.txt

    同时编辑多个文件:

    $ vi file1 file2 ... fileN

    如果使用vi 编辑的某个文件没有正常保存退出,会遗留一个隐含的文件:.filename.swp ,使用如下命令恢复从最后一次保存到非正常退出前所做的编辑:

    $ vi -r filename

    注意当前模式

    进入文件编辑后,vi有四种模式,一种是插入模式(按键盘i 进入),这个模式下键盘输入会作为字符增加到文件中。

    另一种是编辑模式,这个状态下可以直接输入命令来移动光标,删除字符等操作,不需要回车确认,每一个命令按键都会直接发生作用。在插入模式下按ESC 键会回到编辑模式。

    第三种是命令模式,在编辑模式下按冒号":" 即进入命令模式,这时键盘输入的字符会出现在屏幕下方,回车后,命令执行。这个模式下可以输入保存、字符串搜索、退出编辑等命令。命令模式下,按回车或者ESC 键,回到编辑模式。

    第四种是搜索模式,在编辑模式下输入斜杠"/" 或者问号"?" 即进入搜索模式。

    上面的四种模式是我为了描述方便所起的名字,下面将引用到。
    光标移动

    光标的上、下、左、右移动,分别对应按键:k、j、h、l (编辑模式)。

    定位到最后一行,输入大写G(编辑模式)。

    回到第一行,输入小写g(编辑模式)。

    跳到第n 行,在命令模式下输入数字n ,回车。

    显示当前所在行数和列数,编辑模式下输入ctrl+g 。
    插入内容

    在当前字符前面插入内容,编辑模式下输入i ,进入了插入模式,然后输入内容,输入完成之后,按ESC 回到编辑模式。

    在当前字符后面插入内容,编辑模式下输入a ,其它操作与上面相同。

    在本行首插入内容,编辑模式下输入大写I 。其它操作与上面相同。

    在本行尾追加内容,编辑模式下输入大写A 。其它操作与上面相同。
    删除

    删除当前光标的字符,编辑模式下输入x ,如果希望删除当前光标前面的字符,输入大写X 。

    删除一行,编辑模式下连续两次输入d 。删除一个单词,编辑模式下依次输入dw 。

    从当前光标删除至行尾,编辑模式下依次输入d$ 。
    撤销操作

    撤销刚才的一次修改,编辑模式下输入u ,撤销对这一整行的修改,输入大写U 。

    如果希望撤销对文件的所有修改,命令模式下依次输入e! ,回车(输入冒号":" 进入命令模式,:e!)。
    拷贝粘贴

    拷贝一行内容,编辑模式下连续输入两次y 。

    将剪贴板中的一行粘贴到当前行的后面,编辑模式下输入p 。

    拷贝n 行内容,编辑模式下输入数字n(n是要拷贝的行数,从当前行算起),然后输入y ,拷贝完成,输入p 粘贴多行。
    保存/退出

    如果保存并关闭文件,命令模式下输入x ,回车即可。

    如果保存,同时继续文件编辑,命令模式下输入w ,回车。

    如果放弃所有更改,直接退出,命令模式下输入q! ,回车。

    命令模式下输入wq 与x 等价。
    在两个文件中复制粘贴

    需要将file2 的某行粘贴到file1 中。

    同时打开两个文件,中间用空格分隔:

    $ vi file1.txt file2.txt

    打开后当前编辑的为file1 ,在命令模式下输入n ,切换到file2。

    找到相关行,编辑模式下输入yy ,再进入命令模式,输入大写N ,切换回上一个文件(以打开顺序为准),找到相关位置,编辑模式下输入p ,粘贴完毕。

     
    搜索字符串

    要搜索字符串abc ,在搜索模式下(编辑模式下输入斜杠"/" 或者问号"?" 即进入搜索模式),输入abc ,回车。

    如果找到,光标会定位到从当前位置到第一个出现字符串abc 的位置,输入n 会跳到下一个abc 出现的位置,输入大写N ,跳到上一个abc 出现的位置。

    斜杠"/" 与问号"?" 的区别,前者向后正向搜索,后者向前反向搜索。
    替换字符串

    要将当前行中的所有字符串abc 替换成efg ,命令模式下输入s/abc/efg/g ,回车。

    上面命令只会替换abc 而不会替换ABC 或者aBc 。如果希望忽略大小写,加上参数i ,s/abc/efg/gi ,回车。

    如果希望进行全文件范围替换,命令模式下输入%s/abc/efg/g ,回车。

    如果替换的字符串中包含了例如斜杠"/" 这样的特殊字符,使用反斜杠"\" 转义。

    命令模式下,输入%s/\/image/\/img/gi ,回车

    以上命令会将文件中所有的字符串/image 替换成 /img ,并且不区分image 的大小写。

  • PC-lint---代码规范性检查工具

    2008-10-15 11:39:56

    产品名称:PC-lint for C/C++

     开发公司:Gimpel

     当前版本:


    详细信息 相关资料 技术支持 购  买 下  载  
    产品介绍:PC-lint for C/C++
    按此在新窗口浏览图片

    PC-lint for C/C++ 用于检查你的C/C++源代码,帮您发现矛盾、冗余和错误等
    PC-LINT是GIMPEL SOFTWARE公司的产品,其中的内容是非常广泛的,光是选项就有30 0多个,涉及到程序编译及语法使用中的方方面面。本篇培训材料旨在引导读者入门,学会 PC-LINT的基本使用方法,起抛砖引玉的作用,能让读者从这里起步继续去研究如何娴熟地 使用PC-LINT的各种选项,能让它充分为我们的开发工作服务。
    1.概述 
      如果要给LINT工具下一个形象点的定义,那就是:一种更加严格的编译器。它不仅可 
    以象普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求, 
    但很可能是潜在的、不易发现的错误。请看下面的例子: 
    1: 
    2:char *report( int m, int n, char *p ) 
    3:{ 
    4: int result; 
    5: char *temp; 
    6: long nm; 
    7: int i, k, kk; 
    8: char name[11] = "Joe Jakeson"; 
    9: 
    10: nm = n * m; 
    11: temp = p == "" ? "null" : p; 
    12: for( i = 0; i 13: { 
    14: k++; 
    15: kk = i; 
    16: } 
    17: 
    18: if( k== 1 ) result = nm; 
    19: else if( kk > 0 ) result = 1; 
    20: else if( kk < 0 ) result = -1; 
    21: 
    22: if( m == result ) return( temp ); 
    23: else return( name ); 
    24:} 
      上面的代码用一般的编译器编译是一段有效的代码,但是用PC-LINT编译就会有几个告 警。首先第8行向name数组赋值时丢掉了nul字符,第10行的乘法精度会失准,第11行的比 较有问题,第14行的变量k没有初始化,第15行的kk可能没有被初始化,第22行的result也 有可能没有被初始化,第23行返回的是一个局部对象的地址。这段代码在大部分编译器下 是可以顺利编译通过的,继续查找其中的错误就要靠人工调试程序,如果程序很大,这将 是一项烦琐的工作,没有人可以保证能找出所有的这类问题,但PC-LINT只通过一次简单的 编译就可做到,显然为我们节省了大量的开发时间
    功能
      1) PC-Lint是一种静态代码检测工具,可以说,PC-LINT是一种更加严格的编译器,不仅可以象普通编译器那样检查出一般的语法错误,还可以检查出那些虽然完全合乎语法要求,但很可能是潜在的、不易发现的错误。
      2) PC-lint不但可以检测单个文件,也可以从整个项目的角度来检测问题,因为C语言编译器固有的单个编译,这些问题在编译器环境下很难被检测,而PC-Lint在检查当前文件的同时还会检查所有与之相关的文件,可想而知,它会对我们有很大的帮助。
      3) PC-lint支持几乎所有流行的编辑环境和编译器,比如Borland C++从1.x到5.x各个版本、Borland C++ Build、GCC、VC,VC.net、watcom C/C++、Source insight、intel C/C++等等,也支持16/32/64的平台环境。
      4) 支持Scott Meyes的名著(Effective C++/More Effective C++)中说描述的各种提高效率和防止错误的方法
    四步速成PC-Lint概述
      这么好的工具,当然是先拿起来用了再说,这里分为四步,保证你马上可以使用PC-Lint了,当然,如果你上手以后,想细致深入学习这个工具,可以在网上查找相应的资料,另外在我的另一个系列文章《软件开发的七种武器》中有一篇是讲述 PC-Lint使用的,比这篇要深入细致一些,如有兴趣,也可以看看。
      第一步:安装&设置
      安装和通常的软件没有什么不同。安装结束后在PC-Lint安装目录下运行CONFIG.exe,各项设置简要解释如下:
      a) 第一步,给出PC-Lint的安装路径和选择设置的保存文件。
      b) 第二步,选择你所使用的C/C++编译器:比如Visual C++ 6.x。
      c) 第三步,选择内存模式:比如32 bit Flat Model。
      d) 第四步,选择所使用的库:比如MFC,OWL,等,可多选,在windows下开发的一般要选中windows 32 bit。
      e) 第五步,C++编程提出过重要建议的作者,选择某作者后,他提出的编程建议方面的选项将被打开:比如Scott Meyers,可不选。
      f) 第六步,头文件的设置:可在后面步骤中手工添加。
      第二步:整合PC-Lint到选定的编译环境
      当你在上述第二步中选择了编译器后,可以在PC-Lint目录下找到一个"env-选用的编辑环境.lnt"文件,比如对于Source insight 是env-si.lnt,对于vc6是env-vc6.lnt。打开此文件,根据上面的描述,配置你的编译器,下面以VC6为例:
      •选取菜单 tools | customize.....
      •选取 Tools 标签
      •点按主对话框上方的虚线小方框 New
      •输入 name: PC-LINT
      •输入 Command: c:\lint\lint-nt.exe,假设安装到此路径
      •输入 Arguments: c:\lint\std.lnt ?(FilePath)?7)选择 (x) Use Output Window
      •Close
      第三步:Lint单个C文件
      a) 打开一个C文件
      b) 运行第2)步集成上的PC-Lint菜单项
      c) LINT结果会在一两秒之内出来。告警的解释可参考LINT安装目录下MSG.TXT文件,打开文件,通过查找告警号码定位,就可以看到比较详细的说明。
      第四步:Lint多个C文件
      a) 在LINT软件目录下建立PRJLINT.LNT文件,文件的第一行是使用的LINT配置文件名,从第二行开始,列出想所有要LINT的*.C文件名,一行一个。如果要把结果输出到文件,在前面加上一行"-os(文件名)"(例如:"-os(c:\lint\result.txt)")。样例:YF_Config.lnt
      // 以下为自己想要进行Lint的.C文件,
      G:\src\tt\tt1.c
      G:\src\tt\tt2.c
      …
      b) 用2)介绍的方法在Source Insight"中介绍的方法增加一条"PC-LINT PROJECT"命令,所有设置与"PC-LINT"设置相同,除了
      ①"Custom Commands"对话框中"RUN"编辑框的文字由"C:\LINT\LINT-NT.EXE filename.lnt %f"改为"C:\LINT\LINT-NT.EXE PRJLINT.LINT",也就是把配置文件名改为PRJLINT.LNT,并去掉未尾的"%f"
      ②设置的快捷键与PC-LINT要区别开来
      利用下面的DOS命令可以用来得到一堆*.C文件的清单。例如:
      ① 列出C:\SRC下所有*.C文件,并保存到C:\SRC\FILELIST.TXT:
      DIR C:\SRC\*.C /B >C:\SRC\FILELIST.TXT
      ② 列出C:\SRC下,包括SRC的子目录下的所有的*.C文件,,并添加到C:\SRC\FILELIST.TXT的未尾:
      DIR C:\SRC\*.C /S/B >>C:\SRC\FILELIST.TXT
      PC-Lint 重要文件说明
      Msg.txt :解释告警的内容。
      选用的.lnt :包含头文件的路径,-i选项。
      env-选用的编辑环境.lnt :讲述如何将PC-lint与对应的编辑环境结合起来。
      co-xxx.lnt :选定的编译器。
      STD.LNT :内存模型等全局性东西。
      LIB-xxx.LNT :库类型的列表,包括标准C/C++库,MFC库,OWL库等等。
      AU-xxx.LNT :C++编程提出过重要建议的作者,选择某作者后,他提出的编程建议方面的选项将被打开。
      OPTIONS.LNT :反映全局编译信息显示情况的选项文件

  • Vista各版本概述

    2008-10-08 18:05:14

    http://www.microsoft.com/china/windows/products/windowsvista/editions/default.mspx

     

    Windows Vista 版本概述

    不管是用电脑在家里娱乐、学习,还是商业办公,总有一个版本的 Windows Vista 适合您。查看版本比较列表,或详细了解以下各个版本的信息,找到最适合您的 Windows Vista!

    Windows Vista 家庭高级版
    全面娱乐的 Windows Vista 家庭高级版

    Windows Vista 家庭高级版包含丰富的娱乐特性,音乐、照片、电影和游戏,全都尽在掌握,是个人及家用电脑的首选版本。

    Windows Vista 家庭普通版
    简单易用、安全稳定的 Windows Vista 家庭普通版

    Windows Vista 家庭普通版包含Windows Vista的核心功能,更加安全和易用,完全满足一般个人及家用电脑日常所需。

     Windows Vista 旗舰版
    极致体验的 Windows Vista 旗舰版

    Windows Vista 旗舰版是最完整的Windows Vista版本,包含Windows Vista所有的功能,无论是娱乐还是办公,您都将享有最极致的体验。

     Windows Vista 商用版
    中小企业专用的 Windows Vista 商用版

    Windows Vista 商用版拥有企业所需的域管理和组策略功能,集成了更多办公应用和自助管理特性,是中小企业当之无愧的选择。

     Windows Vista 企业版
    大型企业首选的 Windows Vista 企业版

    Windows Vista 企业版仅通过软件保障提供,具有 Windows Vista 商用版的所有功能,并附加满足大型企业及机构部署和维护复杂桌面架构需求的更多功能。

    如何在这些版本中做选择?

    如何在这些版本中做选择?





























    某些产品功能 仅在特定版本的 Windows Vista 中才提供,并且可能需要高级硬件或附加硬件。

  • linux关机命令

    2008-10-08 18:02:32

    linux下一些常用的关机/重启命令有shutdownhaltreboot、及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各种关机命令。

    1.shutdown

    shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linuxwindows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。

    shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevelRunlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。

    shutdown 参数说明:

       [-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。

       [-r] 重启计算器。

       [-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。

       [-h] 关机后关闭电源〔halt〕。

       [-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。

       [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。

       [-f] 在重启计算器〔reboot〕时忽略fsck

    [-F] 在重启计算器〔reboot〕时强迫fsck

       [-time] 设定关机〔shutdown〕前的时间。     

    2.halt----最简单的关机命令

    其实halt就是调用shutdown -hhalt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。

    参数说明:

       [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。

       [-w] 并不是真正的重启或关机﹐只是写wtmp/var/log/wtmp〕纪录。

       [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。

       [-f] 没有调用shutdown而强制关机或重启。

       [-i] 关机〔或重启〕前﹐关掉所有的网络接口。

       [-p] 该选项为缺省选项。就是关机时调用poweroff  

    3.reboot

    4.init

  • linux常用命令

    2008-10-08 16:49:41

    Linux下的mysql数据库常用操作
    1.登入登出
    mysql -uroot -p123456;
    mysql
    mysql
    show databases;
    use HostCache;
    show tables;
    desc HostCache;
    exit;
    2.数据操作
    alter table voucherwinner modify cpuid varchar(36);
    alter table installerreport add skypeid varchar(32);
    update operator set agentid='00000124' where username='00000124';
    select * from HostCache order by TimeStamp;
    select * from voucherwinner where skypeid not like '#%';
    select ExternalIP, InternalIP from HostCache order by TimeStamp;
    delete from HostCache where ISPType = 4;
    delete from HostCache;
    3.数据导入导出
    把数据库skypeuser中的表voucherwinner中的数据导入到voucherwinner文件中。该命令会把创建表的操作以及插入数据记录以脚本的形式存入文件
    mysqldump -h172.24.172.47 -uskypeuser -ptomskype47 skypeuser voucherwinner > voucherwinner
    带where条件的数据表导出
    mysqldump -h61.135.158.241 -uroot -p --w "time >= '2007-05-03 00:00:00' and time
    installerreport > installerreport20070503
    把记录导入到新库中
    mysql -uroot -p skypeuser
    mysql -h61.135.158.241 -uroot -p skypeuser
    4.权限分配
    在数据库服务器端运行下面命令:
    mysql> grant all on *.* to username@IP identified by 'password';
    比如:
    mysql> grant all on *.* to root@192.168.15.96 identified by '123456';
    则可以如此访问:
    mysql -h192.168.15.96 -uroot -p123456;
    修改最大连接数
    mysql默认的最大连接数是100,该值存放在mysql的ini文件中,比如:my.ini,找到对应值修改就可以了
    二: Linux常用普通操作
    1.常见文件操作
    cd ../home/tcast/NATServer; 进入到一个目录
    cd ${ACE_ROOT}
    tail -f 2005-10-28.log 查看正在被其它进程修改的文件
    ps -A 显示当前进程列表
    ps -ef | grep natserver 查询名字包含natserver的进程是否存在
    killall -9 p2pserver kill进程
    kill -9 6499 结束ID为6499的进程
    df 查看磁盘使用比例
    2.设置定时任务
    一个 cron 作业是一个命令,其运行是由 cron 守护程序在规则的调度间隔执行的。
    crontab -e 编辑用户的 crontab 文件的副本,或者,如果一个有效的 UserName 的 crontab 文件不存在则创建一个空的文件进行编辑。当编辑完成后,文件被到 crontab 目录作为用户的 crontab 文件。
    例如:增加一条每天9点16执行一次的任务,则添加如下文字:
    16 9 * * * echo "hello" > /root/hello.txt
    crontab -l 列出用户的 crontab 文件。
    3.显示或修改系统时间
    date
    date -s 'Sat Apr 21 09:55:11 CST 2007'
    4.远程登录
    ssh 61.135.234.140 从一台Linux系统登录到另一台Linux系统
    exit 从那台Linux系统中退出
    三: 环境变量相关
    locale 查看本地化设置(locale的东东在/usr/lib/locale下)
    export LANG=zh_CN 设置本地化的变量export LANG= 设置这个变量为空uname -a 查看操作系统,CPU的信息top 查看进程使用CPU,内存的情况env 查看环境变量/etc/profile 环境变量的文件,可以设置export path添加环境变量路径
    export CPPFLAGS="-I/data/TOMSKYPEIVR/asterisk/include"
    export LD_LIBRARY_PATH=/data/TOMSKYPEIVR/cpprad/lib
    echo $CPPFLAGS
    ${ACE_ROOT}
    su -root
    四: C/C++编译和调试
    1.常用操作
    vi makefile 编辑makefile文件
    make 编译当前目录下的源码
    ./kill.sh 运行结束程序的脚本
    ctrl + c 结束控制台下正在运行的程序
    chmod a+x tcastchanroot 修改文件属性使其可以运行
    ./runnewtcast.sh & 后台运行脚本
    nohup ./tcastchanroot >runlog 不挂起执行程序, 输出定向到文件runlog
    2.gdb调试相关
    gdb ./reportserver 开始调试reportserver程序
    b main 在main()处设置断点
    b CReportServer::svc 在CReportServer:svc()处设置断点
    b 100 在当前文件的第100行放置断点
    d 删除所有断点
    start 开始以调试状态运行程序
    t 显示当前线程情况
    p argc 显示变量情况
    s 进入函数内执行
    n 跳到下一行执行
    c 跳到下一个断点执行
    quit 退出调试
    ulimit -c unlimited 设置运行时产生调试信息
    gdb tcastchanroot core.6200 调入调试信息查看
    where 模块结构
    五: 文本操作命令
    1.常见操作
    tail -f 2005-10-31.log :查看日志
    cat /proc/cpuinfo 只读的形式打开文本文件
    grep MyKeyword statistics.2006102700.log
    grep MyKeyword statistics.2006102800.log | wc
    grep MyKeyword statistics.2006102800.log | awk '{print$1}' | sort -u | wc
    在日志statistics.2006102800.log的每行中出现过MyKeyword的行中,打印他们的第1列内容不重复的行数
    cat testsetuplog2006-10-28 | awk '{print$3}' | sort -u | wc
    cat testsetuplog2006-10-30 | awk '{print $6}' | grep 0 | wc
    cat testsetuplog2006-11-15 | awk '($5$6==62) {print $4}' | sort -u | wc
    在日志testsetuplog2006-11-15的每行中,第5列等于6,第5列等于2的行中,打印他们的第4列内容不重复的行数
    cat ExportMac2005.txt > mac.txt 把ExportMac2005.txt的内容拷贝到另外一个文件mac.txt
    cat ExportMac2006-01-01.txt >> mac.txt 把ExportMac2006-01-01.txt的内容追加到文件mac.txt
    wc mac.txt 对mac.txt中的内容条数进行统计
    cat mac.txt | sort -u | wc 对mac.txt中的不重复内容条数进行统计
    cat mac.txt | sort -u > macunique.txt 把mac.txt中的不重复内容条数拷贝到macunique.txt
    grep 'Radius' * 在当前文件夹下的所有文件中搜索出现Radius的地方
    find -name Main.cpp 搜索文件名为Main.cpp的文件所在路径
    2. vi命令
    i从命令模式到插入模式
    ESC从插入模式到命令模式
    命令模式滚屏:ctrl+f
    yy复制当前行
    p粘贴
    dd删除当前行
    /xx 在文档中查找xx字符串, n查找下一个
    :wq
    将文本中的installerreport替换成为installerreport20070503
    :g/installerreport/s/installerreport/installerreport20070503/g
    六:文件系统操作
    touch xxx 创建新文件
    mkdir xxx 创建新目录
    mv jspwiki-2.2.33-bin.zip ../../usr/tomcat55/webapps/
    mv(move)可以将文件移动到另一个地方,或者更改文件名称(Lniux中并没有ren或rename命令来更改文件名)。
    cp JSPWiki.war ../JSPWiki.war
    rm -rf WEB-INF 强制删除有内容的文件夹
    rm xa* 删除所有xa开头的文件
    split -l 10000 ExportMac.txt 把ExportMac.txt分割成多个文件,每个文件10000行
    cp -a ./star_zh_CN ../../../tomwiki/templates/start_zh_CN 拷贝整个目录
    cp -a ./star_zh_CN ../../../tomwiki/templates/start_zh_CN 拷贝,使用绝对路径
    ln
    这是linux中一个非常重要命令,请大家一定要熟悉。它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是
    -s,具体用法是:ln -s 源文件 目标文件。
    当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。例如:ln -s /bin/less /usr/local/bin/less
    -s 是代号(symbolic)的意思。
    这里有两点要注意:第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ****,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。如果你用ls察看一个目录时,发现有的文件后面有一个@的符号,那就是一个用ln命令生成的文件,用ls -l命令去察看,就可以看到显示的link的路径了。
    从网络上获取并下载一个文件到当前目录下
    wget http://www.blogdove.com/nnt.tar.gz
    文件传输命令,将当前目录的.so文件传到机器211.99.190.120的/data/TOMSKYPEIVR/asterisk/lib/asterisk/modules/下
    scp *.so web@211.99.190.120:/data/TOMSKYPEIVR/asterisk/lib/asterisk/modules/
    七: 压缩解压命令
    unzip JSPWiki.zip
    unzip -d ../JSPWiki JSPWiki.zip 解压zip包
    unrar x udt2.rar 解压rar包
    gunzip backup.tar.gz &
    tar xvf backup.tar
    tar zxvf KingSoftUnion.tar.gz 解压后缀为tar.gz的文件。
    tar jxvf upx-3.00-i386_linux.tar.bz2 解压后缀为tar.bz2的文件。
    打包一个文件夹成压缩文件
    tar zcvf KingSoftUnion.tar.gz KingSoftUnion/
    八:PHP命令
    php ExportMac.php 执行一个php脚本
    九: 后台执行命令
    启动一个程序时让它立即进入后台运行方式看过前面一篇bash的介绍应该明白Ctrl+z/bg/fg的用法。有些程序工作起来挺费时间,在它后面加个&符号看看,例如“updatedb &”,“netscape &”等等。这样这个shell会释放出来干别的活。请注意这样出来的程序父进程仍然是这个shell,若你退出这个shell,这些程序也会被kill掉。建议退出shell之前用jobs命令查看后台作业。
    使用nohup(不挂起)命令
      如果想进程在你退出系统后还能执行,可以使用nohup命令如:
      % nohup tar -cf /dev/tape /home &
      如logout退出后再重新登录的话,使用“ps”命令可以看到进程还在执行。注意,要想把命令真正放到后台运行,nohup必须与&操作同时使用。有些软件自己能处理SIGHUP信号,如wget,对它们则无须用nohup。你还可以用nohup来实现ppp回拨:先拨号上去,然后以nohup执行一个自制的脚本,如“sleep 60; ppp-start-scrīpt”等等。最后logout退出并挂断电话等着就是。
    十: 软件包通用安装方法
    1.百度或者Google得到安装包的下载路径,比如在google中搜lrzsz,得到
    http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
    在linux下wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz
    2.解压软件包
    tar zxvf lrzsz-0.12.20.tar.gz
    3. 安装三部曲
    ./configure --prefix=/data/TOMSKYPEIVR/bin
    make
    make install
    先说一个比较好使的扫描工具,据说黑客帝国中有人使用过它 Nmap,我后来觉得 某些时候这个东西比netstat ,要方便。
  • 死链检查工具

    2008-08-30 18:02:34

    页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。可以使用一些工具,如LinkBotPro、File-AIDCS、HTML Link Validater、Xenu等工具。LinkBotPro不支持中文,中文字符显示为乱码;HTML Link Validater只能测试以Html或者htm结尾的网页链接;Xenu无需安装,支持asp、do、jsp等结尾的网页,xenu测试链接包括内部链接和外部链接,在使用的时候应该注意,同时能够生成html格式的测试报告。如果系统用QTP进行自动化测试,也可以使用QTP的页面检查点检查链接。
  • (转)QTP中连接MySQL的方法

    2008-07-15 20:15:46

    QTP中连接MySQL的方法(数据库验证点和ADO连接)

    2008-06-29 18:28:00 / 个人分类:原创文章

    很多朋友对于QTP中连接MYSQL束手无策,其实根本原因是默认的我们的操作系统中ODBC驱动里默认不支持开源的MySQL驱动。51Testing软件测试网sL)[ZK'p r} B
    要解决这个问题的方法非常简单,安装一个相关的驱动就能解决问题了。
    7pQf_-q0b Y]/N46301 这里给出这个驱动程序的下载地址: MyODBC-3.51.11-2-win.exe
    lL[a0o46301 安装完毕后,到“控制面板--管理工具--数据源ODBC--系统DSN”把它添加进来,步骤见下面截图qtpmysqsl1.JPG到qtpmysqsl5.JPG(我在本机上安装了一个Discuz论坛)。51Testing软件测试网(mM5{ a&\,x6b^
    添加完毕后,就可以开始使用了。
    4W#C%P-_o4ZO46301 以下给出具体的实现过程
    uVtWk5[-B#EYg46301 (一)数据库验证点:51Testing软件测试网L })I(O$b tW'k(x
    见下面截图 qtpmysqsl6.JPG 到 qtpmysqsl9.JPG
    P%^{d$r+V46301 (二)ADO连接MySQL数据库的代码:
    +D8[(Xrw_d7n,r46301 例子(获取论坛中的帖子主题和内容):

    CODE:

    Dim Cnn, Rst, strCnn51Testing软件测试网m+n ?!sP0^Tb
    51Testing软件测试网!B!Qt6gt@T G
    strCnn = "DRIVER={MySQL ODBC 3.51 Driver};SERVER=localhost;DATABASE=discuz;USER=root;Option=3"
    $X v2Ko}(AE ^46301 Set Cnn = CreateObject("ADODB.connection")51Testing软件测试网 \.}~4Wa {
    Cnn.Open strCnn51Testing软件测试网C/OR dA(^%b\Wr
    Set Rst = CreateObject("ADODB.Recordset")
    |nz(G7h46301 Rst.Open "select * from cdb_posts", Cnn51Testing软件测试网;X7x/Re2~H
    Rst.MoveFirst
    8k)s'uYqtJ46301 While Rst.EOF <> True
    r(Un3T:Ys"O46301     MsgBox Rst.Fields("subject") & Chr(13) & Chr(10) & Rst.Fields("message") & Chr(13) & Chr(10)
    0Ip,w8q.\)e46301     Rst.MoveNext51Testing软件测试网8]B%P8z'l V
    Wend51Testing软件测试网1GY1N V3V v|
    Rst.Close51Testing软件测试网(x.wMjr(}
    Cnn.Close
    -T.N/j,m"Fq!^46301 51Testing软件测试网 ? H%\ @;Mf
    Set Rst = Nothing
    z5t/i-g&hg&WX46301 Set Cnn = Nothing
    51Testing软件测试网9s[:X&I H3nv;s N~
    51Testing软件测试网Ft-KHDF
    qtpmysqsl1.JPG51Testing软件测试网P4Q@q-w3~

    /y`E"\h2n6C(O46301qtpmysqsl2.JPG
    b*|;|Tob4630151Testing软件测试网"xj}_5S-z|`
    qtpmysqsl3.JPG
    %e"c6@{y&ERD?Y46301
    A:bJ$C3[:@~OK46301qtpmysqsl4.JPG51Testing软件测试网!^ Hbe#o)L F
    51Testing软件测试网8E o-\B\ fO.b K
    qtpmysqsl5.JPG51Testing软件测试网 ym_1k L2m Jgl

    wt} d*I@~%Y2H[46301qtpmysqsl6.JPG
    9dbe!Y}t5Z9^9c4630151Testing软件测试网7dSl#YB9X%s
    qtpmysqsl7.JPG51Testing软件测试网1a:y*Q9~9q*{
    51Testing软件测试网0f h7^5B6\x U3ubJ7d
    qtpmysqsl8.JPG51Testing软件测试网-o _4cw I)|)t8X
  • 转载:微软测试有感

    2008-07-15 20:13:23

    最近和微软一哥们聊微软的测试,很有感触,记下来,和大家共同分享。

    全文如下:

    开头语:

    作测试很久了,一直为一些问题所困扰,也一直对微软有一种顶礼膜拜的向往,终于有一天,近距离的接触了微软的测试,感觉不是以前想象中那么遥不可及,却又难以企及。于是把个人觉得微软值得借鉴的地方整理了一下,希望能对大家有所帮助。

     

    1.  测试流程

    首先说说测试流程,微软的测试流程也没什么新的东西,和大多数的测试流程一样。

    大致是先进行测试准备,然后是Testcase的编写,然后是白盒测试(不一定每个项目都有),然后是功能测试阶段,然后是验收测试,最终release

    如果看流程的话,和一般公司大同小异,没什么新花样。但是我觉得值得借鉴的是两点。

    第一,   微软的流程执行的非常认真。

    这点非常值得提倡,我们都知道,测试的最终质量决定于测试流程和测试人员素质,要想测试质量有保证,要么是流程很完善,要么你流程不行,但是个人能力超强。如果有一个很好的流程,就算执行的人稍微差点,最终的质量也不会差到哪里去。所以流程是很重要的。

    但是,看国内的公司欠缺的就是这个,要么是没有流程,要么流程是个花架子,没认真执行过。我想微软的测试人都是超级牛人,但是人家还是老老实实的忠实按照流程来走,我觉得这点非常好。(在IBM 也是这样,笔者以前在IBM作项目的时候,发现他们的文档写的特认真,流程特认真),所以说忠实的执行一个好的流程是成功的一大半。

    第二,   在整个流程中,微软非常强调测试尽早介入。微软在这方面是一致提倡的,按照我们国内IT业的恶习,一般都是软件主体差不多成型了,拉几个测试人员过来点点,其实这是非常不好的。微软的测试人员在项目一开始就和开发人员同步介入,在需求阶段就开始介入,进行需求评审。在开发人员开始编码的时候,测试人员就开始编写Test case,并开发一些测试工具,或者写一些配套的测试代码(不要奇怪,微软的测试人员都能写很好的代码)。微软的理念就是:预防bug比解决bug好,所以非常提倡测试尽早介入,把一部分bug消灭在需求阶段。

    2.  自动化流程

    说到自动化,大家可能以为我是说微软的自动化测试工具多牛,其实微软内部用到的自动化测试工具倒是不多,就算有也都是内部开发的,非常实用的,他们不会去用MI的工具。

            说微软的自动化程度高,主要是体现在流程方面,譬如说整个自动

        构建流程,在开发人       员代码check in之后,系统自动发邮件,邮

        件内容就是一个change list,包括代码更新list以及一个编译者添加的comment,其内容是该版本功能的变化或者修改掉的bug ID。整个测试过程中能用自动化的地方都尽可能采用自动化,尽可能减少人为失误,并且可

        以使人和机器并行工作。个人觉得,这点很值得我们国内的测试公司借鉴,能自动化的流程都自动化,减少一些不必要的沟通。

     

    3.  质量控制机制

    说到质量控制是个大问题,需要整个团队和流程提高素质。那么微软的质量控制可以借鉴的是什么呢?是他们的机制。在微软的测试流程当中,在开发的早期,项目中所有的问题都是Dev leaderPM商量说了算(当然也要参考需求方的意见),但是到后期,具体就是功能测试之后,项目的主动权都在测试这边,某个bug的要不要解决,或者项目进度控制都是测试leader说了算。这和国内的大多数软件公司是不一样的,在微软,测试人员要对最终的软件质量负责任,但是也有相应的权利来约束开发人员。当然,他们也肯定有一些bug是产生争议的,这个时候的仲裁机制就是PM,这个不是我们传统的PMProject manager),而是一种具有微软特色的PM(全称是Program manager)。这样,测试人员在对一些争议bug的处理上有相当的话语权。

     

    4.  测试用例及管理

    微软的测试用例倒没什么特别的,不过看过他们用例之后,还是觉得写的详细,认真,但是又不冗长拖沓,这个需要很高深的水平。另外,微软的测试用例管理用的是微软自己开发的用例管理工具。

    另外值得说明的是,微软的每个用例都进行了分级,并且功能所在的模块都标的很清楚。

     

    5.  效率

    在效率方面,微软的测试效率非常高!高的让人惊叹,我问一个在微软工作的哥们,“你们那边测试的最大特点是什么”,他说“最大特点是快!”,就是效率很高,具体就是在测试后期过程中测试和开发之间的反馈非常快,开发修改一定量的bug,提交一个新的版本。测试人员往往能在很快的时间内把测试结果反馈出来,一般是在1天之内就能把用例快速run一遍,这样就能减少某些后期才发现bug导致的项目delay。在国内很多项目的通病是,开发解决问题带进一个新问题,测试人员整个遍历一遍用例之后才能发现,这样来回反复就消耗了大量的时间。

    但微软是如何才能实现快速反馈呢?

    第一,   测试人员对程序的了解,微软的测试人员对程序内部结构都非常熟悉,修改某一个地方,可能引起什么问题,哪些用例需要重新测试,测试人员非常清楚,能快速的执行最可能出错的地方。如果某些模块不熟悉,那么他们会和开发人员在一起沟通这次修改可能引起的问题。

    第二,   工具!还是工具,在微软的测试中,测试人员用各种工具帮助测试,提高测试效率是占到很大的比重。

    第三,   时间意识。微软的测试人员有强烈的时间意识。

     

    6.  测试工具

    测试工具能很大程度上提高测试效率,这个作为测试人员都很清楚。当然测试工具在微软的测试中也应用非常广泛,但是请注意,微软并不是像我们国内的公司一样使用的都是LRQTP这类的录制回放工具,反而这种工具倒是用的不多,就跟微软不屑CMM一样,可能是不想屈尊自己IT老大的身份吧。

    但是微软的测试工具最大的特点是实用。他们用的测试工具都是确实能提高效率,确实能办事情的工具,都不是类似WRQTP的很大很系统的工具,而是比较小的,很灵活,实用的小工具(譬如:FiddlerDriphttpwatchIE DevToolBarPaintNotNetprocexp etc.)。甚至有一些测试工具是测试人员在开发人员协助下根据项目需要临时开发的,不过大多数工具都是微软内部已经共享出来的,在微软内部各种各样的小工具特别多。

    总体给我的感觉是,不是为了用测试工具而用,而是根据实际的需要,确实能提高效率而用到,在用的过程中确实也很大的提高了效率。

     

    7.  测试人员的专业素质

    微软测试给我印象最深刻的还有他们测试人员的专业水准,在测试过程中,测试人员在一些技术上并不逊色于开发人员,在一些bug的处理上,能提出很多合理的很有建设性的建议。

     

    8.  微软的白盒测试

    微软的白盒测试怎么执行呢?让我略微有点吃惊的是,微软的一半测试人员基本不做白盒测试,除非有些不能做黑盒的模块,另外也不是所有的产品都作白盒测试。

    微软的白盒测试一般还是由专门的白盒测试人员来做,但是开发人员要对测试人员的白盒测试代码进行Review,另外微软对开发人员的代码,效率也都有一套详细的考核机制,所以开发人员对自己的代码也是非常负责任的,都进行很认真的进行测试。

     

    9.  意识(时间,质量)

    另外微软的测试还有很好的一点就是意识,时间和质量的意识都是非常强。在控制时间成本上,意识非常强,这点非常值得我们国内同仁学习,另外,风险管理的机制和意识都是非常好。在微软,项目组的每个成员都被明确告知,如果这个项目每delay一天,就会损失多少个million的美元,所以整个项目组都有比较好的时间意识。

    另外,在微软,项目组人员的质量意识都是比较强的。怎么样更好服务用户,让用户体验更好,怎么样更好的改进,这种意识比较强。

     

    10. 微软的培训

    在微软内部,员工外训的机会比较少,大多都是内部互训,各人培训自己的强项,有比较好的互相分享的习惯。另外微软的内部有非常丰富的各种培训文档。以后我会上传上去和大家分享。

     

    11 测试数据记录

    微软的测试数据记录是非常全的,也都是系统自动的,每天都是由系统自动统计当天的bug情况,然后发送一个report到每个项目组成员的邮箱里。最后到测试总结的时候,这些测试数据将变得非常有用。

    编后感:在深入了解微软的测试之前,对微软这个IT业界巨无霸的测试感觉是顶礼膜拜,高不可攀,总觉得可能很神秘,用很牛的技术或者很高深的手段。深入了解之后,发现微软的测试也是和我们做一样的事情,只不过人家做的更认真,更细,更实用,更有效率。再回过头来看时,微软的测试给我留下印象最多的是,流程,效率,意识,工具,素质!也就是这几项,成为我们国内IT企业亟需跨越的。

  • (转)SQL操作全集

    2008-06-10 21:30:55

    SQL操作全集

    2008-05-18 11:50:05 / 个人分类:数据库

    下列语句部分是Mssql语句,不可以在access中使用。

    SQL分类:  
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)  
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)  
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:
    1、说明:创建数据库
    CREATE DATABASE database-name  
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack  
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:  
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表drop table tabname  
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)  
    说明:删除主键: Alter table tabname drop primary key(col)  
    8、说明:创建索引:create [unique] index idxname on tabname(col….)  
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement  
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符  
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。  
    B: EXCEPT 运算符  
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。  
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。  
    注:使用运算词的几个查询结果行必须是一致的。  
    12、说明:使用外连接  
    A、left outer join:  
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。  
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outer join:  
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。  
    C:full outer join:  
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1 <>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息  
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒  
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'  

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:  
    Randomize  
    RNumber = Int(Rnd*499) +1  
     
    While Not objRec.EOF  
    If objRec("ID") = RNumber THEN  
    ... 这里是执行脚本 ...  
    end if  
    objRec.MoveNext  
    Wend  
     
      这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?  
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:  
    Randomize  
    RNumber = Int(Rnd*499) + 1  
     
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber  
     
    set ōbjRec = ObjConn.Execute(SQL)  
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")  
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。  
    再谈随机数  
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。  
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:  
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3  
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):  
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"  

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    随机读取若干条记录,测试
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 Order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;  
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
  • VB For Each 语句的用法

    2008-04-09 16:47:33

    针对一个数组或集合中的每个元素,重复执行一组语句。

    语法

    For Each element In group
    [statements]
    [Exit For]
    [statements]

    Next [element]

    For...Each...Next 语句的语法具有以下几个部分:

    (1)element 必要参数。用来遍历集合或数组中所有元素的变量。对于集合来说,element 可能是一个 Variant 变量、一个通用对象变量或任何特殊对象变量。对于数组而言,element只能是一个 Variant 变量。
    (2)group 必要参数。对象集合或数组的名称(用户定义类型的数组除外)。
    (3)statements 可选参数,针对 group 中的每一项执行的一条或多条语句。


    说明

    如果集合中至少有一个元素,就会进入 For...Each 块执行。一旦进入循环,便先针对 group 中第一个元素执行循环中的所有语句。如果 group 中还有其它的元素,则会针对它们执行循环中的语句,当 group 中的所有元素都执行完了,便会退出循环,然后从 Next 语句之后的语句继续执行。

    在循环中可以在任何位置放置任意个 Exit For 语句,随时退出循环。Exit For经常在条件判断之后使用,例如If Then,并将控制权转移到紧接在 Next 之后的语句。

    可以将一个 For...Each...Next 循环放在另一个之中来组成嵌套式 For...Each...Next 循环。但是每个循环的 element 必须是唯一的。

    注意 如果省略 Next 语句中的 element,就像 element 存在时一样执行。如果 Next 语句在它相对应的 For 语句之前出现,则会产生错误。

    不能在 For...Each...Next 语句中使用用户自定义类型数组,因为 Variant 不能包含用户自定义类型。
  • 编写正则表达式

    2008-04-09 15:37:03

    <%
    Function RegExpTest(patrn, strng)
    Dim regEx, Match, Matches '建立变量。
    Set regEx = New RegExp '建立正则表达式。
    regEx.Pattern = patrn '设置模式。
    regEx.IgnoreCase = True '设置是否区分字符大小写。
    regEx.Global = True '设置全局可用性。
    Set Matches = regEx.Execute(strng) '执行搜索。
    For Each Match in Matches '遍历匹配集合。
    RetStr = RetStr & "Match found at position "
    RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
    RetStr = RetStr & Match.Value & "'." & "<BR>"
    Next
    RegExpTest = RetStr
    End Function
    response.write RegExpTest("[ij]s.", "IS1 Js2 IS3 is4")
    %>
    在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下:
    Match found at position 0. Match Value is 'IS1'.
    Match found at position 4. Match Value is 'Js2'.
    Match found at position 8. Match Value is 'IS3'.
    Match found at position 12. Match Value is 'is4'.
    下面我们就介绍这三个对象和集合。
    1、RegExp对象是最重要的一个对象,它有几个属性,其中:
    ○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。
    ○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 False。
    ○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。

    2、Match 对象
    匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。
    ○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0
    ○Length 属性,返回在字符串搜索中找到的匹配的长度。
    ○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。

    3、Matches 集合
    正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。
    学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是Replace方法、Test方法和Execute方法。
    1、Replace 方法
    替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。
    <%
    Function ReplaceTest(patrn, replStr)
    Dim regEx, str1 ' 建立变量。
    str1 = "The quick brown fox jumped over the lazy dog."
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
    End Function
    Response.write ReplaceTest("fox", "cat") & "<BR>" ' 将 'fox' 替换为 'cat'。
    Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ' 交换词对.
    %>
    2、Test 方法
    对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。
    如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。
    <%
    Function RegExpTest(patrn, strng)
    Dim regEx, retVal ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = False ' 设置是否区分大小写。
    retVal = regEx.Test(strng) ' 执行搜索测试。
    If retVal Then
    RegExpTest = "找到一个或多个匹配。"
    Else
    RegExpTest = "未找到匹配。"
    End If
    End Function
    Response.write RegExpTest("is.", "IS1 is2 IS3 is4")
    %>
    3、Execute 方法
    对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。
    Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。
  • 转)qtp中的数据库、文件操作

    2008-04-08 22:48:26

    qtp中的数据库、文件操作

    注:本文转载于http://www.51testing.com/?57326作者

    2008-04-07 21:06:15

    1.datatable

            QTP本身程序就给我们提供了这么一个数据表,我们可以把测试数据或测试用例填入这个数据表中.

    如:设计用例

       username  passwd

    case1  mercury mercury

    case2 xxxxxxx xxxxxx

    录制脚本

    For i=1 to Datatable.GetRowCount
    Dialog("Login").WinEdit("Agent Name:").Set DataTable("username", dtGlobalSheet)
    Dialog("Login").WinEdit("Password:").Set DataTable("passwd", dtGlobalSheet)
    Dialog("Login").WinButton("OK").Click
    datatable.GlobalSheet.SetNextRow
    Next

            本例是验证一个登录系统,通过DataTable不同的用例设计,驱动起这段脚本,达到测试的效果.当然上面的例子中还少一个很重要的步骤,那就是结果比较.如果不能进行结果比较的自动化测试不能够称为自动化测试.
            当然我们这里主要讲的是数据驱动,所以不在对上面的例子进行补充.

    2.文本文件

            我们可以把文本文件当成数据文件,通过对文本文件的读写操作,来实现数据驱动.

    例:文本文件内的内容

      mercury,mercuy

    读文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile,username,passwd
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\testing.txt",1,false)
    tmp=split(myfile.readline,",")
    username=tmp(0)
    passwd=tmp(1)
    myfile.close
    End Function

    写文本文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\result1.txt",8,false)
    myfile.writeline orderno
    myfile.close
    End Function

    3EXCEL文件

            我们可以把EXCEL文件当成数据文件,通过对EXCEL文件的读写操作,来实现数据驱动.

            可以把EXCEL文件当作对象的方式来完成写的操作

    Dim Excel,ExcelSheet
    Set Excel=CreateObject("Excel.Application")
    Set ExcelSheet=CreateObject("Excel.Sheet")
    ExcelSheet.Application.visible=true
    ExcelSheet.ActiveSheet.Cells(1,1).value=1
    ExcelSheet.ActiveSheet.Cells(1,2).value=2
    ExcelSheet.ActiveSheet.Cells(1,3).value=3
    Excel.Save "C:\test.xls"
    Set ExcelSheet=Nothing

            用ADO的方式连接EXCEL文件来做读的操作


    Dim conn,input,filename
    filename="D:\公基本情况(tb_gsgk)-标准格式.xls" '
    Set conn= createobject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source="&filename&";Extended Properties='Excel 8.0;hdr=yes'"
    Set input= createobject("ADODB.Recordset")
    input.Open "select * from [公基本情况-标准格式$] " ,conn,2,2
    input.close
    Set input=nothing

    4.数据库

            可以利用设计数据表,把测试数据和测试用例放在数据表里,用ADO或者其他任何可以访问连接数据库的方式连接数据库,来实现数据驱动

       Dim res,cmd,sql
    Set Res=createobject("adodb.recordset")
    Set Cmd=createobject("adodb.command")
    Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
    Cmd.CommandType = 1
    sql="selec t * from 表 where name=username"
    Cmd.CommandText = sql
    Set res = Cmd.Execute()
    Set res = nothing
    Set cmd.ActiveConnection = nothing
    Set Cmd= nothing

    以上四种方法都可以帮助我们实现数据驱动,应该说数据驱动在自动化测试中运用的比较的广泛,才有必要拿出来探讨一下.

  • 什么是RegExp?(转)

    2008-04-03 18:25:06

    什么是RegExp?
    2007-09-06 16:52
    今天写程序的时候出现了一个问题,总是出现不允许操作的对象的错误,很奇怪之前一直运行没有问题的程序,怎么会有不允许操作的对象呢?只能一步一步的查到底是那个对象不允许操作了,终于找到了这个对象,Set regEx = New RegExp,把所有的文件搜索了一遍,也没有发现 RegExp,怪不得会出现不允许操作的对象了。
    上网搜索RegExp,原来这是一个VBscrīpt5.0的正则表达式对象。只要你的服务器安装了IE5.x,就会VBscrīpt5.0。VB中的replace和execute函数可以执行,那么这个为什么不能执行呢?猜想可能是改对象需要注册组件,开始-运行:regsvr32 vbscrīpt.dll 就OK了。
    问题解决了,那么RegExp该如何使用呢?在网上找到了相关的说明。
    我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因 为用户有可能输入各式各样的信息,而有些不符合要求的数据会给我们的后端ASP处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题。因此我们在将这 些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据的合法性校验,以便后面的程序可以安全顺利的执行。所以我们一般会在后端编写一个ASP 的校验程序来分析用户输入的数据是否是合法的。


    或许有人会问了,使用运行在客户端的Javascrīpt不是可以更好更快的 来校验用户的数据吗?的确,这样在大多的情况下是可以的,为什么是大多情况下呢?因为你编写的Javascrīpt不一定可以完全正常的同时运行在IE以 及Netscape上面,因为微软的Jscrīpt并不全和Javascrīpt相同,再加上还有一些浏览器不一定和微软以及Netscape兼容的很 好,所以很有可能在客户端的Javascrīpt不会精确的校验用户输入的各种数据,而ASP程序是运行在服务器端的,只是和你的服务器的环境有关,无论 客户端是什么浏览器,对于你的ASP程序来说都是没有分别的,所以选择使用后端的ASP程序来进行数据合法性的校验是一个好的选择。


    在使用ASP来进行后端的数据合法性校验的时候,有些人为满足不同环境下面的数据校验,编写了很多的函数来实现,比如,我们想要校验用户输入的URL 地址是否合法,是可以自己编写一段代码来逐个逐个字符的分析用户输入的信息,要分析的信息量小了,那还比较好办,若是分析的条件千变万化,那可就惨了,不 但要编写很长很繁琐的代码,而且运行的效率极其低下,有没有好的解决办法呢?有,那就是VBScritp5.0提供的“正则表达式”对象,只要你的服务器 安装了IE5.x,就会带VBscrīpt5.0。其实,“正则表达式”原本是Unix下面的专利,尤其是在Perl语言中使用的最为广泛,正是由于“正 则表达式”的强大功能,才使得微软慢慢将正则表达式对象移植到了视窗系统上面,利用


    “正则表达式”对象,我们就可以非常方便的对各种数据进行合法性的校验了。


    首先,让我们来了解一下究竟什么是VBscrīpt的“正则表达式”对象,我们先来看一段程序:


    Function CheckExp(patrn, strng)

    Dim regEx, Match   ’ 建立变量。

    Set regEx = New RegExp ’ 建立正则表达式。

    regEx.Pattern = patrn ’ 设置模式。

    regEx.IgnoreCase = true ’ 设置是否区分字符大小写。

    regEx.Global = True ’ 设置全局可用性。

    Matches = regEx.test(strng)     ’ 执行搜索。

    CheckExp = matches

    End Function


    在这段程序程序中,我们看到可以使用“New RegExp”来得到一个正则表达式对象,然后对这个对象进行正则匹配模板的赋值,也就是告诉正则表达式对象,你想要匹配一个什么样子的模板,然后使用方 法Test来检测待处理的数据究竟和我们给出的模版是否相匹配,如果不匹配,那就表明待处理的数据不是合法的数据,从而也就实现了数据合法性的校验,我们 可以看出,使用一个设计合理的匹配模板,我们可以轻松的校验一批格式类似的数据信息。


    当然,VBscrīpt5.0中的“正 则表达式”对象还有很多的其他的方法和属性,比如方法Replace(),利用他我们就可以很快的实现现在网上很时髦的UBB风格的论坛以及BBS,这不 在我们讨论范围之内,以后再加以论述,我们现在就看看在数据校验方面正则表达式对象常用的方法和属性:


    常用方法: Execute 方法


    描述:对指定的字符串执行正则表达式搜索。


    语法:object.Execute(string)  Execute 方法的语法包括以下几个部分:


    object:必需的。总是一个 RegExp 对象的名称。


    string:必需的。要在其上执行正则表达式的文本字符串。


    说明:正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。Execute 方法返回一个


    Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。


    Test方法


    描述:对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。


    语法:object.Test(string)


    Test 方法的语法包括以下几个部分:


    object:必需的。总是一个 RegExp 对象的名称。


    string:必需的。要执行正则表达式搜索的文本字符串。



    说明:正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。



    常用属性: Global属性


    描述:设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。


    语法:object.Global [= True | False ]


    object 参数总是 RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 True。


    IgnoreCase属性


    描述:设置或返回一个Boolean值,指明模式搜索是否区分大小写。


    语法:object.IgnoreCase [= True | False ]


    object 参数总是一个 RegExp 对象。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 True。


    Pattern属性


    描述:设置或返回被搜索的正则表达式模式。 这是一个最重要的属性,我们主要是设置这个属性来实现数据校验的。


    语法:object.Pattern [= "searchstring"]


    Pattern 属性的语法包含以下几个部分:


    object:必需的。总是一个 RegExp 对象变量。


    searchstring:可选的。被搜索的正则字符串表达式。它可能包含设置部分表格中的各种正则表达式字符。


    设置:在书写正则表达式的模式时使用了特殊的字符和序列。下表描述了可以使用的字符和序列,并给出了实例。




    字符描述: \:将下一个字符标记为特殊字符或字面值。例如"n"与字符"n"匹配。"\n"与换行符匹配。序列"\\"与"\"匹配,"\("与"("匹配。


    ^ :匹配输入的开始位置。


    $ :匹配输入的结尾。


    * :匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。


    + :匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。


    ? :匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。


    .:匹配换行符以外的任何字符。


    (pattern) 与模式匹配并记住匹配。匹配的子字符串可以从作为结果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括号字符(和 ),可使用"\(" 或 "\)"。


    x|y:匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。


    :n 为非负的整数。匹配恰好n次。例如,"o" 不能与 "Bob 中的 "o" 匹配,但是可以与"foooood"中的前两个o匹配。


    :n 为非负的整数。匹配至少n次。例如,"o"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o"等价于"o+"。"o"等价于"o*"。


    :m 和 n 为非负的整数。匹配至少 n 次,至多 m 次。例如,"o" 匹配 "fooooood"中前三个o。"o"等价于"o?"。


    [xyz] :一个字符集。与括号中字符的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。


    [^xyz] :一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]" 可以匹配"plain"中的"p".


    [a-z] :表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。


    [^m-z] :否定的字符区间。与不在指定区间内的字符匹配。例如,"[m-z]"与不在"m"到"z"之间的任何字符匹配。


    \b :与单词的边界匹配,即单词与空格之间的位置。例如,"er\b" 与"never"中的"er"匹配,但是不匹配"verb"中的"er"。


    \B :与非单词边界匹配。"ea*r\B"与"never early"中的"ear"匹配。


    \d :与一个数字字符匹配。等价于[0-9]。


    \D :与非数字的字符匹配。等价于[^0-9]。


    \f :与分页符匹配。


    \n :与换行符字符匹配。


    \r :与回车字符匹配。


    \s :与任何白字符匹配,包括空格、制表符、分页符等。等价于"[ \f\n\r\t\v]"。


    \S :与任何非空白的字符匹配。等价于"[^ \f\n\r\t\v]"。


    \t :与制表符匹配。


    \v :与垂直制表符匹配。


    \w :与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。


    \W :与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。


    \num :匹配 num个,其中 num 为一个正整数。引用回到记住的匹配。例如,"(.)\1"匹配两个连续的相同的字符。


    \n:匹配 n,其中n 是一个八进制换码值。八进制换码值必须是 1, 2 或 3 个数字长。


    例如,"\11" 和 "\011" 都与一个制表符匹配。"\0011"等价于"\001" 与 "1"。八进制换码值不得超过 256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。


    \xn:匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如,"\x41"匹配"A"。"\x041"等价于"\x04" 和 "1"。允许在正则表达式中使用 ASCII 码。


    好了,常用的方法和属性就是这些了,上面的语法介绍的已经很详细了,我们就没有必要在罗嗦了,接下来我们来看看在具体的例子里面如何使用这些方法和属性来 校验数据的合法性,我们还是举个例子吧,比如,我们想要对用户输入的电子邮件进行校验,那么,什么样的数据才算是一个合法的电子邮件呢?我可以这样输入: uestc95@263.net,当然我也会这样输入:xxx@yyy.com.cn,但是这样的输入就是非法的:xxx@@com.cn或者 @xxx.com.cn,等等,所以我们得出一个合法的电子邮件地址至少应当满足以下几个条件:


    1. 必须包含一个并且只有一个符号“@”

    2. 必须包含至少一个至多三个符号“.”

    3. 第一个字符不得是“@”或者“.”

    4. 不允许出现“@.”或者.@

    5. 结尾不得是字符“@”或者“.”


    所以根据以上的原则和上面表中的语法,我们很容易的就可以得到需要的模板如下:"(\w)+[@](\w)+[.](\w)+"


    接下来我们仔细分析一下这个模板,首先“\w”表示邮件的开始字符只能是包含下划线的单词字符,这样,满足了第三个条件;“[@]”表示在电子邮件中应 当匹配并且只能匹配一次字符“@”,满足了条件一;同样的“[.]”表示在电子邮件中至少匹配1个至多匹配3个字符“.” ,满足了第二个条件;模板最后的“(\w)+”表示结尾的字符只能是包含下划线在内的单词字符,满足了条件五;模板中间的“(\w)+”满足了条件四。


    然后,我们就直接调用刚才的那个函数CheckExp("(\w)+[@](\w)+[.](\w)+",待校验的字符串)就好了,如果返回True就 表示数据是合法的,否则就是不正确的,怎么样,简单吧。我们还可以写出来校验身份证号码的模板:"([0-9])";校验URL的模板:"^http: //((\w)+[.])"等等;我们可以看到,这些模板为我们提供了很好的可重利用的模块,利用自己或者别人提供的各种模板,我们就可以方便快捷的进行 数据的合法性校验了,相信你一定会写出非常通用的模板的。


    这样,我们只要定制不同的模板,就可以实现对不同数据的合法性校验了。所以,正则表达式对象中最重要的属性就是:“Pattern”属性,只要真正掌握了这个属性,才可以自由的运用正则表达式对象来为我们的数据校验进行服务。
    -------------------------------------------
    RegExp对象提供简单的正则表达式支持功能。

    RegExp对象的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx, Match, Matches ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分字符大小写。
    regEx.Global = True ' 设置全局可用性。
    Set Matches = regEx.Execute(strng) ' 执行搜索。
    For Each Match in Matches ' 遍历匹配集合。
    RetStr = RetStr & "Match found at position "
    RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
    RetStr = RetStr & Match.Value & "'." & vbCRLF
    Next
    RegExpTest = RetStr
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

    RegExp 对象的属性

    ◎ Global属性

    Global属性设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。
    语法
    object.Global [= True | False ]
    object 参数总是 RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 True。

    Global 属性的用法(改变赋予 Global 属性的值并观察其效果):
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立规范表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分字母的大小写。
    regEx.Global = True ' 设置全程性质。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

    ◎ IgnoreCase属性

    IgnoreCase属性设置或返回一个Boolean值,指明模式搜索是否区分大小写。
    语法
    object.IgnoreCase [= True | False ]
    object 参数总是一个 RegExp 对象。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 True。

    IgnoreCase 属性的用法(改变赋予 IgnoreCase 属性的值以观察其效果):
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

    ◎ Pattern属性

    Pattern属性设置或返回被搜索的正则表达式模式。
    语法
    object.Pattern [= "searchstring"]
    Pattern 属性的语法包含以下几个部分:

    语法说明:
    object 必需的。总是一个 RegExp 对象变量。
    searchstring 可选的。被搜索的正则字符串表达式。它可能包含设置部分表格中的各种正则表达式字符。

    设置
    在书写正则表达式的模式时使用了特殊的字符和序列。下面描述了可以使用的字符和序列,并给出了实例。
    \ 将下一个字符标记为特殊字符或字面值。例如"n"与字符"n"匹配。"\n"与换行符匹配。序列"\\"与"\"匹配对面,"\("与"("匹配。
    ^ 匹配输入的开始位置。
    $ 匹配输入的结尾。
    * 匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。
    + 匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。
    ? 匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。
    . 匹配换行符以外的任何字符。
    (pattern) 与模式匹配并记住匹配。匹配的子字符串可以从作为结果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括号字符(和 ),可使用"\(" 或 "\)"。
    x|y 匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zoo" 或 "food"。
    {n} n 为非负的整数。匹配恰好n次。例如,"o{2}" 不能与 "Bob 中的 "o" 匹配,但是可以与"foooood"中的前两个o匹配。
    {n,} n 为非负的整数。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。"o{0,}"等价于"o*"。
    {n,m} m 和 n 为非负的整数。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三个o。"o{0,1}"等价于"o?"。
    [xyz] 一个字符集。与括号中字符的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。
    [^xyz] 一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]" 可以匹配"plain"中的"p".
    [a-z] 表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。
    [^m-z] 否定的字符区间。与不在指定区间内的字符匹配。例如,"[m-z]"与不在"m"到"z"之间的任何字符匹配。
    \b 与单词的边界匹配,即单词与空格之间的位置。例如,"er\b" 与"never"中的"er"匹配,但是不匹配"verb"中的"er"。
    \B 与非单词边界匹配。"ea*r\B"与"never early"中的"ear"匹配。
    \d 与一个数字字符匹配。等价于[0-9]。
    \D 与非数字的字符匹配。等价于[^0-9]。
    \f 与分页符匹配。
    \n 与换行符字符匹配。
    \r 与回车字符匹配。
    \s 与任何白字符匹配,包括空格、制表符、分页符等。等价于"[ \f\n\r\t\v]"。
    \S 与任何非空白的字符匹配。等价于"[^ \f\n\r\t\v]"。
    \t 与制表符匹配。
    \v 与垂直制表符匹配。
    \w 与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。
    \W 与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。
    \num 匹配 num个,其中 num 为一个正整数。引用回到记住的匹配。例如,"(.)\1"匹配两个连续的相同的字符。
    \n 匹配 n,其中n 是一个八进制换码值。八进制换码值必须是 1, 2 或 3 个数字长。例如,"\11" 和 "\011" 都与一个制表符匹配。"\0011"等价于"\001" 与 "1"。八进制换码值不得超过 256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。
    \xn 匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如,"\x41"匹配"A"。"\x041"等价于"\x04" 和 "1"。允许在正则表达式中使用 ASCII 码。

    Pattern 属性的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

    RegExp对象的方法

    ◎ Execute方法

    Execute方法对指定的字符串执行正则表达式搜索。
    语法
    object.Execute(string)
    语法部分描述
    object 必需的。总是一个 RegExp 对象的名称。
    string 必需的。要在其上执行正则表达式的文本字符串。

    说明
    正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。
    Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。

    Execute 方法的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = False ' 设置区分大小写。
    regEx.Global = True ' 搜索全部匹配。
    RegExpTest = regEx.Execute(strng) ' 执行搜索。
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))

    ◎ Replace方法

    Replace方法替换在正则表达式查找中找到的文本。
    语法
    object.Replace(string1, string2)
    语法部分描述
    object 必需的。总是一个 RegExp 对象的名称。
    string1 必需的。string1 是将要进行文本替换的字符串。
    string2 必需的。 string2 是替换文本字符串。

    说明
    被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。
    Replace 方法返回 string1 的副本,其中的 RegExp.Pattern 文本已经被替换为 string2。如果没有找到匹配的文本,将返回原来的 string1 的副本。

    eplace 方法的用法:
    Function ReplaceTest(patrn, replStr)
    Dim regEx, str1 ' 建立变量。
    str1 = "The quick brown fox jumped over the lazy dog."
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
    End Function

    MsgBox(ReplaceTest("fox", "cat"))
    ' 将 'fox' 替换为 'cat'。

    ;另外,Replace 方法在模式中替换 subexpressions 。 下面对以前示例中函数的调用,替换了原字符串中的所有字对:
    MsgBox(ReplaceText("(\S+)(\s+)(\S+)", "$3$2$1")) ' Swap pairs of words.

    ◎ Test方法

    Test方法对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。
    语法
    object.Test(string)
    语法部分描述
    object 必需的。总是一个 RegExp 对象的名称。
    string 必需的。要执行正则表达式搜索的文本字符串。

    说明
    正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。
    如果找到了匹配的模式,Test方法返回True;否则返回False。

    Test 方法的用法:
    Function RegExpTest(patrn, strng)
    Dim regEx, retVal ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = False ' 设置是否区分大小写。
    retVal = regEx.Test(strng) ' 执行搜索测试。
    If retVal Then
    RegExpTest = "找到一个或多个匹配。"
    Else
    RegExpTest = "未找到匹配。"
    End If
    End Function

    MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4"))
  • QTP的登陆脚本设计(转)

    2008-03-22 14:35:51

    QTP的登陆脚本设计
    文章出处:51testing博客 作者:pcl 发布时间:2006-08-14

        由于一直以来事情都比较多,最近上课还有其它的事情,所以本来答应一个朋友把脚本帮他写一些,但是耽误了3-4天了,实在不好意思。这里把脚本简单说一下,我们分析一下。
        当时问题时这样的,“我的错误的用户名就没办法登陆”,其实含义就是脚本最好能处理成功的用户名错误的用户名,那么这里涉及到脚本的设计。

    目标如下:
    1.    脚本需要处理成功和失败的用户的登陆
    2.   数据驱动

    设计开发脚本如下:


    第一步录制脚本如下
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set "吕巍"
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set ""
    Browser("智能变电巡检仪系统 4.0").Page("Page").Syn
    Browser("智能变电巡检仪系统 4.0").Close

    以上为录制的正确的用户名,下边录制错误的用户名
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set "xx"
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set ""
    出现错误提示“该用户不存在”

    第二步 增强脚本

    现在需要设计的是一套脚本驱动所有的测试数据,这样可以驱动所有的用例数据,qtp中提供了datatable。
    但是有数据驱动也要做一个事情就是如何处理错误的用户名和正确的用户名,如何结合起来呢?
    这里我把datatable看作存放测试用例的地方,里面放入测试数据,还放入测试的预期结果。这样我的设计已经出现雏形了。
    我把datatable设计为三列

    username  password status
    吕x               
    xxx       xxxx     该用户不存在

    第三列放入最后执行的结果,我设计的是空为成功登陆,如果有信息就用实际运行的结果和这一列对比.好了万事俱备只欠东风了

    修改脚本如下:
    Dim iStatus

    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set DataTable("username", dtLocalSheet)
    Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set DataTable("password", dtLocalSheet)
    iStatus = DataTable("status", dtLocalSheet)

    If   iStatus=""  Then
      Browser("智能变电巡检仪系统 4.0").Close
    End If


    If   iStatus="该用户不存在"    Then
         Reporter.ReportEvent micFail, "登陆", "登陆失败."
    End If

    Browser("智能变电巡检仪系统 4.0").Close

    第三步,设置脚本运行过程

    打开 tests-〉settings
    设置RUN TAB页面下 Datatable iterations中 Run On all rows

    这样就完成了整个脚本的设计工作,以上通过一个简单例子吧脚本的设计和软件的功能结合起来,达成脚本的设计效果。

  • (转)软件测试工程师的进阶之路

    2008-03-21 14:48:27

    IT行业中软件测试工程师的进阶之路2008-03-19 来自:java060515  [收藏到我的网摘]

    下面以IT行业中软件测试工程师的进阶之路为例,对IT从业者做好职业规划提供一点启示。

    软件测试工程师的进阶之路

    初级测试工程师

    刚入门拥有计算机科学学位的个人或具有一些手工测试经验的个人。开发测试脚本并开始熟悉测试生存周期和测试技术。

    测试工程师/程序分析员

    具有1~2年经验的测试工程师或程序员。编写自动测试脚本程序并担任测试编程初期领导工作。拓展编程语言、操作系统、网络与数据库技能。

    高级测试工程师/程序分析员

    具有3~4年经验的测试工程师或程序员。帮助开发或维护测试或编程标准与过程,负责同级的评审,并为其他初级的测试工程师或程序员充当顾问。

    测试组负责人

    具有4~6年经验的测试工程师或程序员。负责管理1至3名测试工程师或程序员。担负一些进度安排和工作规模/成本估算职责。

    测试/编程负责人

    具有6~10年经验的测试工程师或程序员。负责管理8至10名技术人员。负责进度安排、工作规模/成本估算、按进度表和预算目标交付产品。

    测试/质量保证/开发(项目)经理

    具有10多年的工作经验。管理8名或更多的人员参加的1个或多个项目。负责这一领域(测试/质量保证/开发)内的整个开发生存周期业务。

    计划经理

    具有15年以上开发与支持(测试/质量保证)活动方面的经验。管理从事若干项目的人员以及整个开发生存周期。负责把握项目方向与盈亏责任。

    软件测试人员的三大发展方向

    “软件测试人员一般有三大发展方向。”微软公司的陈宏刚博士介绍说,一是走软件测试的技术路线,成长为高级软件测试工程师。二是向管理方向发展,从测试工程师到组长,再到测试经理,以至更高的职位。三是可以换职业,做项目管理或做开发人员。经过软件测试岗位洗礼的人才往往是行业中的多面手,在技术、管理、市场甚至其他非IT领域都能得到良好的发展。当然这首先要取决于从业者是否具备长远眼光,对自己的职业生涯进行合理规划。

  • (转)自动化测试网站收录

    2008-03-21 10:12:09

    以下自动化测试技术相关的网站,是本人日常查阅资料收集。拿出来跟大家分享,请大家继续反馈,我把它添加到列表中。

    类别
    名称
    网址
    国内综合性测试网站 无忧测试 http://www.51testing.com/
    测试时代 http://www.testage.net/
    中国软件测试在线 http://www.softtest.cn/
    北大测试主站 http://www.btesting.com
    一起测试网 http://www.17testing.com/
    中国软件测试联盟 http://www.iceshi.com
    3A测试网 http://www.3atesting.com/
    测试总裁网 http://www.testceo.com
    广东软件测试行业联盟 http://www.gztest.com/
    上海测仕信息技术 http://www.cntesting.com/
    中国软件测试人才网 http://www.rjzl.gov.cn/
    国内自动化测试网站 Ricky Zhu http://www.rickyzhu.com/
    ezTester,针对C/C++工程,拉通白盒测试与自动化测试的工具站点 http://www.ezTester.com/
    蓝天城 http://www.testguild.cn/
    国外自动化测试网站 开源项目Software Automation Framework Support(SAFS)站点,有一些数据驱动、关键字驱动自动化测试技术资料介绍 http://safsdev.sourceforge.net/
    起源于IBM的自动化测试框架STAF的开源项目主页 http://staf.sourceforge.net/
    这便是知名的“Software QA and Testing Resource Center”,提供众多资源入口 http://www.softwareqatest.com/
    性能测试工具LoadRunner的一个论坛 http://groups.yahoo.com/group/LoadRunner
    关于网站自动测试、性能测试、安全性测试 http://bdonline.sqe.com/
    软件测试资源库,涉及GUI测试、性能测试、静态分析、覆盖率、用例管理等 http://www.testingfaqs.org/
    一个有关WinRunner TSL编程的个人技术站点 http://www.wilsonmar.com/1winrun2.htm
    Bret Pettichord的主页,收集不少测试自动化方面的资源

    http://www.io.com/~wazmo/

    约克大学的测试专业兴趣研究组网页,有比较丰富的资料下载,内容涵盖了测试的多个方面,包括测试自动化、测试数据生成、面向对象软件测试、验证确认过程等 http://www.cs.york.ac.uk/testsig/
    一家老牌软件测试咨询公司的网站,有一些测试方面的课程和资料供下载 软件测试专业网站:51Testing软件测试网'@&g*N9dy(o http://www.grove.co.uk/
    卡耐基梅陇大学网上图书馆,在这里你可以获得有关计算机方面各类论文资料,内容极其庞大,是研究软件测试不可多得的资料来源之一 http://www.library.cmu.edu/Research/Engineering-AndSciences/CS+ECE/index.html
    包含一些流行测试工具的介绍、下载和讨论,还提供测试方面的资料 http://www.betasoft.com/
    一个自动化软件测试和自然语言处理研究页面,属于个人网页,上面有些资源可供下载 http://www.automated-testing.com/
    一个软件质量工程服务性网站,组织软件测试自动化、STAR-EASE、STARWEST等方面的测试学术会议,并提供一些相关信息资料和课程服务 http://www.sqe.com/
    GCT开源工具的作者Brian Marick的网站,包含了Marick 研究的一些资料和论文,该网页提供了测试模式方面的资料,值得研究 http://www.testing.com/
    Kerry Zallar的个人主页,有一些自动测试与质量保证方面的资料供下载 http://www.testingstuff.com/
    包含James Bach关于软件测试和过程方面的很多论文,尤其在启发式测试策略方面值得参考 http://www.satisfice.com/

  • (转)QTP测试时,应用程序或者网页的最大化最小化控制

    2008-03-10 18:09:27

    QTP测试时,应用程序或者网页的最大化最小化控制

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

      在QTP测试中,在出现bug的地方,我们想通过截图留下证据,但是有时候可能网页不是最大化,使得我们截到了无关紧要的图像,在这里提供一些方法,可以尽量避免这种现象。

    1.截图可以
    使用QTP自带的函数例如
    只截取page,不包括上面的工具及导航栏
    Browser("社内システム").Page("社内システム").CaptureBitmap("D:\1.bmp)
    整个浏览器
    Browser("社内システム).CaptureBitmap("D:\1.bmp)
    由于这种截图只是一屏幕,不能截取到整个page
    所以,有时候我们也可以使用一些开源的截图工具,这样效果比较好。
    2.在截图之前先同步。针对于页面来说就是
    Browser("社内システム").Page("社内システム").Sync
    3.截图之前先最大化。
    应用程序的操作:
    winObject.Maximize   ---最大化
    winObject.Minimize    ---最小化
    winObject.Restore     ---返回到更菜的大小
    浏览器的操作:
    winObject.FullScreen   --- 效果如同F11的最大化
    winObject.Minimize       ---最小化

      4.针对于网页的最大化我们深入的学习一下,winObject.FullScreen 其效果如同F11的最大化,不是我们通常使用的最大化,有时候截图需要规范,要用到通常的最大化怎么办呢?
      其实浏览器(IE)对于操作系统来讲,也是一个应用程序,我们可以变相的实现“通常的最大化”
    Dim hwnd
    hwnd = Browser("Browser").GetROProperty("HWND")
    'msgbox cstr(hwnd)
    '将浏览器最大化
    Window("hwnd:=" & hwnd).Maximize
    Browser("Browser").Navigate "http://www.google.com/"
    '回复浏览器刚才的大小
    Window("hwnd:=" & hwnd).Restore
    '最小化浏览器
    Window("hwnd:=" & hwnd).Minimize
    这样我们变通的实现了IE的最大化,最小化,同事也能够还原到原来的大小。

  • QTP 常用函数(转)

    2008-01-30 16:09:09

    1.GetCellData函数 

      作用:获取单元格的值

      例:  rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount软件测试专业网站:51Testing软件测试网e6{k.X SO.x
    For counter = 1 To rowCount软件测试专业网站:51Testing软件测试网8S'\!~?%F2H x*Ifx
      text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)软件测试专业网站:51Testing软件测试网;Wl)[{1v X(YgP
      If (text = "xxx") Then
    2K%c3s.T#L!^9z.} S ~46301    counter = counter - 1
    .imw&a~p Y:\w;\0~46301    selectNO = "#" & counter软件测试专业网站:51Testing软件测试网`7J Pmd
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
    qLT8{y46301    Exit For
    (M:n j.K'P sEB46301  End If软件测试专业网站:51Testing软件测试网-q l)j;yl
    Next

    2.把值插入datatable里

      例:   datatable.setcurrentrow(i) 软件测试专业网站:51Testing软件测试网 R6AB7t m f
            datatable.value("name","Global")="name"软件测试专业网站:51Testing软件测试网0k"E*E5d'['z:~#b&h`;@
            datatable.value("passwd","Global")="passwd"

    3.用代码来启动浏览器

      Browser1 = "IE"
    -rw&\,PM(P'C0R:E7P+|"J7E46301  StartURL = "www.51testing.com"
    !o!r,] xT[46301  IF Browser1 = "IE" THEN 软件测试专业网站:51Testing软件测试网gtJi8K
         set IE = CreateObject("InternetExplorer.Application")软件测试专业网站:51Testing软件测试网Ft8_4O^!ZW-\.`&VF
         IE.Visible = true
    5s!uY(p-[46301     IE.Navigate StartURL
    u%Hwq"s+V46301  END IF软件测试专业网站:51Testing软件测试网"Xe$z#B pY
     

    4.ExecuteFile函数

      作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中 软件测试专业网站:51Testing软件测试网2Oz|? X
           ExecuteFile FileName 软件测试专业网站:51Testing软件测试网*f s%TM*s3})k[,Mf
      说明:where FileName is the absolute or relative path of your VBscrīpt file.

      例:ExecuteFile("F:\test.vbs")

    5.Strcomp函数 

      作用:比较文本

      例:dim strtext1,strtext2,str ,str1,comp1
    B%B { u8crC9l46301     strtext1 = "xxx"
    +O8{ Tn m[46301     strtext2 = "xxx"
    +|%b xQ"mY#K(]46301     str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")软件测试专业网站:51Testing软件测试网:\d#a8AW g w ud6V&e
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")软件测试专业网站:51Testing软件测试网,C/` vLr$z-_ EE
         comp1=strcomp(strtext1,str,0)
    .k$nL#a%k0y6rJM*j%Z|46301     If  comp=0 Then
    -Z*S0s!i EGL(GY,h46301          msgbox “这两个串相等”
    XW1b_@ U:r(ODgr&c46301     else
    Al \4v%eGq"j46301       msgbox str软件测试专业网站:51Testing软件测试网Q#D$YB Hv dw-A
         End If 

    6.CaptureBitmap 

      作用:捕获屏幕

    7. GetROProperty

      作用:取对象属性值

      例:VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 

    8.ExitAction - 退出当前操作,无论其循环属性如何。软件测试专业网站:51Testing软件测试网7^k7u9h(a oZ ~Iw
      ExitActionIteration - 退出操作的当前循环。软件测试专业网站:51Testing软件测试网?'_&t ^$n9Od
      ExitRun - 退出测试,无论其循环属性如何。软件测试专业网站:51Testing软件测试网*{)nM)b*D4[F}
      ExitGlobalIteration - 退出当前全局循环。


    R$iRF!bf|463019.如何使用Excel对象处理数据?
    7Z7C3[,ME3[d1anogP46301  Dim xl软件测试专业网站:51Testing软件测试网+q`^w_f#i
      打开excel文件软件测试专业网站:51Testing软件测试网 fh8j,e3Z#d@3^M7[M+u
      Function OpenExcelFile(strFilePath)软件测试专业网站:51Testing软件测试网*S(G)W {k%t#k0L.X"g1E$V
      Set xl = CreateObject("Excel.Application")
    8Q7CN!D@ Fz46301  xl.Workbooks.Open strFilePath软件测试专业网站:51Testing软件测试网} V3h ~ju(pI gq
      End Function软件测试专业网站:51Testing软件测试网h"N%WI ]q
      获得指定单元格数据
    (E%g8C+P-?O!r2qz;z46301  Function GetCellData(strSheet,rwIndex,colIndex)
    :PB-t?f2VD.Ug46301  GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)软件测试专业网站:51Testing软件测试网:Zt^jUk"a8G
      End Function软件测试专业网站:51Testing软件测试网H6}*HeY
      填充单元格数据软件测试专业网站:51Testing软件测试网1yY5e*IJVq&l8iI
      Function PutCellData(strSheet,rwIndex,colIndex,varData)
    /{,Y%HLO-Kj ne j^46301  xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData软件测试专业网站:51Testing软件测试网&\:zIA1Lg a7z"V
      End Function软件测试专业网站:51Testing软件测试网 E*w'{O:~^0aCUk
      保存并推出软件测试专业网站:51Testing软件测试网'f\+oQ h#f/V@i
      Function SaveAndQuit()软件测试专业网站:51Testing软件测试网`&AAW!c!r D
      xl.Activeworkbook.save
    7WyY{KQ A46301  xl.Quit
    LG'r-b A?"m,M46301  Set xl = nothing软件测试专业网站:51Testing软件测试网0x4NJ|~%s6l:D
      End Function
    "p8Yqr(C,y,\-R46301

    10.连接sql数据库

      例:Dim res,cmd,sql软件测试专业网站:51Testing软件测试网8[&qb p.}m
         Set Res=createobject("adodb.recordset")
    S$u"Q6Y0B1dO D46301     Set Cmd=createobject("adodb.command")
    7Q;kijE t46301     Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改软件测试专业网站:51Testing软件测试网~ RDO| M ~)jS3CW/K#b
        Cmd.CommandType = 1
    amW1Uw Nq46301    sql="selec t * from 表 where name=username"软件测试专业网站:51Testing软件测试网*z _g,^ o G0_#t|
        Cmd.CommandText = sql
    .J.~e6U,l:Cp$l46301    Set res = Cmd.Execute()软件测试专业网站:51Testing软件测试网'T D+]xg0R*uz"E
        Set res = nothing软件测试专业网站:51Testing软件测试网 n2GWU:c J
        Set cmd.ActiveConnection = nothing软件测试专业网站:51Testing软件测试网8G1e(D}+i"r+g2?x(u
        Set Cmd= nothing

  • 常见的自动化测试面试问题(转)

    2008-01-30 11:12:08

    常见的自动化测试面试问题

    2008-01-29 13:49:18

    LR关联怎么做?

    LR怎么调优;LR怎么来做负载测试

    QTPLR做过什么项目?

    LR的虚拟用户是什么?LR的自定义实现是什么?

    用英文描述Bug跟踪系统与自动化测试工具的作用?

    用过自动化测试工具吗?怎么用?用什么语言?

    你对自动化测试的理解?

  • VBScript

    2007-12-10 17:01:43

301/212>
Open Toolbar