发布新日志

  • Tomcat 内存设置

    dohu123 发布于 2009-07-12 21:26:12

        这次发布测试的JAVA项目确实让我受了不少苦啊。当然也学习了。。呵呵
        这次发布的是个BOSS系统,由4个子系统构成,发布前开发部也没介绍说系统有多大,当然也是自己经验缺乏,没意识到4个子系统一个tomcat下面默认内存肯定是不够的。所以发布时没有修改tomcat默认内存设置,结果出错了:java.lang. OutOfMemoryError: PermGen space。
        自己很菜,只得网上搜索,原来是内存不够。那就设置了,综合了网上众多网友的方法还是不行,因为上面不少是转的,有些又没转全。汗。。。折腾了不少时间,所以写下保存下。
        PermGen space这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
        既然内存不够那就加了!如果是通过%tomcat_home%\bin中的startup.bat脚本启动,则在环境变量中加上CATALINA_OPTS这个属性。即是编辑%tomcat_home%\bin下的catalina.bat, 在最前面加上set JAVA_OPTS=-Xms1024m -Xmx1024m  -XX:PermSize=128M -XX:MaxNewSize=512m -XX:MaxPermSize=512m ,当然具体设置就要看实际情况了。 其中-Xms是指初始的大小,-Xmx是指最大值,以免多次加载,一般这两个设为同一个值即可。这是针对 windows 系统,如果是linux 即修改catalina.sh。
        另外,如果tomcat是作为系统服务启动的,以上设置则不灵了!因为作为系统服务的话,系统启动时调用的是 %tomcat_home%\bin\tomcat5w.exe,他读取注册表中的值,而不是catalina.bat的设置,因此需要修改注册表:
    解决办法:
    修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\Java\Options
    原值为
    -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
    -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
    -Xrs
    改为:
    -Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
    -Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
    -Xrs -Xms300m -Xmx350m
    重起tomcat服务,设置生效。 这个是我转摘的,我没试验过,不过看上去应该没问题的。
  • samba和NFS区别-wxc

    qaarchitech 发布于 2008-11-22 21:49:01

      samba基于tcp重新开发,使用的协议是netbios。微软不愿意交License费,在windows系统中对该协议重新进行了实现。samba和windows中的网络邻居都使用netbios协议。那么,samba自然主要用于在windows和unix之间共享资源。资源包括文件、打印机等等。
      NFS是SUN开发的,用于UNIX机器之间的资源共享。其设置相当容易,主要是配置/etc/exports文件,然后运行exportfs -a来共享出来。现在NFS已经成为UNIX/LINUX上的标配。
      从我的经验来看,nfs的效率要稍微高一些,只是差别不是太大。从配置来看,samba比较复杂,nfs比较简单。但是复杂有复杂的道理,它让我们能够灵活的配置。

  • (qtp)Reporter对象的ReportEvent方法

    fanjianmin 发布于 2008-09-03 10:41:35

    描述

    test result中报告测试结果。

    语法

    Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]

     Argument  Type  Descrīption
     EventStatus  Number or pre-defined constant

    状态值:

    0 micPass:将本步骤的运行结果状态设置为“Pass”,并向Result中产生报告信息。

    如果想在报告中生成“通过”报告,用本状态值。

    1 micFail: 将本步骤的运行结果状态设置为“Fail”,并向Result中产生报告信息。当脚本中运行本语句时,整个测试的结果状态是“fails”

    如果想在报告中生成“失败”报告,用本状态值。如果运行了本语句,则整个测试的状态为“Fail”。

    2 micDone:仅向Result中产生报告信息,但不影响整个测试的结果状态。

    如果想在报告中生成“完成”报告,用本状态值。

    3 micWarning: SResult中产生报告信息,但是不会中断测试的运行,也不影响测试的 pass/fail status

    如果想在报告中生成“警告”报告,用本状态值。运行这个语句后,整个测试结果状态为“Warning”。

     ReportStepName  String 将在报告中显示的步骤名称(object name).
     Details  String 报告的详细信息。这些信息是本条报告的“Details”信息。
     in  N/A  Not in use

    举例: 下面的例子使用ReprotEvent方法来报告一个失败信息。

    Reporter.ReportEvent 1, "Custom Step", "The user-defined step failed."

    Reporter.ReportEvent micFail, "Custom Step", "The user-defined step failed."
  • 一位前辈工程师的忠告!(转)

    niithxl 发布于 2009-01-16 08:56:48

    [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!

    [2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!

    [3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。

    很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!

    [4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

    [5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务, 法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!

    [6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!
    [7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!
    [8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!

    [9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...

    [10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功。

  • 一份有趣的需求

    lghss23 发布于 2009-01-14 18:08:04

    下午逛51的时候,看到了一份小的需求,觉得挺有意思,抱着试试的态度,画了个分析图,同时有一些疑问。老实说,这只是一个雏形,有兴趣的同学可以一起来探讨,指出不足。

    聊天规则:(1)A向B发出聊天邀请,B同意后,A和B进入聊天房间;(2)如果A已经在聊天房间中,则B进入A所在的聊天房间;(3)如果A不在聊天房间中,则创建一个新的聊天房间,A和B都进入这个房间;(4)一个房间最多5个人聊天;(5)房间中的每个人都随时可以退出聊天。请根据以上设计写出测试需求,需要列举出所有进入/退出聊天流程的情况。出处

    Diagram:



    Question Raised:

    1.是否允许一个人可以同时存在不同聊天室,如果可以,最多几个;如果不可以,见Q2(默认按照后者设计)。
    2
    .B接受A的邀请是否意味着B离开原聊天房间(假设B正在一个房间内),还是系统确认可以和A进行聊天时才离开(默认按照前者设计)。

    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明,否则将追究法律责任。

    本文出自lghss23的51Testing软件测试博客:http://www.51testing.com/?227608

  • 移动通信基础知识(2)

    gulobano 发布于 2009-01-19 16:06:52

    五 信道的概念

    1. 基本概念
       GSM
    是数字化系统,任务就是传输比特流。为了把通信业务和传输方案对应起来,引入了信道(Channel)的概念。
      
    不同的信道可以同时传输不同的比特流
      
    信道分为逻辑信道和物理信道
      
    逻辑信道到物理信道的映射就是指将要发送的信息安排到合适的TDMA帧和时隙的过程。

    2. 无线帧结构
    GSM
    的无线帧结构有五个层次:时隙、TDMA帧、复帧、超帧、超高帧
    时隙:物理信道的基本单元
    TDMA
    帧:由8个时隙组成,是占据载频的基本单元。每个载频有8个时隙
    复帧:有两种类型
         
    1)由26TDMA帧组成的复帧,用于TCHSACCHFACCH
         
    2)由51TDMA帧组成的复帧,用于BCCHCCCHSDCCH
    超帧:一个连贯的51X261326个的TDMA帧,由5126帧的复帧或者2651帧的复帧构成
    超高帧:由2048个超帧构成,相当于(2048X13262715648)个TDMA
    分级帧结构的示意图

    TDMA
    帧号以3小时2853760毫秒为周期循环编号

    3. 物理信道
    TDMA
    是指在GSM900的每个载频上按时间分为8个时间段,每一个时间段成为一个时隙(Time Slot),这样的时隙叫做物理信道。
    一个载频上连续的8个时隙组成一个TDMA帧,即一个载频上可提供8个物理信道。
    GSM
    的工作频段
    GSM900
    890915MHz MS发、BS收,即为上行链路)
              935
    960MHz BS发、MS收,即为下行链路)
             
    双工间隔为45MHz,工作带宽为25 MHz,载频间隔为200 kHz
    GSM1800
    17101785MS发、BS收,即为上行链路)
              1805
    1880BS发、MS收,即为下行链路)
              
    双工间隔为95MHz,工作带宽为75 MHz,载频间隔为200 kHz
    上行链路和下行链路中不同频率的同时使用使得通信有发射TX和接收RX两个方向。
    无线载波频率总是成对(上行和下行)的安排,两者之间的差别称为双工频率
    每个信道占用的带宽为200kHz/825kHz
    GSM900
    的总载波(频道)数为25MHz/200kHz1251251124
    GSM1800
    的总载波(频道)数为 75MHz/200kHz3753751374

    4. 逻辑信道
    如果吧TDMA帧的每个时隙看作为物理信道,那么在物理信道上所传输的内容就是逻辑信道。
    GSM
    系统在物理信道上传输的信息是由大约100多个调制比特组成的脉冲串,成为Burst,即突发脉冲序列。以不同的Burst信息格式来携带不同的逻辑信道

       逻辑信道的分类图

    5.信道组合
    在实际应用中,总是将不同类型的逻辑信道映射到同一物理信道上,称为信道组合。
    GSM
    系统中的信道组合类型:?????

    6.逻辑信道到物理信道的映射
    GSM
    系统按照下面的方法建立物理信道和逻辑信道间映射对应关系:

       一个基站有N个载频,每个载频有8个时隙。
    将载频定义为f0f1f2 ...
    对于下行链路,从f0的第0个时隙(TS0)起始,TS0只用于映射控制信道
    BCH
    CCCHTS0上的复用关系
    BCH
    CCCH共占用51TS0时隙,即51TDMA帧。作为复帧,以每出现一个空闲帧作为此复帧的结束

       示意图:BCCH+CCCH/TS0/下行/51帧

       对于上行链路,f0上的TS0不包括上述信道,只用于移动台的接入,即用于上行链路作为RACH信道。
     示意图:RACH/TS0/上行/51帧


    小结
    :BCCHFCCHSCHPCHAGCHRACH均映射到TS0。其中RACH映射到上行链路,其余映射到下行链路

    专用控制信道DCCH映射到下行链路f0TS1时隙上。由于呼叫建立和登记时的比特率相当的低,可在一个时隙上放8DCCH以提高时隙的复用率
    (在一个时隙上传输一连串脉冲串Burst,即比特流,因为此时比特率低,所以可以传输多个DCCH
    SDCCHSACCH共有102个时隙,即102TDMA
    示意图: SDCCH+SACCH/TS1/下行/102帧

    上行链路f0上的TS1与下行链路f0上的TS1有相同的结构,只是在时间上有一个偏移

    示意图:SDCCH+SACCH/TS1/下行/102帧


    小结:载频
    f0上的上行、下行的TS0TS1供逻辑控制信道使用,而其余6个物理信道TS2TS7TCH使用

    TCH到物理信道的映射如图示:


    T
    TCH,用于传送语音和数据
    A
    SACCH,用于传送控制命令,如命令改变输出功率等
    I
    是空闲,不含任何信息,用于配合测量

    上行链路和下行链路的TCH结构完全一样,只是有一个时间的偏移,时间偏移为3TS,即上行TS2和下行TS2不同时出现,表明移动台的收发不必同时进行
    上下行偏移示意图

    小结:在载频f0
    TS0
    :逻辑控制信道,重复周期为51TS
    TS1
    :逻辑控制信道,重复周期为102TS
    TS2
    :逻辑业务信道,重复周期为26TS
    TS3
    TS7:逻辑业务信道,重复周期为26TS
    其它f1fn个载频的TS0TS7全是业务信道

  • qtp知识

    ls_721521 发布于 2009-01-04 13:26:27

    1 检查页面是否存在
    对象exist可以检查某一个页面是否存在。
    代码:
    if Browser("…").Page(“…").Exist then
     ‘在运行结果中显示的报告, “micPass”的状态是通过, micFail是不通过
       reporter.ReportEvent micPass ,“页面存在“,”通过“   
       else
       reporter.ReportEvent micFail ,"页面不存在“,"不通过"
    end if

    7.2 防止程序中断的方法
    在回放脚本的时候,有时因为错误导致运行的脚本中断,不能自动运行。为了能达到真正无人职守的状态可以在脚本的最前面加上如下的代码:  
    On error resume next  ‘遇到错误返回到脚本的下一行继续执行。
    On error goto 0 ‘错误处理的控制权,平时是由QTP控制的(这个叫默认的),当有on error resume next 时,是交给on error处理,当on error goto 0时,就换给QTP

    7.3 同步点的设定
    等待某一对象出现后继续执行,为了防止qtp找不到对象而设定同步点。有2种方法:1种是用wait加等待的时间,如wait 5(qtp等待5秒钟后继续执行)。另一种方法是等待要执行对象的出现,如果出现就继续执行,否则一直等待,代码如下:
    y=......waitproperty("visible",true,10000)
    If y=true then
       ‘执行下一条语句
       else
        ’对象不出现就一直等待,直到过了10000秒后程序找不到对象报错
    End if

    7.4 截屏
    在优化脚本时,如果想查看某一页面在执行后的页面效果,可以采取截屏的办法截取当前的操作页面并保存到本地。代码:
        desktop. capturebitmap “c:\***.bmp“,ture     ’在脚本中想要查看的一行插入,运行后图片保存到设置的路径下
    7.5 导入execl文件并参数化数据方法
    Qtp自带了datatable表,可以把要参数化的数据写在里面,但这样写脚本和数据不能分离,后期不好维护脚本。现在采用从外部导入execl文件的方法导入数据。代码如下:
       datatable.ImportSheet “D:\...\data.xls”,“sheet1”,“global“  
       ‘第一个参数是要导入文件的路径,第二个是execl的第一个表格,第三个参数是在execl的全局范围内查找

       另外datatable对象还有很多操作,比如:获取表中字段的行数,插入表数据,删除数据等,下面是获取表中数据的代码:datatable("A","dtglobalsheet)
    7.6 为描述性编程自动创建注释
       当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等信息,那么用action template 来实现最简单快捷。 方法:用记事本等文本编辑器,输入如下类似的内容:           'Company:东方般若            'Date: Date          然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    7.7 导入vbs文件
    想要实现脚本的函数化,并更好的维护它,可以把一些公用的函数写到vbs里面,用qtp来调用它。
    实现调用vbs的方法有2种:
     1.函数executefile加vbs文件的路径
      executefile “c:\...\funcation.vbs”

     2.设置QTP test/settings/resources/+函数目录

    7.8 时间差函数

    统计两个日期时间段之间的间隔,还有多少小时
    Dim timediff
    timediff=datediff(“H”,now,“2008-8-8” )
    Print timediff
    7.9 获取web下拉框中数据的行数和数据值
    1.获取行数:首先将webtable添加到对象库中,查看对象库里有该webtable的属性后
     count=Browser("…").Page("Page").Frame("…").WebTable("...").RowCount
       Msgbox count ‘查看行数
    2.获取数据值,
       for i=1 to  count     
     value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
       msgbox value
       next
    获取到列表中的数值后,qtp的对象库中没有这个WebElement的对象,一般采用描述性编程的方法获取对象,比如:用getcelldata获取的表中数据的innertext属性是“普通岗”,那么就可以用如下代码:
     for i=1 to  count     
       value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
      
       Browser(“…”).Page(“Page”).Frame(“…”). WebElement(“innertext:=“&value,”index:=1”).click
     next

    7.10 对象获得焦点
    判断某个webedit输入框是否获取了焦点,如果没有获取就给它焦点,然后输入数值。代码如下:

    if not browser("**").page(“**").webedit(“
    **").object.isdisabled  then
             .object.focus
             .object.set "输入数值“

    7.11 获取对象当前属性值
    用GetROProperty可以获取对象的当前属性值,比如一些对象的属性经常发生变化,用getroproterty就能定位对象当前的属性状态来执行相应的操作。
    Dim pro
     pro= browser("**").page(“**").webedit(“
      **“). GetROProperty(“property”,value)
    Msgbox pro ‘弹出窗口,查看获取的属性。

    7.12 Systemutil对象的应用
    利用systemutil可以实现的功能:回放qtp脚本时禁止鼠标和键盘的输入;打开应用程序或web;通过句柄关闭进程;通过进程名关闭进程等。下面的代码是打开百度网页:
      systemutil.run “iexplore.exe”,“http://www.baidu.com”,“”,“”,“”,3        ‘打开百度的首页,最后面的参数“3” 代表打开ie后最大化
     
       SystemUtil.CloseProcessByName(“iexplore.exe”)      ‘关闭ie

        
    7.13 Action的使用
    action分为内部调用和外部调用2种方法:内部调用使用split划分;外部调用时被调用的action设置成share,并共享对象库。
       split action:RunAction "action", oneIteration
    7.14.  随即数

    在测试中有时会用到随即数,有多种方法:
        
    第一种 :n=randomnumber.value(1,255)  ’n的值从1到255之间随即产生

    第二种 :randomize      ‘更新反回的数据          dim n
                 n=int (10*rnd())
                 msgbox n        ‘n为10以内的整数


    7.15 “is+*”类型功能
       isarray'是否是数组 isconnected'判断QTP是否连接到TD isdate'是否是合法的日期类型 isempty'判断是否初始化 isNull'判断是否为空值 isNumeric'判断是否是数字型 isobject'判断是否一个功能对象 isready'判断设备是否准备就绪 isRootFolder'是否是根目录
    7.16 对象库

    打开对象库resources->object repository,或者用快捷方式:ctrl+r来打开。

    1.Qtp中的对象库和脚本是一一对应的,如果脚本中某个对象在对象库中不存在,则无法回放成功,会提示找不到对象。

    2.对无法识别的对象用spy工具获得后添加到对象库中。

    3.有时候脚本回放失败就是找不到对象的原因,可以通过用spy工具查看找不到对象的属性,然后打开对象库,比较二者的属性信息,如果属性有不相同的说明就是属性的原因,可以通过更改属性的方式统一对象属性。

    7.17 调试脚本

    1.脚本编写完毕,可以用按ctrl+f7来查看脚本是否有语法错误。

    2. Msgbox和print:在回放脚本时可以方便的查看自己想看到的信息。


    3.设置断点:为了测试某一小段脚本的功能,而当整个action很长的时
    候,可以设置断点单步debug。
    7.18 强制退出
    遇到问题退出可以用exittest或 exit for,例如下面代码:

    Public function text_exit()
         for i=0 to 10
                if i=3 then
                    exittest
                    ‘exit for
                end if
         next
    End function

    Text_exit()
           
    7.19 连接数据库_增删改
    Dim conn,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"   '设置连接字符串
    conn.open  '开启连接
    'strSql="insert into UM_User  values(1,'UserID')"  '设置插入语句
    strSql="drop  table TM_Task_14_Target"
    'strSql="select *  from UM_User"

    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       conn.execute strSql    '执行更新语句
       conn.close
       Set conn = nothing
    End If
    7.20 连接数据库_查
    Dim conn,res,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"  '设置连接字符串
    conn.open  '开启连接
    Set res = CreateObject("ADODB.RecordSet")   '创建一个记录集对象
    strSql="select * from UM_User"  '设置查询雨具
    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        res.close                               '关闭结果集和连接,并且置为空
        Set res = nothing
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       res.open strSql,conn    '执行查询语句
       res.MoveFirst        '将记录集游标指到记录集的最开始
       Do
          Reporter.ReportEvent micPass,"file",cstr(res(0))+" : "+cstr(res(1))  '循环遍历查询结果,并且保持到reproter对象中,直到记录集到达末尾,循环结束
          res.MoveNext
       Loop until res.eof = true
       res.close
       Set res = nothing
       conn.close
       Set conn = nothing
    End If
    低级录制
    在无法识别对象时使用
    利用Vbs运行外部程序
    WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:
    1、scrīpting.FileSystemObject  —>  提供一整套文件系统操作函数
    2、scrīpting.Dictionary  —>  用来返回存放键值对的字典对象
    3、Wscrīpt.Shell  —>  提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置
    4、Wscrīpt.NetWork  —> 
    提供网络连接和远程打印机管理的函数。(其中,所有scrīpting对象都存放在SCRRUN.DLL文件中,所有的Wscrīpt对象都存放在WSHOM.ocx文件中。)
    现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Run “notepad”
    Objshell.run “calc”
    自建日志
    Public Sub logfile(message)
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim fileSystemObj, fileSpec
    Dim currentTime
    currentDate = Date
    currentTime = Time
    testName = "log"
    Set fileSystemObj = CreateObject("scrīpting.FileSystemObject")
    fileSpec ="f:\log.txt"
    If Not (fileSystemObj.FileExists(filespec)) Then
    Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True) 
    logFile.WriteLine("###############################################") 
    logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") ) 
    logFile.WriteLin("######################################") 
    logFile.Close 
    Set logFile = Nothing
    End If
    Set logFile = fileSystemObj.OpenTextFile(fileSpec, ForAppending, False, True)
    logFile.WriteLine (currentDate & " "& currentTime & " " & message)
    logFile.Close
    Set logFile = Nothing
    Set fileSystemObj = Nothing
    End Sub
    logfile(“ok")
    Vb6生成dll
    Environment对象
    检查页面文字显示颜色
    Set Elements = Browser(“WisdomCRM客户关系管理系统”).Object.Document.all.tags(“div”)’tags(“td”)为在td中检查
    For each Element in Elements
      If Element.InnerText="执行团队" Then
        strhtml=Element.Innerhtml
        n=instr(strhtml,"color=red")
        If n=0 Then
          msgbox "Text color is red!"
       exit for
        End If
      End If
    Next
    关闭重复的页面
    Dim loginwin
    Set loginwin = descrīption.Create()                                                  '创建对象名为loginwin的对象
    loginwin( "name").value="WisdomCRM客户关系管理系统"   ',对象属性及值


    Set child=desktop.ChildObjects (loginwin)
    cout=child.count
    msgbox cout
    For i=1 to cout
       child(i-1).close  '循环寻找这个对象
    Next
    获取当前测试的路径
    Path = environment("TestDir")'获取当前测试的路径
    msgbox path
    获取本机ip
    set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
    ("select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

    for each IPConfig in IPConfigSet
    if Not IsNull(IPConfig.IPAddress) then
    for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    Msgbox IPConfig.IPAddress(i)
    next
    end if
    next
    点亮对象
    highlight
    fireEvent用法
    针对Link对象,onmouseover时间, 还有onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseout, onsubmit, onreset, onpropertychange事件可以使用
    sendkeys实例
    Set wshshell=createobject(“wscrīpt.shell”)
    其使用格式为:object.SendKeys string “object”:表示WshShell对象 “string”:表示要发送的按键指令字符串,需要放在英文双引号中。 1.基本键   一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“WshShell.SendKeys "happy"”。
    sendkeys实例
    2.特殊功能键 对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: Shift---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%" 由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“WshShell.SendKeys "{ENTER}"”表示,发送向下的方向键用“WshShell.SendKeys "{DOWN}"”表示。 Space---------WshShell.SendKeys " " Enter---------WshShell.SendKeys "{ENTER}" ←---------WshShell.SendKeys "{RIGHT}" ↑---------WshShell.SendKeys "{UP}" F1---------WshShell.SendKeys "{F1}" Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。

Open Toolbar