发布新日志

  • 关于QTP中保存时提示General Error while saving the test的解决方法

    2008-09-07 21:27:09

    今天使用qtp的时候突然发现保存的时候提示General Error while saving the test,

    以前从来没有见过这个毛病。

    我到网上查了下, 发现了篇讲述了如何解决这个问题。

    如果是win2000,运行如下命令RegSvr32 C:\WINNT\SYSTEM32\scrrun.dll
    如果是xp则运行RegSvr32 C:\WINDOWS\system32\scrrun.dll
  • QTP基础代码[收藏]

    2008-09-07 13:11:06

    这两周我开始学习QTP测试我们的web服务了;大体的软件使用操作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscrīpt,所以想和大家交流一下代码等一些基础知识;呵呵,一起学习,加强记忆与应用。

            1 生产随机数列

            第一种方法

            randomize'更新反回的数据

            funcation rand(k,n)

            n="int((k-1)*rnd+1) rand=n

            end funcation

            第二种方法

            n="randomnumber.value(1,255)

            2  当运行到表中的某一行,自动导出表中的所有数据

            row=datatable.getcurrentrow

            if row="5" then

              datatable.export("d:\data.xml")

            end if

            3 参数化密码

            webedit("txtpass").setsecure"sdsdf...."

            如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set

            4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证

            if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现="false     error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")

               if error_message<>(datatable.value("error_info"))then

                     msgbox(error_message)

                  end if

                 browser("web_name").dialog("diaglog_name").close

              end if

            这里我总结了两点技巧:

              一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性

                 二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

            5  datatable.value("num")只在global形式下的一种省略形式;完整形式是:

            datatable.value("num",dtlocalsheet)

            -----向某一列的单元格赋值:


            datatable.value("column_name",dtlocalsheet)="nanjing"

            -----取得某一行具体值:

            datatable.setcurrentrow(n)

            msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)


            或者kk=datatable.Rawvalue("column_name","action1")

            ----在run-time时,动态添加表格与数据

            kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;

            7   wintreeview一些操作

            选择一个条目:wintreeview.select(item)'根是0

            根的名称:wintreeview.getitem(0)

            8   数据库检查点模块:

            sub database_check

            set con="createobject(""adodb.connection")

            con.open "Descrīption="IBM_ODBC;DRIVER=SQL" Server;SERVER="IBM;UID=sa;""&_

                             "PWD="123456;APP=Quick" Test Pro;WSID="IBM;DATABASE=IBM_table""

            'access方式:con.open "DRIVER="{Microsoft" Access Driver (*.mdb)};DBQ="d:\test.mdb""

            'Orocle方式:con.open "DRIVER="{Oracle" in OraHome92};SERVER="CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;

            EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BA

            M=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;""

            set record="createobject(""adodb.recordset")

            sql="select*from ibm_one_table"

            record.open sql,con

            DO

            if(record("ibm_table_column")="kai")then'//查找表格中有多少kai

            num=num+1;

            end if

            record.movenext

            loop until record.eof="true record.close

            set record="nothing con.close

            set con="nothing end sub

            9   换行符

            vbcr----chr(13)回车符// vblf----chr(10)换行符

                vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter

            10  Run from step有两种方式:

            在Keyword View模式会从本步骤运行到所有action结束

            在expert view模式仅会将本action运行结束

    11  由于对象属性原因,无法识别对象

            -----对于对象属性是变化的,可以参数化/或者用正则表达式

            -----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性

            -----有时可以删除对象的变化的属性来解决识别问题

            ------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别

              (index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生

              变化后,原先的所有对象index属性要发生变化,开始是0;如index:="0;         location:根据对象的位置进行确定,从上到下,从左到右;

              CreateTime:按照对象被浏览器打开的先后标识对象)

            ------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题

            12  对系统文件的操作

            -------从系统的文件中获取信息及删除文件

              get_file_infor("c:\she.mpg")

               function get_file_infor(url)

                dim fso,f

                set fso="createobject(""scrīpting.filesystemobject")

                set f="fso.getfile(url)"

                f.name:f.size:f.type:f.datacreated'///获取文件信息

                fso.deletefile(url)'/////删除文件

               end function

            --------获取文件夹里所有文件信息

            get_folder_infor("c:\kai")

            function get_folder_infor(folder)

            dim fso,f,f1,n

            set fso="createobject(""scrīpting,filesystemobject")

            set f="fso.getfolder(folder) set fc="f.files for each f1 in fc

            select case f1.name

            case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件

            end select

            next

            end function

            13   等待某个对象出现方法

            y="......waitproperty(""visible",true,10000)

            14   防程序中断方法

            On error resume next

            On error goto handle

            15  数组的应用:

            name="array(1,2,""aa","bb")

            name(2)="aa"

            16  正则表达式应用模板

            进行日期YYYY-MM-DD的格式检查 :

            Function RegExpTest(patrn, strng)

              Dim regEx, Match, Matches      ' Create variable.

              Set regEx = New RegExp         ' Create a regular expression.

              regEx.Pattern = patrn         ' Set pattern.

              regEx.IgnoreCase = True         ' Set case insensitivity.

              regEx.Global = True         ' Set global applicability.

              Set Matches = regEx.Execute(strng)   ' Execute search.

              For Each Match in Matches      ' Iterate Matches collection.

                RetStr = RetStr & "Match found at position "

                RetStr = RetStr & Match.FirstIndex & ". Match Value is '"

                RetStr = RetStr & Match.Value & "'." & vbCRLF

              Next

              RegExpTest = RetStr

            End Function

            date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"

            result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处

            Select case result_message

            Case ""

                     msgbox("你输入的日期格式与标准不匹配")

            case else  MsgBox(result_message)

            end select

     

    17   返回一个字符串在另一字符串中的位置

            instr(string1,string2)

            18   有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;

            举例说明1:

            比如:你录制一个选择磁盘中的文件动作

            会录制为:

            .winlistview("  ").drap 46,99

            .winlistview("  ").draponitem "she.mp3"

            下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;

            举例说明2:

            有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:

            “web对话框",而在2003上是”网页对话框"

            19 

       "is+*"类型function

            isarray'是否是数组

            isconnected'判断QTP是否连接到TD

            isdate'是否是合法的日期类型

            isempty'判断是否初始化

            isNull'判断是否为空值

            isNumeric'判断是否是数字型

            isobject'判断是否一个功能对象

            isready'判断设备是否准备就绪

            isRootFolder'是否是根目录

            20 Action之间的参数传递

            例如:在Action1中,有如下代码:

            out_str="This is out_string"

            RunAction "Action2",oneIteration,out_str

            在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,

            msgbox(parameter("out_str")),就能正确显示参数了 

            21 Wscrīpt.Shell的一些应用

            set WshShell ="CreateObject(""Wscrīpt.Shell")

            WshShell.SendKeys "{ENTER}"     '模拟键盘进行操作

            WshShell.AppActivate "Calculator"             '启动应用程序

            22 获取对象属性名称用法:

            GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;

            GetToproperty----从对象库中描述对象的属性,静态值

            GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法

            23 FireEvent的使用可以对一个对象进行更复杂的操作

            如:FireEvent("onfocus")   '使一个控件获取焦点

                 FireEvent("ondblclick")  '实现双击/也可以在事件设定中针对该对象事件响应  

            24 模板的应用

            -----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,

             并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;

            例如:

            '-------------------脚本说明---------------

            '产品版本:      __Build(  )

            '测试员:

            '编写日期:

            '测试功能:

            '脚本类型:

            '被测试对象初始状态:

            '进展程度:

            '基本思路:

            '主要功能函数:

            '历史修改:

            '没解决的问题:

            '--------------------脚本内容-------------

            25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;

            在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变

            index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象

            删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;

    26 childobject的应用

            childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;

            返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时

            可以进行运用

            如:Set m_WinCheck="Descrīption.Create()       m_WinCheck("nativeclass").Value="Button"

                  set All_WinCheck="Window(""").Dialog("").Childobject(m_WinCheck)

                  n="All_WinCheck.Count()      for i="0" to n-1

                  All_WinCheck(i).Set "ON"

                 next

  • 软件测试中容易忽略的缺陷<转>

    2008-09-06 22:27:29

    摘要
        在系统测试和确认测试中,有些缺陷由于某些原因往往被忽略了,这就给软件留下了隐患或者危机。本文通过描述这些容易忽略的缺陷,提供一个完善测试用例和测试执行的参考。
    关键词:缺陷
    正文:
        通常软件测试会暴露软件中的缺陷,经过修正后可以保证软件系统的功能满足需求并正确运行。但是,在系统测试和确认测试中,测试人员容易遗漏一些隐藏的缺陷。众所周知,软件测试不可能发现所有的缺陷,而软件开发周期各个阶段仍然存在注入缺陷的可能,但是,有一些缺陷是测试中容易忽略的,也就是说,通过测试方法和用例可以充分暴露这些缺陷,遗憾的是,它们往往被忽略或者某种原因忘记测试了,这就给软件留下了隐患或者危机。这些容易被忽略的缺陷包括:
    1、安装缺陷
        通常项目组完成代码后,发布时候安装打包是最后一个环节,而测试人员通常在测试的时候,没有仔细的测试这一部分,而把用例集中在其他功能上。安装时候的缺陷通常通过拷贝而不是运行安装程序方式给测试人员安装软件,结果正式安装时候出现问题,引起例如控件没有注册,注册表没有导入等。删除时候没有注意安装文件夹是否存在用户文件,成数据丢失;使用绝对路径;安装顺序没有说明书
    2、配置文件
        有些文件在 ini 等配置文件中写出了管理员口令密码等信息,而且是明文的!这是一个安全隐患。另外,有些安装文件的 XML 文件,为了方便在数据库和中间层连接文件中写入了Admin 口令和密码。作为一个合格的测试人员,必须检查这些可以用记事本打开的文件。因为,一个稍有常识而且喜欢探索的用户,可能从中获取信息而成为不自觉的黑客。所以,配置文件可能成为软件安全方面的一个缺陷。
    3、网页安全缺陷
        现在网站开发已经注意到:登陆网站进入其内部网页后,直接拷贝网址,然后粘贴到另IE 窗口输入,可以绕过登陆直接访问。也许商业网站很关注这个问题,但是很多行业软件却很容易忽略。
        网页安全缺陷还可能存在于 IE 弹出的子窗口。有些设计不严格的软件,在主页面关闭的时候子页面还可以运行,这是一个明显的漏洞,而且还大大增加了错误发生的几率。
    4、判断顺序/逻辑缺陷
        对界面进行多个输入判断的时候,非常容易出现这种问题。例如判断年月顺序,判断长度,判断非空等。假如操作员仅仅满足单个条件,保存不能成功;而按界面从上之下顺序一一满足条件之后,保存是没有问题的。但是,改变一下输入的次序,校验失效。例如,一一满足条件之后,不保存,倒过来将上面的输入改成非法输入,然后保存,结果居然也能成功,这是因为原先的判断由于发生过,或者根据语句顺序只检查最后一个判断,所以没有报错。这种错误尤其在 Java scrīpt 脚本的页面中要注意。能够保存不能保证数据正确,有可能引起系统崩溃或者后续数据错误。所以,在测试的时候,不要按照正常的顺序输入,而是要打乱步骤,看看代码是否强健,是否在判断逻辑上没有错误。良好的代码应该经得起折腾,至少保存时会再此全部进行判断,而不只是简简单单走到判断的最后一行。
    5、调试语句和冗余信息
       维护项目和升级改造的推广系统最容易潜伏这类缺陷。典型表现在没有删除或者屏蔽调试语句。弹出一个界面不友好的提示信息,会使不明真相的用户产生误以为系统发生了严重故障,从而引起对软件的不信任感。页面中某个角落存在当前客户不需要的冗余按钮和功能也是一种缺陷。多余的功能会使用户以为是额外附加部分而去使用,其结果可想而知;而多余的按钮会误导好奇心强的用户操作,产生不必要的错误。
        同样值得关注的还有参数设置,由于没有实际数据,开发人员在调试或者单元测试的时候,习惯性的进行自我设定而忘了删除,测试人员可能会忽略掉了这部分测试,也可能导致在客户现场发生错误而影响系统发布和验收。
    6、不可重现的故障
        新参加测试的人员或者新来的开发人员总是要问,不可重现的缺陷是否需要记录,有必要吗?回答是肯定的。测试必须如实的记录发生的问题,也许不能重现,或者使非软件系统本身问题,但是,可能这些偶然性背后是有规律的,不记录这些,就不可能发现这些规律。
    7、多节点的逆向流转缺陷
        当前软件不少喜欢使用工作流来驱动。工作流的问题,就是可能出现多个流向分支。测试容易忽略的部分,就是工作流多节点的逆向流转。例如,通过不通过涉及两个分支,但是流程逆转的时候,有可能不是回到上一节点而是平级的另一个节点去了。测试要格外注意这类用例的设计。另外,有些时候默认分支在向前的时候是有默认值的,例如默认通过,那么保存的时候要提示用户是否通过,否则可能由于操作疲劳而走错了节点,引起回退。
    8、输入框缺陷
        试过往输入框粘贴数据而不是直接输入吗?可能这里会出现问题。按 Ctrl+V 的时候,输入框会根据长度大小自动截断输入长度。但是用鼠标,截断可能会失效。有一次测试人员就是用这种方法把一篇 Word 文档输入进去了,保存的时候,数据库崩溃。有些网站登陆的口令****可以拷贝下来的,只要放在剪贴板里面马上明文显示
        输入框可以说是问题最多的部分,能够引起的麻烦也很多。日期、数字、文本等等,都需要耐心的测试一下。
    9、界面布局缺陷
       曾经有一次,项目经理回来向测试部反映一个问题,客户对界面不满意。原因很简单,因为界面上删除按钮和保存按钮挨得很近。结果有些操作不熟练的业务人员,很容易误按。这个问题是测试人员没有意料到的,因此注意关闭、删除、退出按钮与保存、下一步等按钮的距离。类似的按钮应按此规则排列分布
        界面布局还可能发生在窗口最大化和最小化上,有可能窗口缩小的时候没有下拉框或不匹配分辨率,对用户来讲,这个错误实在很低级。有些用户由于操作习惯,非常不喜欢腾出手使用鼠标,尤其是大量输入的界面,因此,要注意设置键盘的快捷方式。还有,按 Tab定位到下一焦点时要注意顺序,避免跳转太灵活而让操作人员感到无从适应,在界面进行维护或者修改的时候,不要忘了测试开发人员是否无意改变了这些快捷方式和跳转顺序。
    10、版本和补丁包的环境问题
        理论上讲,这属于兼容性测试应该覆盖的问题。有些客户很喜欢更新最新的软件版本或者微软时不时打些补丁包,问题就出现了。有时候升级不一定是好事。这些问题最好在测试的时候增加几个用例,多用不同软件版本的机器跑一跑。测试有个定律是:你没跑过的地方,就一定会出事。经常听到开发人员抱怨,怎么我的机器没问题,你的机器就有事了呢?这不能完全靠配置管理员解决问题,环境配置项是大家最容易忽略的。
    11、用户管理缺陷
        用户管理的角色和授权需要好好研究一下,作过测试的人员都知道,有时候为了测试的方便,测试用户都是具有超级权限的用户。而且,比较容易忽略用户管理这一部分的测试。往往发往客户的时候,很多测试用户都没有删除。
        另外,有些接口的用户和口令,到软件使用寿命结束都没有更改过在一次测试中,测试人员发现,给一个用户授超级用户权限,之后更改这个用户为受限权限。使用中发现,用户居然没有真正回收权限,用户管理界面上没有任何不对。及早准备用户管理用例,不要等到测试快结束时候才想起。
    12、常识缺陷
        从逻辑或者统计学上讲,计算机是允许如此处理的,但是从常识上来讲,这些情况不可能发生。例如电话号码不可能出现小数点,终止时间不能大于开始时间等等。除此之外,常识还要结合业务特点来进行判断,因此,开发和测试人员要格外注意对自己知识的培养以及增加对需求细节的了解。不能因为一味追求进度而采用最简单的代码来实现,对用户来说,这些错误可能是很荒谬的。
        尽管我们不可能完美的测试一个软件,但是我们仍然可以改进我们的测试。每次测试结束,及时总结
  • web界面测试

    2008-09-06 00:15:55

    输入框校验

    1.字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度。(256)

    2.字符类型检查: 校验输入数据类型(文本,数字)

    3.空格检查:在输入信息项中,输入一个或连串空格,查看系统如何处理。如对于要求输入整型、符点型变量的项中,输入空格,既不是空值,又不是标准输入。

    4.输入法半角全角检查:在输入信息项中,输入半角或全角的信息,查看系统如何处理。如对于要求输入符点型数据的项中,输入全角的小数点(“。”或“.”,如4.5);输入全角的空格等。

    5.特殊字符检查:输入特殊符号,如@、#、$、%、!等,看系统处理是否正确。常见的错误是出现在% ‘ \ 这几个特殊字符.输入特殊字符集,例如,NUL及\n等;

    6.标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键。常见的错误是系统对空格的处理.

    7.检查信息的完整性: 在查看信息和更新信息时,查看所填写的信息是不是全部更新,更新信息和添加信息是否一致。

    8.必填项检查:如在必填项前加“*”;可否不填或者输入空格

    9.检查修改重名:修改时把名字应该唯一的信息输入重复的名字或ID,看会否处理,报错.同时,也要注意,会不会报和自己重名的错.(员工代码,HR代码)-----唯一性约束ORA-00001(有空格没空格)

    10.时间日期检查:时间、日期验证是每个系统都必须的,如2006-2-31、2006-6-31等错误日期,同时,对于管理、财务类系统,每年的1月与前一年的12月(同理,每年的第1季度与前一年的第4季度)。另外,对于日期、时间格式的验证,如2006年2月28日、2006-2-28、20060228等。

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

    按扭

    11.检查按钮的功能是否正确:如新建编辑删除关闭返回保存导入上一页下一页页面跳转,重置等功能是否正确。常见的错误会出现在重置按钮上,表现为功能失效。

    12.重复提交表单:一条已经成功提交的纪录,返回后再提交,看看系统是否做了处理。对于Web系统来说,可以通过浏览器返回键或者系统提供的返回功能。

    13.上传下载文件检查:上传下载文件的功能是否实现,上传下载的文件是否有格式、大小要求、是否屏蔽exe.bat.

    14.回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错。这个地方很有可能会出现错误。

    15.刷新键检查:在Web系统中,使用浏览器的刷新键,看系统处理如何,会否报错。

    16.回退键检查:在Web系统中,使用浏览器的回退键,看系统处理如何,会否报错。对于需要用户验证的系统,在退出登录后,使用回退键,看系统处理如何;多次使用回退键,多次使用前进键,看系统如何处理。

    17.直接URL链接检查:在Web系统中,直接输入各功能页面的URL地址,看系统如何处理,对于需要用户验证的系统更为重要。如果系统安全性设计的不好,直接输入各功能页面的URL地址,很有可能会正常打开页面。

     

     

Open Toolbar