日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

最新来客

我的好友

统计信息

  • 访问量: 3566
  • 日志数: 28
  • 建立时间: 2007-01-31
  • 更新时间: 2008-10-08

RSS订阅

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

我的最新日志

  • Vista各版本概述

    2008-10-08

    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

    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

    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-8-30

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

    2008-7-15

    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-7-15

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

    全文如下:

    开头语:

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

     

    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-6-10

    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-4-09

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

    语法

    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-4-09

    <%
    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-4-08

    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

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

我的主题