没有什么不可以,只要你相信,只要你愿意去实现!

发布新日志

  • 特殊的用法忘记,我特此整理了一下SQL语句操作。(转)

    xingxing0205 发布于 2010-06-10 16:50:17

    一、基础

    1、说明:创建数据库
    CREATE DATABASE database-name
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only
    5、说明:删除新表
    drop table tabname
    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)
    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
    B: EXCEPT 运算符
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。
    12、说明:使用外连接
    A、left outer join:
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    二、提升

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form. table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1

    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    三、技巧

    1、1=1,1=2的使用,在SQL语句组合时用的较多

    “where 1=1” 是表示选择全部   “where 1=2”全部不选,
    如:
    if @strWhere !=''
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
    end
    else
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
    end

    我们可以直接写成
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere

    2、收缩数据库
    --重建索引
    DBCC REINDEX
    DBCC INDEXDEFRAG
    --收缩数据和日志
    DBCC SHRINKDB
    DBCC SHRINKFILE

    3、压缩数据库
    dbcc shrinkdatabase(dbname)

    4、转移数据库给新用户以已存在用户权限
    exec sp_change_users_login 'update_one','newname','oldname'
    go

    5、检查备份集
    RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

    6、修复数据库
    ALTER DATABASE [dvbbs] SET SINGLE_USER
    GO
    DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
    GO
    ALTER DATABASE [dvbbs] SET MULTI_USER
    GO

    7、日志清除
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
           @MaxMinutes INT,
           @NewSize INT

    USE     tablename             -- 要操作的数据库名
    SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名
    @MaxMinutes = 10,               -- Limit on time allowed to wrap log.
           @NewSize = 1                  -- 你想设定的日志文件的大小(M)

    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size
     FROM sysfiles
     WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' +
           CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
           CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
     FROM sysfiles
     WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
     (DummyColumn char (8000) not null)

    DECLARE @Counter   INT,
           @StartTime DATETIME,
           @TruncLog  VARCHAR(255)
    SELECT  @StartTime = GETDATE(),
           @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
         AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
         AND (@OriginalSize * 8 /1024) > @NewSize  
     BEGIN -- Outer loop.
       SELECT @Counter = 0
       WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
         BEGIN -- update
           INSERT DummyTrans VALUES ('Fill Log')  
           DELETE DummyTrans
           SELECT @Counter = @Counter + 1
         END  
       EXEC (@TruncLog)  
     END  
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
           CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
           CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
     FROM sysfiles
     WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF

    8、说明:更改某个表
    exec sp_changeobjectowner 'tablename','dbo'

    9、存储更改全部表

    CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
    @OldOwner as NVARCHAR(128),
    @NewOwner as NVARCHAR(128)
    AS

    DECLARE @Name   as NVARCHAR(128)
    DECLARE @Owner  as NVARCHAR(128)
    DECLARE @OwnerName  as NVARCHAR(128)

    DECLARE curObject CURSOR FOR
    select 'Name'   = name,
     'Owner'   = user_name(uid)
    from sysobjects
    where user_name(uid)=@OldOwner
    order by name

    OPEN  curObject
    FETCH NEXT FROM curObject INTO @Name, @Owner
    WHILE(@@FETCH_STATUS=0)
    BEGIN    
    if @Owner=@OldOwner
    begin
     set @OwnerName = @OldOwner + '.' + rtrim(@Name)
     exec sp_changeobjectowner @OwnerName, @NewOwner
    end
    -- select @name,@NewOwner,@OldOwner

    FETCH NEXT FROM curObject INTO @Name, @Owner
    END

    close curObject
    deallocate curObject
    GO

    10、SQL SERVER中直接循环写入数据
    declare @i int
    set @i=1
    while @i<30
    begin
      insert into test (userid) values(@i)
      set @i=@i+1
    end

    小记存储过程中经常用到的本周,本月,本年函数
    Dateadd(wk,datediff(wk,0,getdate()),-1)
    Dateadd(wk,datediff(wk,0,getdate()),6)

    Dateadd(mm,datediff(mm,0,getdate()),0)
    Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0))

    Dateadd(yy,datediff(yy,0,getdate()),0)
    Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

    上面的SQL代码只是一个时间段
    Dateadd(wk,datediff(wk,0,getdate()),-1)
    Dateadd(wk,datediff(wk,0,getdate()),6)
    就是表示本周时间段.
    下面的SQL的条件部分,就是查询时间段在本周范围内的:
    Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6)
    而在存储过程中
    select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1)
    select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)

  • QTP数据库检查和WEB表格数据检查

    Mr.chenzx 发布于 2008-10-25 15:46:33

    一、前提

    使用QTP测试数据输入是否成功。

    在本例中使用三个办法:1、检查页面显示的记录条数;2、根据关键字检查数据库中数据;3、检查页面显示的最后一行数据是否为新增的数据。

    二、方法及过程

    1、录制正常数据录入并保存过程的脚本

    2、在数据保存完,数据列表显示出来后进行检查,定义文本检查、数据库检查(内容见脚本中的说明)

    3、修改脚本,实现数据库数据按数据表关键字检查

    如输入编号为001的学生,检查是否存入了数据库,并使用脚本依次取得数据表的关键字进行数据库检查。

    4、当数据库数据保存成功时,检查数据是否正常显示

    三、测试脚本


    '开始录入新增数据,所需要录入的数据存放在数据表中,循环执行测试,输入多组数据

    Browser("学生信息管理系统").Page("学生资料列表首页").Link("新增").Click


    Browser("学生信息管理系统").Page("新增学生资料页面").WebEdit("studID").Set DataTable("stu_ID", dtLocalSheet)
    Browser("学生信息管理系统").Page("新增学生资料页面").WebEdit("studName").Set DataTable("stu_name", dtLocalSheet)
    Browser("学生信息管理系统").Page("新增学生资料页面").WebEdit("age").Set DataTable("stu_age", dtLocalSheet)

    Browser("学生信息管理系统").Page("新增学生资料页面").WebButton("保  存").Click

    '保存后即回到列表显示页面

    Browser("学生信息管理系统").Refresh    '保证新录入数据后显示出来,正常情况下,不需要该刷新显示的操作

    '检查页面显示的记录数是否新增,根据页面下端显示的记录数进行文本检查,正确数据存放在数据表中
    Browser("学生信息管理系统").Page("学生资料列表最后一页").Check CheckPoint("8")

    rem 检查数据库检索结果是否与输入的数据一致

    Browser("学生信息管理系统").Page("学生资料列表首页").Link("最后一页").Click


    ' 根据数据表的数据,设置数据库检索参数
    Dim sql
    ' 取得数据库检查点的SQL语句
    sql = DbTable("DbTable").GetTOProperty ("Source")
    Dim e_w
    ' 取得SQL语句中条件的位置
    e_w = inStr(sql,"=")
    '    使用DataTable("stu_ID", dtLocalSheet)取得当前参数表中的关键字,使用该关键字在数据库中检索数据
    sql = mid(sql,1,e_w ) + "'" + DataTable("stu_ID", dtLocalSheet) + "')"
    DbTable("DbTable").SetTOProperty "Source", sql

    '  可以使用msgbox sql查看SQL语句是否正确

    Dim row
    Dim stu_id,stu_name


    '数据库检查点建立时,以任意关键字检索一行需要检查的数据,本例检查编号和姓名
    If  DbTable("DbTable").Check (CheckPoint("DbTable_5")) Then    '如果从数据库检索的数据和数据表的数据一致

     '从表对象(设计此程序前,手工从页面获取该WEB表对象)的最后一页取得最后一行的编号和姓名
     row = Browser("学生信息管理系统").Page("学生资料列表最后一页").WebTable("学生资料").RowCount
     stu_id =  Browser("学生信息管理系统").Page("学生资料列表最后一页").WebTable("学生资料").GetCellData(row,3)
     stu_name = Browser("学生信息管理系统").Page("学生资料列表最后一页").WebTable("学生资料").GetCellData(row,4)
     
     '将取得的表对象的编号和姓名与数据表中的数据进行比较
     
     If stu_id =  DataTable("stu_ID", dtLocalSheet) and stu_name =  DataTable("stu_name", dtLocalSheet) Then
      Else
                reporter.ReportEvent 1,"新增学生信息错误","信息存入数据库,但数据没有在保存后立即显示,数据编号:"+  DataTable("stu_ID", dtLocalSheet)
     End If
     Else
      reporter.ReportEvent 1,"新增学生信息错误","信息没有存入数据库,可能是关键字重复或其他问题,数据编号:"+  DataTable("stu_ID", dtLocalSheet)
    End If

    Browser("学生信息管理系统").Page("学生资料列表最后一页").Sync

  • 右键菜单操作自动测试

    Mr.chenzx 发布于 2008-11-13 13:35:54

    示例一:

    rem 在一个页面的某链接上按右键
    Browser("Google").Page("qwewqe - Google 搜索").Link("qwewqe 的博客空间联城网[免费发布信息][分类信息,信").Click micRightBtn

    Dim wshShell
          Set wshShell = CreateObject("Wscrīpt.Shell")
    '模拟键盘操作,向下移动两次
    For i=1 to 2
    wshShell.SendKeys "{DOWN}"   '模拟键盘操作
     Next
     '模拟键盘操作,按回车键,完成在新窗口中打开链接
       wshShell.SendKeys "{ENTER}" 


    示例二:

    rem  在Word中复制粘贴一段文字的右键操作
    '选择需要复制的原文字,Drop后面的内容定义了文字块的坐标
    Window("Microsoft Word").WinObject("Microsoft Word 文档").Drag 510,180
    Window("Microsoft Word").WinObject("Microsoft Word 文档").Drop 645,178
    '按右键
    Window("Microsoft Word").WinObject("Microsoft Word 文档").Click 576, 182, micRightBtn

    Dim wshShell
          Set wshShell = CreateObject("Wscrīpt.Shell")
    '模拟键盘操作,向下移动两次
    For i=1 to 2
    wshShell.SendKeys "{DOWN}"   '模拟键盘操作
     Next
     '模拟键盘操作,按回车键,完成复制操作
    wshShell.SendKeys "{ENTER}"   '模拟键盘操作


    '在需要粘贴的位置按右键
    Window("Microsoft Word").WinObject("Microsoft Word 文档").Click 393, 564, micRightBtn
    '模拟键盘操作,在右键菜单上向下移动三次,按回车键,完成粘贴操作
    For i=1 to 3
    wshShell.SendKeys "{DOWN}"   '模拟键盘操作
     Next
    wshShell.SendKeys "{ENTER}"   '模拟键盘操作
  • 数组在QTP脚本中的应用,以及QTP手动添加检查点(一)

    endsn 发布于 2008-12-18 21:51:42

    ''''''''''''××××××数组在QTP脚本中的应用,以及QTP手动添加检查点(一)××××××××
    '这里设计的用例是为了检测报错信息是否正确。而不是验证登录功能是否正确:p   
    '文章目的:
    '1 对QTP中数组应用做初步认识。
    '2 对手工检查点的创建做初步了解。
    '文章中用到的软件:
    'QTP自带售票系统
    Dim shuzu(4,2),i
    ''定义一个数组,数组的第一个值由用例数量决定,这里的4代表5个用例,数组是从0开始计算的,数组的第二''个数由输入的条件以及预计结果构成。
    ''这里是登录为例子我们需要输入用户名,密码,并得到一个预期的结果。我们有至少5种组合——
    ''用户名正确,密码错误。相关报错信息。
    ''用户名错误,密码正确。相关报错信息。
    ''用户名为空,密码正确。相关报错信息。
    ''用户名正确,密码为空。相关报错信息。
    ''用户名为空,密码为空。相关报错信息。
    ''那么我们至少有5个类似于上面的用例。
    shuzu(0,0)="admin"
    shuzu(0,1)="testpsd"
    shuzu(0,2)="Incorrect password. Please try again"

    shuzu(1,0)="asd"
    shuzu(1,1)="mercury"
    shuzu(1,2)="Agent name must be at least 4 characters long."

    shuzu(2,0)=""
    shuzu(2,1)="mercury"
    shuzu(2,2)="Please enter agent name"

    shuzu(3,0)="admin"
    shuzu(3,1)=""
    shuzu(3,2)="Please enter password"

    shuzu(4,0)=""
    shuzu(4,1)=""
    shuzu(4,2)="Please enter agent name"


    ''数组定义以后,我们该如何用数组呢?,我们在下面的脚本里可以看到用户名和密码的输入情况。QTP录制下''来的只是其中的一种情况,那么我们需要把我们设计的值带进数组中,
    ''使数组成为我们的变量。
    'Dialog("Login").WinEdit("Agent Name:").Set "admin"
    'Dialog("Login").WinEdit("Password:").SetSecure '"4937d9c2197caa5bdca7fc5915687fffbdbd5d12"
    'Dialog("Login").WinButton("OK").Click
    'Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
    ''修改上面的代码 ,其中的用户名admin 是我们数组中的第一个元素 也就是(0,0)(1,0)(2,0)(3,0)(4,0)
    ''我们可以看出来数组的第二个元素是相对不会发生变化的,那么我们只需要给发生变化的部分定义一个变量就可以实现用户名按照我们需要的来更换。
    ''这是我们到代码的开始部分 定义一个变量 i ,因为用例之间元素的位置是相同,所以变量 i ,可以重复的用,
    ''我们现在把密码变成 shuzu(i,1)
    '
    'Dialog("Login").WinEdit("Agent Name:").Set shuzu(i,0)
    'Dialog("Login").WinEdit("Password:").SetSecure shuzu(i,1)
    'Dialog("Login").WinButton("OK").Click
    'Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
    '
    ''现在对于我们来说,用户名和密码不再是单纯的一个定值了,他可以实现按照我们规定的内容来回改变并且回''放。
    ''可是 看上去是不是少了什么。。。??没错那就是循环!我们有了数组,但是没有循环的话,程序是不知道我们需要如何运行脚本。
    ''那么我们开始给代码加入循环,
    ''QTP中加入循环可以直接写for 语句 也可以通过 Insert 标签选择for 语句来添加。由于俺是比较懒d 所''以还是选择 insert 标签好了。
    ''操作步骤————Insert—— loop statement——for...next
    ''插入for语句 之后 做一些说明,刚插入的语句格式是这样的——
    ''For Iterator = 1 To 1 Step 1
    ''next
    ''其中   Iterator 就是我们定义的变量 ,第一个数字1 就是我们变量的 起始数值。因为我们在这里是给''数组的第一个元素 定义变量所以我们从 0这个数字开始以4 这个数字结束。
    ''setp 的意思是“步进”,例如我们定义的起始数值是0 ,setp 是1 ,那么在运行完第一次之后就会运行''0+1,也就是我们的第二个用例,
    ''如果我们是setp2 那么就会运行第0+2,也就是第三个个用例。
    ''还有一定要注意的就是next 一定要放在循环体的最后面,以它结尾,不然我们的循环体会出现问题。
    ''现在我们将代码改成下面这样 ,再来运行试试看
    'For i = 0 To 4 Step 1
    '
    'Dialog("Login").WinEdit("Agent Name:").Set shuzu(i,0)
    'Dialog("Login").WinEdit("Password:").SetSecure shuzu(i,1)
    'Dialog("Login").WinButton("OK").Click
    'Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
    '
    'Next
    ''运行完毕之后是不是感觉很有成就感?
    ''因为脚本确实如我们所愿的运行了4次,但是问题又来了。。。。
    ''我们要比较的结果呢?什么是对的呢?什么是错的呢?我们的第三个元素还没用呢!?
    ''呵呵 不着急 我们马上把第三个元素用起来!
    ''那就是————手工插入检查点!

    ''分析我们的业务,来确定检查点插入的位置
    ''我们的提示信息是在什么时候出现的?是在我们输入完用户名,密码并且点击确定之后才会出现。
    ''那么ok我们检查点的位置确定了,就是在点击确定之后。语句中就是 ''Dialog("Login").WinButton("OK").Click 这一句的后面。
    ''现在开始做。
    ''第一步打开我们的飞机订票系统登录界面,随便输入用户名,不填写密码,使其弹出错误对话框。
    ''第二部点击Object  Repository——Add Objects to local 获取检查点的对象,并添加到对象库。
    ''要注意被获取的对象必须是最小化QTP后就能看到的对象。小窍门,添加之前可以用alt+tab 来确定一'''''下,如果下一个移动到的目标就是被测目标那么就ok了
    ''在获取后我们可以看到很详细的信息,接下来我们需要开始手动写入检查点
    '
    'For i = 0 To 4 Step 1
    '
    'Dialog("Login").WinEdit("Agent Name:").Set shuzu(i,0)
    'Dialog("Login").WinEdit("Password:").SetSecure shuzu(i,1)
    'Dialog("Login").WinButton("OK").Click
    '
    'dialog("Login").Dialog("Flight Reservations").Static("Please enter ''password").GetROProperty("text")'抓取对象后直接输入dialog加"("就会自动出现后面的内容
    '
    '
    'Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
    '
    'Next

    '现在我们可以看到又多了一行代码,这行代码的意思和意义是什么呢?
    '我们来看代码的组成
    'dialog("Login").Dialog("Flight Reservations").Static("Please enter 'password").GetROProperty("text")
    '现在打开OR,来查看一下我们刚才截取的对象
    '仔细查看TO里的目录结构,会发现抓取的内容所在的树状目录是这样的
    ''login——flight reservation——please enter password
    '对照代码我们很快就明白了原来引号的部分就是我们的目录顺序。那dialog和static又是什么呢?
    '我们再次打开or,这是默认的是选中第一行信息,这里来说选中的是login。
    '注意右侧的 Class,是不是与我们代码中的一致呢?!嘿嘿 肯定是一样的啦。
    '把上面的代码可以“翻译”成这样 ——————
    'dialog类的("Login").下的 Dialog类的("Flight Reservations")下的.Static类的("Please ''enter password").
    'GetROProperty("tsxt") 的意思则是我们将取出 Static类的("Please enter password")的 text属''性,放置到我们的RO中。
    '现在我们只是取出来我们要用的属性和属性的值 那么怎么去比较呢?
    '继续看下面的代码let‘s goon
    '
    'For i = 0 To 4 Step 1
    '
    'Dialog("Login").WinEdit("Agent Name:").Set shuzu(i,0)
    'Dialog("Login").WinEdit("Password:").SetSecure shuzu(i,1)
    'Dialog("Login").WinButton("OK").Click
    '
    'shijishuchu=dialog("Login").Dialog("Flight Reservations").Static("Please enter ''password").GetROProperty("text")
    'yujishuchu=shuzu(i,2)
    '
    'Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click
    '
    'Next
    '这一步就非常简单了,意义一看就明白了。就是我们把取出来的test 赋值给变量 shijishuchu,我们数组''的预计输出shuzu(i,2)赋值给变量yujishuchu
    '这时我们有了两个变量,接下来的工作就是开始比较他们,已达到我们测试的目的

    For i = 0 To 4 Step 1

    Dialog("Login").WinEdit("Agent Name:").Set shuzu(i,0)
    Dialog("Login").WinEdit("Password:").SetSecure shuzu(i,1)
    Dialog("Login").WinButton("OK").Click

    shijishuchu = Dialog("Login").Dialog("Flight Reservations").Static("Incorrect password. Please").GetROProperty("text")
    yujishuchu = shuzu(i,2)

    If shijishuchu=yujishuchu Then
       Reporter.ReportEvent micPass,"结果比较","实际输出:"&shijishuchu&",预计输出:"&yujishuchu
    else
      Reporter.ReportEvent micFail,"结果比较","实际输出:"&shijishuchu&",预计输出:"&yujishuchu
    End If

    Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click

    Next
    '运行上面的代码,hoho,成功了吧?
    '我们顺利的对测试点做了检查,并且比较了结果。
    '不过,不能高兴的太早咯,为啥呢?
    '因为这一段代码的复用性一点也不好哟。如果我们的需求有变化,那岂不是每次都要对代码做手术 - -b
    '因为我们的预计输出是直接写死在脚本中,这样的脚本在实际的运用中是不合理的。
    '而且我们的脚本没有去考虑,如果输入了正确的帐号和密码应该怎么办。
    '呵呵 饭要一口一口的吃知识也要一点一点的学。
    '我们在下一篇文章里,再次对我们代码进行下一步的优化和改革:P
    'ps:文章是在qtp中直接写的所以大部分句子的前面都带有单引号(单引号是QTP中的注释),没有单引号的''部分是可以直接运行的最终代码。另外由于博客输入框大小的限制上文中有些地方是不应该换行的,不过不会''影响正常阅读,所以不做提示了。。。。
    ''重新编辑了一下 把可以运行的代码变成了红色字体,增加了一点点可读性
  • VBScript编码约定

    kellyxie 发布于 2008-02-13 11:30:28

    VBscrīpt编码约定

    编码约定是帮助您使用 Microsoft Visual Basic scrīpting Edition 编写代码的一些建议。编码约定包含以下内容:

    • 对象、变量和过程的命名约定
    • 注释约定
    • 文本格式和缩进指南

    使用一致的编码约定的主要原因是使脚本或脚本集的结构和编码样式标准化,这样代码易于阅读和理解。使用好的编码约定可以使源代码明白、易读、准确,更加直观且与其他语言约定保持一致。

    常数命名约定

    VBscrīpt 的早期版本不允许创建用户自定义常数。如果要使用常数,则常数以变量的方式实现,且全部字母大写以和其他变量区分。常数名中的多个单词用下划线 (_) 分隔。例如:

     USER_LIST_MAX
    NEW_LINE

    这种标识常数的方法依旧可行,但您还可以选择其他方案,用 Const 语句创建真正的常数。这个约定使用大小写混合的格式,并以“con”作为常数名的前缀。例如:

     conYourOwnConstant

    变量命名约定

    为提高易读和一致性,请在 VBscrīpt 代码中使用以下变量命名约定:

    子类型 前缀 示例
    Boolean bln blnFound
    Byte byt bytRasterData
    Date (Time) dtm dtmStart
    Double dbl dblTolerance
    Error err errOrderNum
    Integer int intQuantity
    Long lng lngDistance
    Object obj objCurrent
    Single sng sngAverage
    String str strFirstName

    变量作用域

    变量应定义在尽量小的作用域中。VBscrīpt 变量的作用域如下所示:

    作用域 声明变量处 可见性
    过程级 事件、函数或子过程。 在声明变量的过程中可见。
    scrīpt 级 HTML 页面的 HEAD 部分,任何过程之外。 在脚本的所有过程中可见。

    变量作用域前缀

    随着脚本代码长度的增加,有必要快速区分变量的作用域。在类型前缀前面添加一个单字符前缀可以实现这一点,而不致使变量名过长。

    作用域 前缀 示例
    过程级 dblVelocity
    scrīpt 级 s sblnCalcInProgress

    描述性变量名和过程名

    变量名或过程名的主体应使用大小写混合格式,并且尽量完整地描述其目的。另外,过程名应以动词开始,例如 InitNameArray 或 CloseDialog。

    对于经常使用的或较长的名称,推荐使用标准缩写以使名称保持在适当的长度内。通常多于 32 个字符的变量名会变得难以阅读。使用缩写时,应确保在整个脚本中保持一致。例如,在一个脚本或脚本集中随意切换 Cnt 和 Count 将造成混乱。

    对象命名约定

    下表列出了 VBscrīpt 中可能用到的对象命名约定(推荐):

    对象类型 前缀 示例
    3D 面板 pnl pnlGroup
    动画按钮 ani aniMailBox
    复选框 chk chkReadOnly
    组合框、下拉列表框 cbo cboEnglish
    命令按钮 cmd cmdExit
    公共对话框 dlg dlgFileOpen
    框架 fra fraLanguage
    水平滚动条 hsb hsbVolume
    图像 img imgIcon
    标签 lbl lblHelpMessage
    直线 lin linVertical
    列表框 lst lstPolicyCodes
    旋钮 spn spnPages
    文本框 txt txtLastName
    垂直滚动条 vsb vsbRate
    滑块 sld sldScale

    代码注释约定

    所有过程的开始部分都应有描述其功能的简要注释。这些注释并不描述细节信息(如何实现功能),这是因为细节有时要频繁更改。这样就可以避免不必要的注释维护工作以及错误的注释。细节信息由代码本身及必要的内部注释来描述。

    当传递给过程的参数的用途不明显,或过程对参数的取值范围有要求时,应加以说明。如果过程改变了函数和变量的返回值(特别是通过参数引用来改变),也应在过程的开始部分描述该返回值。

    过程开始部分的注释应包含以下区段标题。相关样例,请参阅后面的“格式化代码”部分。

    区段标题 注释内容
    目的 过程的功能(不是实现功能的方法)。
    假设 其状态影响此过程的外部变量、控件或其他元素的列表。
    效果 过程对每个外部变量、控件或其他元素的影响效果的列表。
    输入 每个目的不明显的参数的解释。每个参数都应占据单独一行并有其内部注释。
    返回 返回值的解释。

    请记住以下几点:

    • 每个重要的变量声明都应有内部注释,描述变量的用途。
    • 应清楚地命名变量、控件和过程,仅在说明复杂细节时需要内部注释。
    • 应在脚本的开始部分包含描述该脚本的概述,列举对象、过程、运算法则、对话框和其他系统从属物。有时一段描述运算法则的假码是很有用的。

    格式化代码

    应尽可能多地保留屏幕空间,但仍允许用代码格式反映逻辑结构和嵌套。以下为几点提示:

    • 标准嵌套块应缩进 4 个空格。
    • 过程的概述注释应缩进 1 个空格。
    • 概述注释后的最高层语句应缩进 4 个空格,每一层嵌套块再缩进 4 个空格。例如:
    '*********************************************************
    ' Purpose: Locates the first occurrence of a specified user
    '          in the UserList array.
    ' Inputs: strUserList(): the list of users to be searched.
    '         strTargetUser: the name of the user to search for.
    ' Returns: The index of the first occurrence of the strTargetUser
    '          in the strUserList array.
    '          If the target user is not found, return -1.
    '*********************************************************
    Function intFindUser (strUserList(), strTargetUser)
       Dim i   ' Loop counter.
       Dim blnFound   ' Target found flag
       intFindUser = -1
       i = 0   ' Initialize loop counter
       Do While i <= Ubound(strUserList) and Not blnFound
          If strUserList(i) = strTargetUser Then
             blnFound = True   ' Set flag to True
             intFindUser = i   ' Set return value to loop count
          End If
          i = i + 1   ' Increment loop counter
       Loop
    End Function
Open Toolbar