发布新日志

  • 运用childobjects获取桌面上的顶级对象!实现关闭特定browser的方法.

    2007-07-11 10:02:38

    Desktop对象允许访问桌面上的顶级对象.运用childobjects方法可以返回此对象中的所有对象列表:以下代码实现了,从桌面顶级对象中查找title=Mercury Tours的browser,然后将该browser的图像抓取出来存到特定的文件夹下.

    Set des=Descrīption.Create()
    set dobj=Desktop.ChildObjects(des)
    For i=0 to dobj.count-1
        If dobj(i).getroproperty("title")="Mercury Tours" then
                  dobj(i).captureBitmap "c:\result\"&i&".bmp",true
                   dobj(i).close
       End If
    Next

    '当用captureBitmap时,如果采用决对路径,如上例中,必须确保C盘中存在名为result的文件夹,抓图才能成功,QTP的capturebitmap方法不能实现自动创建文件夹的功能;如果只写出文件名,那么该抓图将显示在QTP运行时的result文件夹中.

  • 如何减少 QuickTest 使用的磁盘空间?

    2007-07-10 17:51:54

  • 如何减少 QuickTest 使用的磁盘空间?

可以通过执行下列任一操作减少 QuickTest 使用的磁盘空间:

    • 确定希望何时为测试结果捕获并保存应用程序图像。在“选项”对话框中的“运行”选项卡上,从“将步骤屏幕捕获内容保存到结果中”框中选择一个选项。可以通过保存屏幕捕获内容(仅在某些情况下),或根本不保存图像来减少磁盘空间和缩短测试运行时间。有关“选项”对话框中的“Active Screen”选项卡的详细信息,请参阅设置 Active Screen 选项
    • 确定是否需要在 Active Screen 中捕获和保存信息,以及捕获和保存多少信息。捕获的信息越多,越容易使用多种 Active Screen 选项向测试中添加步骤,但是更多的捕获信息还会导致录制速度变慢、编辑时间变长。可以从下列 Active Screen 选项中选择以提高性能:
      • 如果正在测试 Windows Applications,可以选择在每一步保存所有的 Active Screen 信息、只在某些步骤保存信息或完全禁用 Active Screen 捕获。可以在“选项”对话框中的“Active Screen”选项卡上设置该首选项。有关详细信息,请参阅设置 Active Screen 选项
      • 如果正在测试 Web 应用程序,则可以禁用 Active Screen 中所有步骤的屏幕捕获。在“Active Screen”选项卡上,单击“自定义级别”打开“自定义 Active Screen 捕获设置”对话框。选择“禁止 Active Screen 捕获”选项。这将缩短录制时间。有关“选项”对话框中的“Active Screen”选项卡的详细信息,请参阅设置 Active Screen 选项
      • 当保存一个新测试,或使用“另存为”用新名保存测试时,可以通过清除“保存”或“另存为”对话框中的“保存 Active Screen 文件”选项,选择不在测试中保存捕获的 Active Screen 文件。如果已经完成了测试设计并且计划将测试只用于测试运行时,该操作尤其有用。没有 Active Screen 文件的测试使用的磁盘空间明显更少。
      • 提示:保存无 Active Screen 文件的测试后,如果需要恢复 Active Screen 文件,请重新录制必要的步骤或使用“更新运行”选项为测试中的所有步骤重新捕获屏幕。有关详细信息,请参阅更新测试或组件

  • 在用VBScript编程时,何是使用括号?

    2007-07-10 16:29:37

    初学QTP的时候一直有一个疑惑不知道什么时候该加括号.什么时候不该加,今天看到这方面的东西,帖出来和大家分享!

    使用 VBscrīpt 编程时,遵循是否应在语句中使用括号 () 的规则是非常重要的。

    如果正在调用返回值的方法并且使用该返回值,则必须在方法参数两旁使用括号。例如,如果正在将值返回给变量、在 If 语句中使用方法或者使用 Call 关键字调用操作时,则应在方法参数两旁使用括号。如果要检索返回值,则还需要在检查点名称两旁添加括号。

    提示: 如果在测试中运行步骤时收到“语句应该结束”错误消息,则表示可能需要在步骤方法的参数两旁加上括号。

    以下几个示例显示何时使用或不使用括号。

    以下示例要求在方法参数两旁加上括号,因为该方法向变量返回值。

    Set WebEditObj = Browser("Mercury Tours").Page("Method of Payment").WebTable("FirstName").ChildItem (8, 2, "WebEdit", 0)

    WebEditObj.Set "Example"

    以下示例要求在方法参数两旁加上括号,因为正在使用 Call

    Call RunAction("BookFlight", oneIteration)

    以下示例要求在方法参数两旁加上括号,因为该方法用于 If 语句中。

    If Browser("index").Page("index").Link("All kind of").WaitProperty("attribute/readyState", "complete", 4) Then Browser("index").Page("index").Link("All kind of").Click

    以下示例要求在方法参数两旁加上括号,因为该方法返回检查点的值。

    a = Browser("MyBrowser").Page("MyPage").Check (checkPoint("MyProperty"))

    以下示例不要求在 Click 方法参数两旁加上括号,因为该方法不返回值。

    Browser("Mercury Tours").Page("Method of Payment").WebTable("FirstName").Click 3,4

  • 关于同步点waitproperty!

    2007-07-06 18:20:46

    在用QTP的过程中,常常因为某个控件刷新时间过长,我们会人为的加上wait()方法.该方法虽然可以起到我们想要的作用(让QTP)等待我们所需要的控件出现再往下继续执行,但缺点是.时间比较困定.往往wait里的时间参数,是我们根据经验估计出来的,即使该控件在我规定的时间内已经程现出来,QTP还是会等到wait中的时间到达后,才往下继续执行,浪费了很多时间.这个时候就会想到用waitproperty 方法.waitproperty的语法格式如下:

    Browser("Welcome: Mercury Tours").Page("Flight Confirmation: Mercury").WebElement("Flight Confirmation #").WaitProperty "visible", true, 10000

    在规定的时间段(10秒)内,QTP会不停的检测WebElement的visible属性是否为true.如果在10秒内QTP检测到visible==true那么,将立即往下执行,在这种情况下就比我们用wait指定一个固定的时间段效率要高的多.需要注意的是:如果在规定的时间(10秒)内未能检测到所需结果,该语句将返回一个false,但并不影响程序继续执行.

  • 测试服务器IP地址变更!

    2007-07-06 18:03:44

    由于各种原因,项目中经常出现测试服务器IP地址变更的情况,导致以前的检查点均无法通过.解决方法如下:

    首先在Test-->Record and Run Settings...-->在Address里输入新的URL,然后在Test-->Update Run...-->Update Options-->勾选Update test object descrīptions.

  • 内存不能读写问题的解决方案

    2007-07-06 09:37:23

    转载:

    问题

        运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭。

      “0x????????”指令引用的“0x????????”内存。该内存不能为“read”。

      “0x????????”指令引用的“0x????????”内存,该内存不能为“written”。

      一般出现这个现象有两方面的原因,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。

      故障分析

      硬件方面:

      一般来说,内存出现问题的可能性并不大,主要方面是:内存条坏了、内存质量有问题,还有就是2个不同牌子不同容量的内存混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。

      假如是双内存,而且是不同品牌的内存条混插或者买了二手内存时,出现这个问题,这时,就要检查是不是内存出问题了或者和其它硬件不兼容。

      软件方面:

      先简单说说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间,就会发生溢出现象。举个例子:一个桶子只能装一斤的水,当放入两斤的水进入时,就会溢出来。而系统则是在屏幕上表现出来。这个问题,经常出现在windows2000和XP系统上,Windows 2000/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似Windows 98里的非法操作,系统为保持稳定,就会出现上述情况。另外也可能是硬件设备之间的兼容性不好造成的。

      几个典型故障例子及解决办法

      例一:打开IE浏览器或者没过几分钟就会出现"0x70dcf39f"指令引用的"0x00000000"内存。该内存不能为“read”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。

      解决方法:修复或升级IE浏览器,同时打上补丁。看过其中一个修复方法是,Win2000自升级,也就是Win2000升级到Win2000,其实这种方法也就是把系统还原到系统初始的状态下。比如你的IE升级到了6.0,自升级后,会被IE5.0代替。

      例二:在windows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内存。该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。

      解决方法:这可能是系统的兼容性问题,WinXP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项

       例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。该内存不能为“read” 的提示。

      解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。

      例四:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“Ox060692f6”(每次变化)指令引用的“Oxff000011”内存不能为“read”,终止程序请按确定。

      解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。

      例五:双击一个游戏的快捷方式,“Ox77f5cdO”指令引用“Oxffffffff”内存,该内存不能为“read” ,并且提示Client.dat程序错误。

      解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。

      例六:一个朋友发信息过来,我的电脑便出现了错误信息:“0*772b548f”指令引用的“0*00303033”内存,该内存不能为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。

      解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。

      例七:我的笔记本电脑用的XP系统,有时关闭网页时会弹出tbrowser.exe遇到问题需要关闭,然后有弹出0x03e7c738指令引用的0x03e7c738内存,该内存不能为read,请问是怎么回事?

      解决方法:先查杀一下病毒,另外如果你安装了浏览增强之类的软件,请卸掉。

       例八:从桌面或开始菜单中打开任何一个程序, 出现错误提示:"0x........"指令引用的"0x00000000"内存,该内存不能为"read"。省略号代表可变值。而从运行中打开程序没问题。

      解决方法:运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks下,应该只有一个正常的键值"{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除(默认键值当然不要删除)。这一条很常见。

      例九:我三个月前配了台机子。系统比较不稳定,三个月内已经重装过多次系统,四五天前刚装过系统,可是经常随机地出现Explorer-应用程序错误,“0x4a01259d“指令引用的“0x00000000"内存。该内存不能为“read"。要终止程序,请单击“确定“。要调试程序,请单击“取消”。如果点确定,windows桌面就不见了。这种问题在之前的系统也出现过,不知道是不是硬件的问题?

      解决方法:内存的兼容性问题!遇到这类问题,用户可以自行打开机器把内存的位置调动一下,看问题是否可以解决,如果问题依旧,可与你的朋友调换内存使用。

      通过上面的几个例子,可以看到,出现故障的原因有好多种,下面列出已经提到和有可能发生的原因,方便查阅。

    问题产生原因

    解决方法

    内存条坏了

    更换内存条

    双内存不兼容

    使用同品牌的内存或只用一条内存

    内存质量问题

    更换内存条

    散热问题

    加强机箱内部的散热

    内存和主板没插好或和其它硬件不兼容等

    重插内存或换个插糟

    硬盘有问题

    更换硬盘

    驱动问题

    重装驱动。如果是新系统,要先安装主板驱动

    软件损坏

    重装软件

    软件有BUG

    打补丁或用最新的版本

    软件和系统不兼容

    给软件打上补丁或者试试系统的兼容模式

    软件和软件之间有冲突

    如果最近安装了什么新软件,卸载了试试

    软件要使用到其它相关的软件有问题

    重装相关软件。比如播放某一格式的文件时出错,可能是这个文件的解码器有问题

    病毒问题

    杀毒

    杀毒软件与系统或软件冲突

    由于杀毒软件是进入底层监控系统的,可能与一些软件冲突,卸载了试试

    系统本身有问题

    有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序,像SP的补丁,最好要打上。如果还不行重装系统或更换其它版本的系统了

     

  • 内存问题!

    2007-07-06 09:28:08

    转贴:内存问题主要有三种类型:内存泄露、内存碎片和内存崩溃。 1) 内存泄漏主要由于不断分配的内存无法及时被释放,久而久之,系统的内存耗尽。内存泄露问题一般隐藏很深,很难通过代码阅读来发现。有些内存泄露甚至可能出现在库中,可能是库中的bug,也可能是程序员对接口说明文档的错误理解。 2) 内存碎片比内存泄露隐藏还要深。随着内存的不断分配并释放,大块内存不断分解为小块内存,从而形成碎片,久而久之,当需要申请大块内存时,有可能就会失败。如果系统内存够大,那么坚持的时间会长一些,但最终还是逃不出分配失败的厄运。在使用动态分配的系统中,内存碎片经常发生。目前,解决这个问题最效的方法就是使用工具通过显示系统中内存的使用情况来发现谁是导致内存碎片的罪魁祸首,然后改进相应的部分。 3) 内存崩溃是内存使用最严重的结果,主要原因有数组访问越界、写已经释放的内存、指针计算错误、访问堆栈地址越界等等。这种内存崩溃造成系统故障是随机的,而且很难查找,目前提供用于排查的工具也很少。常见的内存不能读写等问题有软件故障,也有可能是硬件故障。
  • 直接从excel中读取数据.

    2007-07-05 21:59:29

    Set xlApp= CreateObject("Excel.Application")
    Set wkBook= xlApp.Workbooks.Open("C:\test.xls")
    Set wkSheet= wkBook.Worksheets("Sheet1")
    Parameter1=CStr(wkSheet.Cells(1, 1))
    Parameter2= CStr(wkSheet.Cells(1, 2))
    msgbox Parameter1
    msgbox  Parameter2
    msgbox CStr(wkSheet.Cells(2, 1))
    msgbox  CStr(wkSheet.Cells(2, 2))
  • 验证码.

    2007-07-05 21:06:34

    录制邮箱的注册流程时,需读出随机的附加码。自动化测试过程中遇到这个问题,应该和开发人员交流,了解随机的附加码的产生原理后在自动化脚本中可以随机控制。

    猜测:
    随机附加码功能为每次当用户注册的时候,程序中产生一个随机值,调用存储在服务器上的图片(附加码的图片),在前台显示出来。

    根据和开发人员了解到的:
    知道原理后,测试人员和开发人员交流有哪些图片在服务器上,只要知道图片都有哪些,就可以做到如下工作
    这里是某个网站的登陆需要添加附加码的网页源文件

    验证码:<!--验证码表单-->
    <input type="text" name="codestr" maxlength="4" size="4"> <img src="xxx.xxx">
    看到上边<img src=“调用的图片”>,你只要每次读取这个img src的值就可以,你可以根据和开发人员了解的图片顺序,写个函数--图片索引函数,通过读取的值你就知道那个图片对应的那个附加码

    然后直接处理就可以了,各个程序有自己的实现算法,需要你自己去寻找答案!

  • 通过日期控件录入日期的问题

    2007-07-05 17:43:40

    转载:通过日期控件选择日期,很多情况无法录入所选择的日期,导致回放失败,可以用下面的方法处理

    先把显示日期的文本框添加到对象库,假设是WebEdit类型的文本框sdate,对象整体路径:browser().page()...WebEdit("sdate")可做如下操作
    sd = browser().page()...WebEdit("sdate").object
    sd.value = "2007-01-03" 
    也可直接赋值 browser().page()...WebEdit("sdate").object.value = "2007-01-03",输入正确日期格式的日期,再回放时就能正确显示所设置的日期了

  • 什么是VBscrīpt呢?

    2007-07-05 17:35:19

    转载:VBscrīpt的全称是:Microsoft Visual Basic scrīpt Editon.(微软公司可视化BASIC脚本版). VBS(VBscrīpt的进一步简写)是基于Visual Basic的脚本语言,其不编译成二进制文件而是直接由宿主(host)解释源代码并执行简单点说就是你写的程序不需要编译成.exe, 而是直接给用户发送.vbs的源程序用户就能执行了.

    SendKeys 
    方法


    模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行, 
    其使用格式为:
    object.SendKeys(string) 

    “object”
    :表示WshShell对象
     
    “string”
    :表示要发送的按键指令字符串,需要放在英文双引号中。


    -----------------------------------
    1.
    基本键 

      一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用 WshShell.SendKeys "happy" 


    2.
    特殊功能键 

      对于需要与ShiftCtrlAlt三个控制键组合的按键,SendKeys使用特殊字符来表示:
     

      
    Shift---------WshShell.SendKeys "+" 
      
    Ctrl---------WshShell.SendKeys "^" 
      Alt---------WshShell.SendKeys "%"  (注意   这样使用时,不用大括号括起这些特殊字符。
    )
      由于“+”“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如要发送加号“+”,可使用
    “WshShell.SendKeys "{+}"” 

    另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。

    例如要发送回车键,需要用“ WshShell.SendKeys "{ENTER}" ”表示;
    发送向下的方向键用“ Wshell.SendKeys "{DOWN}" ”表示。 

    Space---------WshShell.SendKeys " " 
    Enter---------WshShell.SendKeys "{ENTER}" 
    ←---------WshShell.SendKeys "{RIGHT}" 
    ↑---------WshShell.SendKeys "{UP}" 
    F1---------WshShell.SendKeys "{F1}" 

    按键                代码
        
    BACKSPACE     {BACKSPACE}, {BS}, 
     {BKSP}    
    BREAK         {BREAK}    
    CAPS LOCK     {CAPSLOCK}    
    DEL or Delete {Delete} 
     {DEL}    
    DOWN ARROW    {DOWN}    
    END           {END}    
    ENTER         {ENTER}
     ~    
    ESC           {ESC}    
    HELP          {HELP}    
    HOME          {HOME}    
    INS or Insert {Insert} 
     {INS}    
    LEFT ARROW    {LEFT}    
    NUM LOCK      {NUMLOCK}    
    PAGE DOWN     {PGDN}    
    PAGE UP       {PGUP}    
    PRINT SCREEN  {PRTSC}    
    RIGHT ARROW   {RIGHT}    
    SCROLL LOCK   {SCROLLLOCK}    
    TAB           {TAB}    
    UP ARROW      {UP}    
    F1 {F1}    
    F2 {F2}    
    F3 {F3}    
    F4 {F4}    
    F5 {F5}    
    F6 {F6}    
    F7 {F7}    
    F8 {F8}    
    F9 {F9}    
    F10 {F10}

    Tips:
    如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。


    -----------------------------------
    按下F5刷新桌面 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "{F5}" 
    ---------------------------------------------------- 
    电脑的自动重启
     

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^{ESC}u" 
    WshShell.SendKeys "R" 
    ---------------------------------------------------- 
    启动任务管理器
     

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^+{ESC}" 
    ---------------------------------------------------- 
    QQ
    消息连发
     

    Dim WshShell 
    Set WshShell= Wscrīpt.createObject("Wscrīpt.Shell") 
    WshShell.AppActivate "bomb" 
    for i=1 to 60 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "What do you say" 
    WshShell.SendKeys i 
    WshShell.SendKeys "%s" 
    next 
    ---------------------------------------------------- 
    自动到百度搜索歌曲:
    white flag 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run("IEXPLORE.EXE") 
    Wscrīpt.Sleep 2000 
    WshShell.AppActivate "about:blank-Microsoft Internet Explorer" 
    WshShell.SendKeys "+{TAB}" 
    WshShell.SendKeys "
    http://mp3.baidu.com
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    Wscrīpt.Sleep 3000 
    WshShell.SendKeys "white flag" 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    ---------------------------------------------------- 
    自动关机

    Dim WshShell
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell")
    Wscrīpt.Sleep 2000
    WshShell.Run "shutdown -r -t 120"
    wscrīpt.sleep 6000
    WshShell.Run "shutdown -a"
    ---------------------------------------------------- 
    在记事本中输入Happy Birthday!并保存为birth.txt 

    Dim WshShell 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run "notepad" 
    Wscrīpt.Sleep 1500 
    WshShell.AppActivate "
    无标题 - 记事本

    WshShell.SendKeys "H" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys " " 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "B" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "d" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "!" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FS" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "b" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%S" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FX" 
    ---------------------------------------------------- 
    制作能自动定时存盘的记事本
     

    '
    第一部分:定义变量和对象
     

    Dim WshShell, AutoSaveTime, TXTFileName 
    AutoSaveTime=300000 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    TXTFileName=InputBox("
    请输入你要创建的文件名(不能用中文和纯数字)
    ") 

    '
    第二部分:打开并激活记事本
     

    WshShell.Run "notepad" 
    Wscrīpt.Sleep 200 
    WshShell.AppActivate "
    无标题 - 记事本


    '
    第三部分:用输入的文件名存盘
     

    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys TXTFileName 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys "%s" 
    Wscrīpt.Sleep AutoSaveTime 
    '
    第四部分:自动定时存盘
     
    While WshShell.AppActivate (TXTFileName)=True 
    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep AutoSaveTime 
    Wend 
    Wscrīpt.Quit 

    ---------------------------------------------------- 

    自动死机
    o(∩_∩)o...

    DIM WSHSHELL 
    SET WSHSHELL=Wscrīpt.CreateOBJECT("Wscrīpt.SHELL") 
    'WSHSHELL.RUN " " 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 

  • 测试用例设计如何避误

    2007-07-05 17:20:10

    转载:原文请参见:http://edu.yesky.com/483/3042983.shtml

    1、能发现到目前为止没有发现的缺陷的用例是好的用例:

      首先要申明,其实这句话是十分有道理的,但我发现很多人都曲解了这句话的原意,一心要设计出发现难于发现的缺陷而陷入盲目的片面中去,忘记了测试的目的所在,这是十分可怕的。我倾向于将测试用例当作一个集合来认识,对它的评价也只能对测试用例的集合来进行,测试本身是一种“V&V”的活动,测试需要保证以下两点:

      * 程序做了它应该做的事情

      * 程序没有做它不该做的事情

      因此,作为测试实施依据的测试用例,必须要能完整覆盖测试需求,而不应该针对单个的测试用例去评判好坏。

      2、测试用例应该详细记录所有的操作信息,使一个没有接触过系统的人员也能进行测试;

      不知道国内有没有公司真正做到这点,或者说,不知道有国内没有公司能够将每个测试用例都写得如此详细。在我的测试经历中,对测试用例描述的详细和复杂程度也曾有过很多的彷徨。写得太简单吧,除了自己没人能够执行,写得太详细吧,消耗在测试用例维护(别忘了,测试用例是动态的,一旦测试环境、需求、设计、实现发生了变化,测试用例都需要相应发生变化)上的时间实在是太惊人,在目前国内大部分软件公司的测试资源都不足的情况下,恐怕很难实现。但我偏偏就能遇到一些这样的老总或者是项目负责人,甚至是测试工程师本身,全然不顾实际的资源情况,一定要写出没有接触过系统的人员也能进行测试的用例。

      在讨论这个问题之前,我们可以先考虑一下测试的目的。测试的目的是尽可能发现程序中存在的缺陷,测试活动本身也可以被看作是一个Project,也需要在给定的资源条件下尽可能达成目标,根据我个人的经验,大部分的国内软件公司在测试方面配备的资源都是不足够的,因此我们必须在测试计划阶段明确测试的目标,一切围绕测试的目标进行。

      除了资源上的约束外,测试用例的详细程度也需要根据需要确定。如果测试用例的执行者、测试用例设计者、测试活动相关人对系统了解都很深刻,那测试用例就没有必要太详细了,文档的作用本来就在于沟通,只要能达到沟通的目的就OK

      在我担任测试经理的项目中,在测试计划阶段,一般给予测试设计30% - 40%左右的时间,测试设计工程师能够根据项目的需要自行确定用例的详细程度,在测试用例的评审阶段由参与评审的相关人对其把关。

      3、测试用例设计是一劳永逸的事情;

      这句话摆在这里,我想没有一个人会认可,但在实际情况中,却经常能发现这种想法的影子。我曾经参与过一个项目,软件需求和设计已经变更了多次,但测试用例却没有任何修改。导致的直接结果是新加入的测试工程师在执行测试用例时不知所措,间接的后果是测试用例成了废纸一堆,开发人员在多次被无效的缺陷报告打扰后,对测试人员不屑一顾。

      这个例子可能有些极端,但测试用例与需求和设计不同步的情况在实际开发过程中确是屡见不鲜的,测试用例文档是活的文档,这一点应该被测试工程师牢记。

      4、测试用例不应该包含实际的数据;

      测试用例是一组输入、执行条件、预期结果、毫无疑问地应该包括清晰的输入数据和预期输出,没有测试数据的用例最多只具有指导性的意义,不具有可执行性。当然,测试用例中包含输入数据会带来维护、与测试环境同步之类的问题,关于这一点,《Effective Software Test》一书中提供了详细的测试用例、测试数据的维护方法,可以参考。

      5、测试用例中不需要明显的验证手段;

      我见过很多测试工程师编写的测试用例中,预期输出仅描述为程序的可见行为,其实,预期结果的含义并不只是程序的可见行为。例如,对一个订货系统,输入订货数据,点击确定按钮后,系统提示订货成功,这样是不是一个完整的用例呢?是不是系统输出的订货成功就应该作为我们唯一的验证手段呢?显然不是。订货是否成功还需要查看相应的数据记录是否更新,因此,在这样的一个用例中,还应该包含对测试结果的显式的验证手段:在数据库中执行查询语句进行查询,看查询结果是否与预期的一致

     

  • ASP.NET的 Session 详解

    2007-07-04 11:19:52

     

    Session模型简介

    Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。 当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这 个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。

     

    这 个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览 器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个 用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用,我们会在后面提及到。

     

    除 了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序与来说,最有用的还是可以通过访问 ASP/ASP.NET的内置Session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能 访问到每个的页面中加入:

     

    <%

    If Session("PageViewed") = ""Then

     Session("PageViewed") = 1

    Else

     Session("PageViewed") = Session("PageViewed") + 1

    End If

    %>

    通过以下这句话可以让用户得知自己浏览了几个页面:

     

    <%

    Response.Write("You have viewed " & Session("PageViewed") & " pages")

    %>

     

    可 能有些有些读者会问:这个看似像是数组的Session(“..”)是哪里来的?需要我定义吗?实际上,这个Session对象是具有ASP解释能力的的 WWW服务器的内建对象。也就是说ASP的系统中已经给你定义好了这个对象,你只需要使用就行了。其中Session(“..”)中的..就好像变量名 称,Session(“..”)=$$中的$$就是变量的值了。你只需要写上句话,在这个用户的每个页面中都可以访问..变量中的值了。

     

    其实ASP一共内建了7个对象,有Session、Application、Cookie、Response、Request、Server等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象,只是叫法或者使用方法上不太一样。

     

    ASP Session的功能的缺陷

    目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASP Session有以下缺陷:

     

    进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

    Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的 WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办 呢?

    Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。

    鉴于ASP Session的以上缺陷,微软的设计者们在设计开发 ASP.NET Session时进行了相应的改进,完全克服了以上缺陷,使得ASP.NET Session成为了一个更加强大的功能。

    Web.config文件简介

    有的ASP.NET程序员说:Web.config文件?我从来没有听说过啊,可是我写的程序不是也能很正常的运转吗?是的,你说得没错,没有 Web.config文件程序是可以正常运行的。但是,如果你做了一个大型的网站,需要对整个网站做一些整体配置,例如整个网站的页面使用何种语言编写 的、网站的安全认证模式、Session信息存储方式等,这时你就需要使用Web.config文件了。虽然Web.config文件中的某些选项是可以 通过IIS配置的,但是如果在Web.config中也有相应的设置就会覆盖掉IIS中的配置。而且,Web.config文件的最大的便利之处就是可以 在ASP.NET页面中通过调用System.web名字空间访问Web.config中的设置。

     

    Web.config 有两种,分别是服务器配置文件和Web应用程序配置文件,他们都名为Web.config。在这个配置文件中会保存当前IIS服务器中网页的使用哪种语言 编写的、应用程序安全认证模式、Session信息存储方式的一系列信息。这些信息是使用XML语法保存的,如果想对其编辑,使用文本编辑器就行了。

     

    其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NET Framework 1.0中,服务器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。

    而Web 应用程序配置文件Web.config则保存在各个Web应用程序中。例如:当前网站的根目录\Inetpub\wwwroot,而当前的Web应用程序 为MyApplication,则Web应用程序根目录就应为:\Inetpub\wwwroot\MyApplication。如果你的网站有且只有一 个Web应用程序,一般说来应用程序的根目录就是\Inetpub\wwwroot。如果想添加一个Web应用程序,在IIS中添加一个具有应用程序起始 点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是,这样通过IIS添加Web应用程序是不会为你生成Web.config文 件的。如果想创建一个带有Web.config文件的Web应用程序,需要使用Visual Studio.NET,新建一个Web应用程序项目。

     

    Web应用程序的配置文件Web.config是可选的,可有可无。如果没有,每个Web应用程序会使用服务器的Web.config配置文件。如果有,则会覆盖服务器Web.config配置文件中相应的值。

     

    在ASP.NET中,Web.config修改保存后会自动立刻成效,不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。

     

    Web.config文件中的Session配置信息

    打开某个应用程序的配置文件Web.config后,我们会发现以下这段:

     

    <sessionState

    mode="InProc"

    stateConnectionString="tcpip=127.0.0.1:42424"

    sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

    cookieless="false"

    timeout="20"

    />

    这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的:

     

    <sessionState mode="Off|InProc|StateServer|SQLServer"

    cookieless="true|false"

    timeout="number of minutes"

    stateConnectionString="tcpip=server:port"

    sqlConnectionString="sql connection string"

    stateNetworkTimeout="number of seconds"

    />

     

     

    必须有的属性是

    属性 选项 描述

    mode 设置将Session信息存储到哪里

    Off 设置为不使用Session功能

    InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。

    StateServer 设置为将Session存储在独立的状态服务中。

    SQLServer 设置将Session存储在SQL Server中。

     

    可选的属性是:

     

    属性 选项 描述

    cookieless 设置客户端的Session信息存储到哪里

    ture 使用Cookieless模式

    false 使用Cookie模式,这是默认值。

    timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟

    stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。

    sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。

    stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

     

    ASP.NET中客户端Session状态的存储

    在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的 SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户 在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在 ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。

     

    ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:

     

    找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:

     

    <sessionState

    mode="InProc"

    stateConnectionString="tcpip=127.0.0.1:42424"

    sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

    cookieless="false"

    timeout="20"

    />

     

    这 段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储 了,而是将其通过URL存储。关闭当前的IE,打开一个新IE,重新访问刚才的Web应用程序,就会看到类似下面的样子:

     

     

    其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的Session ID。注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。

     

    ASP.NET中服务器端Session状态的存储

    准备工作

     

    为了您能更好的体验到实验现象,您可以建立一个叫做SessionState.aspx的页面,然后把以下这些代码添加到<body></body>中。

     

     

    <scrīptrunat="server">

    Sub Session_Add(sender As Object, e As EventArgs)

      Session("MySession") = text1.Value

      span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" & \

    Session("MySession").ToString() & "</font>"

    End Sub

     

    Sub CheckSession(sender As Object, eAs EventArgs)

      If (Session("MySession")Is Nothing) Then

      span1.InnerHtml = "NOTHING, SESSION DATA LOST!"

      Else

      span1.InnerHtml = "Your session contains: <font color=red>" & \

    Session("MySession").ToString() & "</font>"

    End If

    End Sub

    </scrīpt>

    <formrunat="server"id="Form2">

      <inputid="text1"type="text"runat="server"name="text1">

      <inputtype="submit"runat="server"OnServerClick="Session_Add"

      value="Add to Session State" id="Submit1"name="Submit1">

      <inputtype="submit"runat="server"OnServerClick="CheckSession"

      value="View Session State" id="Submit2"name="Submit2">

    </form>

    <hrsize="1">

    <fontsize="6"><spanid="span1"runat="server" /></font>

     

    这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。

     

    将服务器Session信息存储在进程中

    让我们来回到Web.config文件的刚才那段段落中:

     

    <sessionState

    mode="InProc"

    stateConnectionString="tcpip=127.0.0.1:42424"

    sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

    cookieless="false"

    timeout="20"

    />

    当mode的值是InProc时,说明服务器正在使用这种模式。

     

    这 种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最 大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储 Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。

     

    好 了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重 起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。(想当初使用NT4时,重新启动IIS 必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已 经丢失了。

     

    将服务器Session信息存储在进程外

    首先,让我们来打开管理工具->服务,找到名为:ASP.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器- >进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。

     

    然 后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开 SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查 看刚才的Session信息,发现没有丢失。

     

    实际上,这种将Session信息存储在进程外的方式不光指可以将信息存 储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在 stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为 192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=192.168.0.2: 42424"。当然,不要忘记在192.168.0.2的计算机中装上.NET Framework,并且启动ASP.NET State Services服务。

     

    将服务器Session信息存储在SQL Server中

    首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:

     

    [system drive]\winnt\Microsoft.NET\Framework\[version]\

    然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的 数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的 ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对 象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是 每分钟去ASPStateTempSessions表中删除过期的Session信息的。

     

    接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:

     

    sqlConnectionString="data source=localhost; Integrated Security=SSPI;"

    其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用 userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。

     

    同 样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQL Server中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储 在SQL Server中的,能干什么就看你的发挥了。

     

    总结

    通过这篇文章,你可以看到在Session的管理和维护上,ASP.NET比ASP有了很大的进步,我们可以更加随意的挑选适合的方法了。对于企业 级的应用来说,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好!

  • 用户菜单

    我的栏目

    我的存档

    数据统计

    RSS订阅

    Open Toolbar