漫漫测试人生路,吾将上下而求索

发布新日志

  • 护肝,护肾保健饮品

    2011-10-18 21:18:52

    护肝:山楂+决明子
         红糖+玫瑰花
     
     
    护肾:9克五味子+9克枸杞子泡水喝
  • 护手配方

    2011-10-18 21:12:55

    当归:20克
    川芎:20克
    红花:10克
    伸筋草:20克
    白术:30克
     
    煎水500ML,泡手或涂在手上隔几分钟后洗掉
  • QTP问题

    2011-10-14 14:48:42

    在QTP描述性编程中如何给没有唯一识别属性的控件增加属性

    例如:Browser("title:=51Testing软件测试网-中国软件测试人的精神家园").Page("title:=51Testing软件测试网-中国软件测试人的精神家园").WebButton("name:=WebButton").Click

    其中:WebButton没有name属性,我如何增加一个name属性呢?

  • QTP菜单中Object Repository Manager打不开

    2011-06-21 10:05:50

    软件环境:XP SP3;QTP10.0
    打开QTP,选择测试脚本,然后选择Resources->Object Repository Manager 走到这一步时总是死掉无法打开,偶尔有一次打开过,但只此一次,是否有人也遇到此问题,如何解决,谢谢!

    注:Resources下的其它菜单项都能正常打开
  • SQL语句的整理(转载)

    2010-09-13 14:42:56

    SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。
    一、基础
    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)

  • 精妙 SQL 语句收集(转)

    2010-09-13 14:40:50

    原文转至CSDN http://blog.csdn.net/chen8148/archive/2007/08/14/1741991.aspx

     

    SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。

    一、基础

    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],..)

    根据已有的表创建新表:

    Acreate table tab_new like tab_old (使用旧表创建新表)

    Bcreate 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、说明:使用外连接

    Aleft 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

    Bright outer join:

    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    Cfull 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、说明:子查询(表名1a 表名2b)

    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、说明:外连接查询(表名1a 表名2b)

    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、说明:在线视图查询(表名1a )

    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 中但不在 TableBTableC 中的行并消除所有重复行而派生出一个结果表

    (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、说明:列示typevenderpcs字段,以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、说明:选择从1015的记录

    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    三、技巧

    11=11=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

  • 使用 TestLink 进行测试管理(转)

    2010-08-12 10:36:50

        TestLink用于进行测试过程中的管理,通过使用TestLink提供的功能,可以将测试过程从测试需求、测试设计、到测试执行完整的管理起来,同时,它还提供了好多种测试结果的统计和分析,使我们能够简单的开始测试工作和分析测试结果。

        TestLink 是sourceforge的开放源代码项目之一。作为基于web的测试管理系统,TestLink的主要功能包括:

      测试需求管理

      测试用例管理

      测试用例对测试需求的覆盖管理

      测试计划的制定

      测试用例的执行

      大量测试数据的度量和统计功能。

      TestLink的最新版本是1.6.2。在本文接下来的部分里,作者将详细地介绍使用TestLink1.6.0来进行测试管理的完整过程。

      一、安装启动

      1、 在安装TestLink1.6.0前,需要完成以下安装运行所需要的环境:Webserver、php4和MySQL。笔者推荐的安装环境如下:

      Apache HTTP Server 2.0.59

      Php 4.4.1

      Mysql 4.1.21

      2、 将 TestLink 安装包保存到服务器,解压缩到 Apache2 的 htdocs 目录下,并重命名为 testlink。

      3、 自动安装 TestLink

      在浏览器输入访问地址http://yoursite/testlink/install/index.php,如:http://localhost:80/testlink/install/index.php

      选择new install,在进入的页面中,输入登录MySQL的用户名和密码,如root。提示安装成功,详细的安装说明请参照http://blog.csdn.net/judyxm/archive/2006/01/12/577148.aspx

      4、 登录testlink首页面。系统为testlink创建一个默认管理员账号,用户名和密码为:admin/admin。你可以使用这个账号访问TestLink 。登录http://127.0.0.1:80/testlink/index.php,如果你看到的页面如下,就说明你已经安装成功了。

    使用 TestLink 进行测试管理

      二、初始配置(设置用户、产品)

      1、 用户设置

    在TestLink系统中,每个用户都可以维护自己的私有信息。admin可以创建用户,但不能看到其它用户的密码。在用户信息中,需要设置Email地址,如果用户忘记了密码,系统可以通过mail获得。

      TestLink系统提供了六种角色,分别是admin、leader、senior tester 、tester、guest、testdesigner。相对应的功能权限如下:(详见图)

      Guest:只有读的权限,适合于查看测试用例和测试需求,以及项目分析的用户。

      Testdesigner:可以开展测试用例和测试需求的所有工作。

      Tester:只能执行测试用例。

      Senior tester:可以查看和维护测试用例,并且可以执行测试用例,但是不能管理测试计划、分配测试任务。

      Leader:可以开展测试规格和测试需求的所有工作,还可以管理测试计划、分配测试任务。

      Admin:维护产品,用户。

      同时,支持不同地域用户对不同语言的需求,可以根据用户的喜好对用户提供不同的语言支持。

    使用 TestLink 进行测试管理

      2、 产品设置

      TestLink可以对多个产品进行管理,Admin进行产品设置后,测试人员就可以进行测试需求、测试用例、测试计划等相关管理工作了。TestLink支持对每个产品设置不同的背景颜色,方便管理。

    使用 TestLink 进行测试管理

      三、测试需求管理

      测试需求是我们开展测试的依据。首先,我们对产品的测试需求进行分解和整理。一个产品可以包含多个测试需求规格,一个测试需求规格可以包含多个测试需求;

    创建测试需求规格

      对测试需求规格的描述比较简单,内容包含名称、范围。

      创建测试需求

      测试需求内容包含:需求ID、名称、范围、需求的状态,以及覆盖需求的案例。 TestLink提供了两种状态来管理需求:正确的(Valid)、不可测试的(not testable)。

    使用 TestLink 进行测试管理

      从文件导入测试需求

      Testlink提供了从文件导入测试需求的功能,支持的的文件类型有csv和csv(door)两种。

      四、测试用例管理

      TestLink支持的测试用例的管理包含三层:分别为Component、Category、Test case。我们把Component对应到项目的功能模块,而把Category跟每个模块的function对应,Test case就是写在这些Category里的。我们可以使用测试用例搜索功能从不同的项目、成百上千的测试用例中查到我们需要的测试用例,甚至于可以直接将别的项目里写的测试用例复制过来,这样就解决了测试用例的管理和复用问题。

      但是,还有一个问题没有解决,那就是与测试需求的对应问题。在测试管理中,测试用例对测试需求的覆盖率是我们非常关心的,从需求规格说明书中提取出测试需求之后, Testlink提供管理测试需求与测试用例的对应关系的功能。

      创建Component

      Component的内容包括:名称、介绍、范围、相关的内容、约束。

      创建Category

      Category的内容包括:名称、测试范围和目标、配置信息、测试数据、测试工具

      创建 Test case

      测试用例的要素包括:测试用例名称、简要说明、步骤、期望结果、关键字。

    使用 TestLink 进行测试管理

    创建好的测试用例树如下:

    使用 TestLink 进行测试管理

      建立测试用例和测试需求的覆盖关系。

      选中左侧用例树中的测试用例,再选择右侧对应的测试需求,进行Assign即可。

    使用 TestLink 进行测试管理

      五、测试计划制定

      在TestLink系统中,一个完整的测试计划包括:

      测试阶段的名称(如集成测试阶段、系统测试阶段)

      里程碑(明确每个测试阶段的开始和截止时间,以及完成A、B、C三种优先级的比例)

      Build版本(定义本测试计划中需要测试的build版本,一般以产品名+时间来命名。)

      安排测试人员 (从用户列表中选择本测试计划的参与人员。)

    使用 TestLink 进行测试管理

      测试用例集

      制定优先级规则。优先级分为A、B、C三级,系统会根据用户定义的重要级别和风险级别的组合来确定优先级的归属。重要级别分为三级:Low、Medium、High。风险级别包括三级:1、2、3。

      从测试用例中选择本测试计划的测试用例集

      设置每个测试用例Category的重要级别和风险级别

      设置每个测试用例Category的责任归属。从本测试计划的测试人员列表中选择每个Category的Owner,由他来负责和完成测试用例的执行。

      六、测试执行

      执行测试用例,按照对每个build版本的执行情况,记录测试结果。测试结果有四种情况可以选择:

    Not Run:还没有执行过

      Pass:执行通过

      Failed:执行失败

      Blocked:由于其它用例失败,导致此用例无法执行,被阻塞。

      七、测试结果分析

      TestLink根据测试过程中记录的数据,提供了较为丰富的度量统计功能,可以直观的得到测试管理过程中需要进行分析和总结的数据:

      测试用例对测试需求的覆盖情况:哪些需求已经通过测试,哪些需求未通过测试,哪些需求处于阻塞状态,哪些需求还未开始测试。

    使用 TestLink 进行测试管理

      针对每个版本的测试用例执行情况:

      1)各种优先级的测试用例执行的比率

      2)各个模块的测试用例执行的比率

      3)各个测试人员测试用例的执行比率

    使用 TestLink 进行测试管理

      每个版本的执行情况

    使用 TestLink 进行测试管理

      所有测试用例在不同build版本的执行情况,显示?的地方表示还未执行。

    使用 TestLink 进行测试管理

      阻塞的测试用例列表

    使用 TestLink 进行测试管理

      失败的测试用例列表

    使用 TestLink 进行测试管理

      每个测试用例的bug数

      如果和bug跟踪系统连接的话,在下表中可以统计出每个测试用例的bug的数目

    使用 TestLink 进行测试管理

      八、与bug跟踪系统集成

      TestLink提供了与多种bug跟踪系统关联的接口配置,目前支持的bug系统有Jira、bugzilla、mantis。配置方法的相关文档参照帮助。

      九、其它易用性功能

      TestLink还提供了很多易用性的功能,比如:

      从测试需求直接生成测试用例

      文档的导入、导出功能

      测试报告可以导出为excel

      支持设定keyword

      总结

      TestLink用于进行测试过程中的管理,通过使用TestLink提供的功能,我们可以将测试过程从测试需求、测试设计、到测试执行完整的管理起来,同时,它还提供了好多种测试结果的统计和分析,使我们能够简单的开始测试工作和分析测试结果。

      本文中,作者根据自己的使用经验,详细演示了如何使用TestLink来进行测试管理的全部过程,简单的介绍了TestLink的使用方法。希望能够帮助大家学会使用TestLink的基本功能,同时,大家可以参考这个过程和TestLink的帮助文档来实现对测试过程的管理。

  • 测试工具汇总

    2010-07-30 15:53:27

    测试管理工具:
              
    1)QADirector (Compuware)
               2) TestDirector (Mercury Interactive)
               3) TestManager (Rational)

    GUI自动录制回放工具

    自动工具:
             1)QARun (Compuware)
             2) TestPartner (Compuware)
             3) WinRunner (Mercury Interactive)
             4) Robot (Rational)

    自动性能(压力)测试工具:
                             1)QALoad (Compuware)
                             2) LoadRunner (Mercury Interactive)
                             3) WAS (其它)
                             4)LoadTest (Rational)

    单元测试工具(白盒测试):
                            1)DevPartner (Compuware)
                            2) JUnit (其它)
                            3)HttpUnit (其它)
                            4)Purify (Rational)
                            5) Purecoverage (Rational)
                            6) Quantify (Rational)
                            7) CppUnit (其它)

    测试环境备份与恢复工具:
                           1)Ghost (Symantec)
                           2) Partimage

    链接测试工具:
                 WebCheck (Compuware)

    测试工具厂商介绍:
                    1)Mercury Interactiv 
                      ------TestDirector,WinRunner,LoadRunner,QuickTest

                    2)Rational
                      ------TestManager,Purify,Quantify,Robot,TestFactory

                    3)Compuware
                      ------QADirector,QARun,TestPartner,QALoad,TrackRecord,
                            DevPartner

     欢迎补充完善        

  • SQL50句-转载

    2010-07-09 11:08:25

    Student(S#,Sname,Sage,Ssex) 学生表
    Course(C#,Cname,T#) 课程表
    SC(S#,C#,score) 成绩表
    Teacher(T#,Tname) 教师表

    问题:
    1、查询“001”课程比“002”课程成绩高的所有学生的学号;
      select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
      from SC where C#='002') b
      where a.score>b.score and a.s#=b.s#;

    2、查询平均成绩大于60分的同学的学号和平均成绩;
        select S#,avg(score)
        from sc
        group by S# having avg(score) >60;  

    3、查询所有同学的学号、姓名、选课数、总成绩;
      select Student.S#,Student.Sname,count(SC.C#),sum(score)
      from Student left Outer join SC on Student.S#=SC.S#
      group by Student.S#,Sname

    4、查询姓“李”的老师的个数;
      select count(distinct(Tname))
      from Teacher
      where Tname like '李%';

    5、查询没学过“叶平”老师课的同学的学号、姓名;
        select Student.S#,Student.Sname
        from Student  
        where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');

    6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
      select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');

    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
      select S#,Sname
      from Student
      where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='叶平'));

    8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
      Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2
      from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;

    9、查询所有课程成绩小于60分的同学的学号、姓名;
      select S#,Sname
      from Student
      where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);

    10、查询没有学全所有课的同学的学号、姓名;
        select Student.S#,Student.Sname
        from Student,SC
        where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);

    11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;
        select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';

    12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;
        select distinct SC.S#,Sname
        from Student,SC
        where Student.S#=SC.S# and C# in (select C# from SC where S#='001');

    13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;
        update SC set score=(select avg(SC_2.score)
        from SC SC_2
        where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');

    14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;
        select S# from SC where C# in (select C# from SC where S#='1002')
        group by S# having count(*)=(select count(*) from SC where S#='1002');

    15、删除学习“叶平”老师课的SC表记录;
        Delect SC
        from course ,Teacher  
        where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';

    16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、
        号课的平均成绩;
        Insert SC select S#,'002',(Select avg(score)
        from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');

    17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示:学生ID,,数据库,企业管理,英语,有效课程数,有效平均分
        SELECT S# as 学生ID
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语
            ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩
        FROM SC AS t
        GROUP BY S#
        ORDER BY avg(t.score) 

    18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
        SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分
        FROM SC L ,SC AS R
        WHERE L.C# = R.C# and
            L.score = (SELECT MAX(IL.score)
                          FROM SC AS IL,Student AS IM
                          WHERE L.C# = IL.C# and IM.S#=IL.S#
                          GROUP BY IL.C#)
            AND
            R.Score = (SELECT MIN(IR.score)
                          FROM SC AS IR
                          WHERE R.C# = IR.C#
                      GROUP BY IR.C#
                        );

    21、查询不同老师所教不同课程平均分从高到低显示
      SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩
        FROM SC AS T,Course AS C ,Teacher AS Z
        where T.C#=C.C# and C.T#=Z.T#
      GROUP BY C.C#
      ORDER BY AVG(Score) DESC

    22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)
        [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩
        SELECT DISTINCT top 3
          SC.S# As 学生学号,
            Student.Sname AS 学生姓名 ,
          T1.score AS 企业管理,
          T2.score AS 马克思,
          T3.score AS UML,
          T4.score AS 数据库,
          ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分
          FROM Student,SC LEFT JOIN SC AS T1
                          ON SC.S# = T1.S# AND T1.C# = '001'
                LEFT JOIN SC AS T2
                          ON SC.S# = T2.S# AND T2.C# = '002'
                LEFT JOIN SC AS T3
                          ON SC.S# = T3.S# AND T3.C# = '003'
                LEFT JOIN SC AS T4
                          ON SC.S# = T4.S# AND T4.C# = '004'
          WHERE student.S#=SC.S# and
          ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
          NOT IN
          (SELECT
                DISTINCT
                TOP 15 WITH TIES
                ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)
          FROM sc
                LEFT JOIN sc AS T1
                          ON sc.S# = T1.S# AND T1.C# = 'k1'
                LEFT JOIN sc AS T2
                          ON sc.S# = T2.S# AND T2.C# = 'k2'
                LEFT JOIN sc AS T3
                          ON sc.S# = T3.S# AND T3.C# = 'k3'
                LEFT JOIN sc AS T4
                          ON sc.S# = T4.S# AND T4.C# = 'k4'
          ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);

    23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
        SELECT SC.C# as 课程ID, Cname as 课程名称
            ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]
            ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]
            ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]
            ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]
        FROM SC,Course
        where SC.C#=Course.C#
        GROUP BY SC.C#,Cname;

    24、查询学生平均成绩及其名次
          SELECT 1+(SELECT COUNT( distinct 平均成绩)
                  FROM (SELECT S#,AVG(score) AS 平均成绩
                          FROM SC
                      GROUP BY S#
                      ) AS T1
                WHERE 平均成绩 > T2.平均成绩) as 名次,
          S# as 学生学号,平均成绩
        FROM (SELECT S#,AVG(score) 平均成绩
                FROM SC
            GROUP BY S#
            ) AS T2
        ORDER BY 平均成绩 desc;
     
    25、查询各科成绩前三名的记录:(不考虑成绩并列情况)
          SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
          FROM SC t1
          WHERE score IN (SELECT TOP 3 score
                  FROM SC
                  WHERE t1.C#= C#
                ORDER BY score DESC
                  )
          ORDER BY t1.C#;

    26、查询每门课程被选修的学生数
    select c#,count(S#) from sc group by C#;

    27、查询出只选修了一门课程的全部学生的学号和姓名
    select SC.S#,Student.Sname,count(C#) AS 选课数
    from SC ,Student
    where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;

    28、查询男生、女生人数
        Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男';
        Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女';

    29、查询姓“张”的学生名单
        SELECT Sname FROM Student WHERE Sname like '张%';

    30、查询同名同性学生名单,并统计同名人数
    select Sname,count(*) from Student group by Sname having count(*)>1;;

    31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)
        select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age
        from student
        where CONVERT(char(11),DATEPART(year,Sage))='1981';

    32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
        Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;

    33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
        select Sname,SC.S# ,avg(score)
        from Student,SC
        where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85;

    34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数
        Select Sname,isnull(score,0)
        from Student,SC,Course
        where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='数据库'and score <60;

    35、查询所有学生的选课情况;
        SELECT SC.S#,SC.C#,Sname,Cname
        FROM SC,Student,Course
        where SC.S#=Student.S# and SC.C#=Course.C# ;

    36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;
        SELECT distinct student.S#,student.Sname,SC.C#,SC.score
        FROM student,Sc
        WHERE SC.score>=70 AND SC.S#=student.S#;

    37、查询不及格的课程,并按课程号从大到小排列
        select c# from sc where scor e <60 order by C# ;

    38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;
        select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';

    39、求选了课程的学生人数
        select count(*) from sc;

    40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩
        select Student.Sname,score
        from Student,SC,Course C,Teacher
        where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );

    41、查询各个课程及相应的选修人数
        select count(*) from sc group by C#;

    42、查询不同课程成绩相同的学生的学号、课程号、学生成绩
      select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ;

    43、查询每门功成绩最好的前两名
        SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数
          FROM SC t1
          WHERE score IN (SELECT TOP 2 score
                  FROM SC
                  WHERE t1.C#= C#
                ORDER BY score DESC
                  )
          ORDER BY t1.C#;

    44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列  
        select  C# as 课程号,count(*) as 人数
        from  sc  
        group  by  C#
        order  by  count(*) desc,c# 

    45、检索至少选修两门课程的学生学号
        select  S#  
        from  sc  
        group  by  s#
        having  count(*)  2

    46、查询全部学生都选修的课程的课程号和课程名
        select  C#,Cname  
        from  Course  
        where  C#  in  (select  c#  from  sc group  by  c#) 

    47、查询没学过“叶平”老师讲授的任一门课程的学生姓名
        select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平');

    48、查询两门以上不及格课程的同学的学号及其平均成绩
        select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;

    49、检索“004”课程分数小于60,按分数降序排列的同学学号
        select S# from SC where C#='004'and score <60 order by score desc;

    50、删除“002”同学的“001”课程的成绩
    delete from Sc where S#='001'and C#='001';
  • B/S系统和C/S系统的应用比较分析

    2010-06-23 11:28:33

    B/S结构(Browser/Server结构)结构即浏览器和服务器结构。

    1.节约成本~~~~~

    大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)!它是一次性到位的开发!

    2.安全~~~

    它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。在网络各工作站通过WWW浏览器就能实现工作业务。

    3.方便~~~

       B/S结构最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。只要有一台能上网的电脑就能使用,客户端零维护。系统的扩展非常容易,只要能上网,再由系统管理员分配一个用户名和密码,就可以使用了。甚至可以在线申请,通过公司内部的安全认证(如CA证书)后,不需要人的参与,系统可以自动分配给用户一个账号进入系统。这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。

    4.成本降低,选择更多~~~

    大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。 现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

     

        C/S结构软件(即客户机/服务器模式)分为客户机和服务器两层,客户机不是毫无运算能力的输入、输出设备,而是具有了一定的数据处理和数据存储能力,通过把应用软件的计算和数据合理地分配在客户机和服务器两端,可以有效地降低网络通信量和服务器运算量。由于服务器连接个数和数据通信量的限制,这种结构的软件适于在用户数目不多的局域网内使用。国内目前的大部分ERP(财务)软件产品即属于此类结构。

    1,数据安全性比较。由于C/S结构软件的数据分布特性,客户端所发生的火灾、盗抢、地震、病毒、黑客等都成了可怕的数据杀手。另外,对于集团级的异地软件应用,C/S结构的软件必须在各地安装多个服务器,并在多个服务器之间进行数据同步。如此一来,每个数据点上的数据安全都影响了整个应用的数据安全。对于B/S结构的软件来讲,由于其数据集中存放于总部的数据库服务器,客户端不保存任何业务数据和数据库连接信息,也无需进行什么数据同步,所以这些安全问题也就自然不存在了。

    2,数据一致性比较。在C/S结构软件的解决方案里,对于异地经营的大型集团都采用各地安装区域级服务器,然后再进行数据同步的模式。这些服务器每天必须同步完毕之后,总部才可得到最终的数据。由于局部网络故障造成个别数据库不能同步不说,即使同步上来,各服务器也不是一个时点上的数据,数据永远无法一致,不能用于决策。对于B/S结构的软件来讲,其数据是集中存放的,客户端发生的每一笔业务单据都直接进入到中央数据库,不存在数据一致性的问题。

       3,数据实时性比较。在集团级应用里,C/S结构不可能随时随地看到当前业务的发生情况,看到的都是事后数据;而B/S结构则不同,它可以实时看到当前发生的所有业务,方便了快速决策,有效地避免了损失。

       4,数据溯源性比较。由于B/S结构的数据是集中存放的,所以总公司可以直接追溯到各级分支机构(分公司、门店)的原始业务单据,也就是说看到的结果可溯源。大部分C/S结构的软件则不同,为了减少数据通信量,仅仅上传中间报表数据,在总部不可能查到各分支机构(分公司、门店)的原始单据。

       5,服务响应及时性比较。企业的业务流程、业务模式不是一成不变的,随着企业不断发展,必然会不断调整。软件供应商提供的软件也不是完美无缺的,所以,对已经部署的软件产品进行维护、升级是正常的。C/S结构软件,由于其应用是分布的,需要对每一个使用节点进行程序安装,所以,即使非常小的程序缺陷都需要很长的重新部署时间,重新部署时,为了保证各程序版本的一致性,必须暂停一切业务进行更新(即休克更新),其服务响应时间基本不可忍受。而B/S结构的软件不同,其应用都集中于总部服务器上,各应用结点并没有任何程序,一个地方更新则全部应用程序更新,可以做到快速服务响应。

       6,网络应用限制比较。C/S结构软件仅适用于局域网内部用户或宽带用户(1兆以上);而我们的B/S结构软件可以适用于任何网络结构(包括33.6K拨号入网方式),特别适于宽带不能到达的地方(例如迪信通集团的某些分公司,仅靠电话上网即可正常使用软件系统)。

     

    C/S的缺点

     

    1.适用面窄,通常用于局域网中。

    2.用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。

    3.维护成本高,发生一次升级,则所有客户端的程序都需要改变。

     

    B/SC/S结构软件商业运用上的比较

     

       管理软件是为企业服务的,企业选用管理软件不仅要从技术上考虑,还要从商业运用方面来考虑,下文将从商业运用的角度对两种结构的软件进行比较。

       1,投入成本比较。B/S结构软件一般只有初期一次性投入成本。对于集团来讲,有利于软件项目控制和避免IT黑洞,而C/S结构的软件则不同,随着应用范围的扩大,投资会连绵不绝。

       2,硬件投资保护比较。在对已有硬件投资的保护方面,两种结构也是完全不同的。当应用范围扩大,系统负载上升时,C/S结构软件的一般解决方案是购买更高级的中央服务器,原服务器放弃不用,这是由于C/S软件的两层结构造成的,这类软件的服务器程序必须部署在一台计算机上;而B/S结构(如e通管理系列)则不同,随着服务器负载的增加,可以平滑地增加服务器的个数并建立集群服务器系统,然后在各个服务器之间做负载均衡。有效地保护了原有硬件投资。

       3,企业快速扩张支持上的比较。对于成长中的企业,快速扩张是它的显著特点。例如迪信通公司,每年都有新的配送中心成立,每月都有新的门店开张。应用软件的快速部署,是企业快速扩张的必要保障。对于C/S结构的软件来讲,由于必须同时安装服务器和客户端、建设机房、招聘专业管理人员等,所以无法适应企业快速扩张的特点。而B/S结构软件,只需一次安装,以后只需设立账号、培训即可。

       其次,随着软件应用的扩张,对系统维护人才的需求有可能成为企业快速扩张的制约瓶颈。如果企业开店上百家,对计算机专业人才的需求就将是企业面临的巨大挑战之一。

       抛开人力成本不说,一个企业要招到这么多的专业人才并且留住他们也是不可能的。所以,采用C/S结构软件必然会制约企业未来的发展。另外,大多数C/S结构的软件都是通过ODBC直接连到数据库的,安全性差不说,其用户数也是受限的。每个连到数据库的用户都会保持一个ODBC连接,都会一直占用中央服务器的资源,对中央服务器的要求非常高,使得用户扩充受到极大的限制。而B/S结构软件则不同,所有的用户都是通过一个JDBC连接缓冲池连接到数据库的,用户并不保持对数据库的连接,用户数基本上是无限的。

     

       从以上的分析可以看出,B/S结构的管理软件有着C/S结构软件无法比拟的优势。而从国外的发展趋势来看,也验证了这一点。目前,国外大型企业管理软件要么已经是B/S结构的,要么正在经历从C/SB/S结构的转变。从国内诸多软件厂商积极投入开发B/S结构软件的趋势来看,B/S结构的大型管理软件势必在将来的几年内占据管理软件领域的主导地位。

  • [论坛] LR压力测试问题求教

    2009-11-04 11:21:47

    如果我对一个系统的登录进行压力测试,可用的登录帐号只有10个,在脚本中对登录ID进行参数化,输入这10个帐号,在场景设置中,我能否用这10个帐号进行100个用户,甚至更多用户的并发登录压力测试呢

    在场景设置中我设置有100或更多的用户数,

    是否就能进行那么多用户的并发登录测试呢

    测试后显示的结果是我设置的那么多用户并发登录的结果吗

    说明:测试的这个系统有个限制条件,既相同的用户帐号在同一个IP上同时只能登录一次

    请知道的朋友帮忙解答或探讨,谢谢!

  • [论坛] LR参数化问题求教

    2009-10-30 11:03:58

        刚才看了51testing网站上一个朋友整理的有关LR的问题,其中对脚本参数化时对参数表中添加新列时说“不要在打开记事本的时候添加新列。应该在参数属性中添加”
        我不知道为什么要这样做,难道打开记事本添加新列和在参数属性中添加有什么不同吗?

        正好最近我也遇到了一个参数化的问题,想在此请教下大家,希望知道的朋友,帮忙解答
        在对脚本进行参数化时,我是通过打开记事本添加新列的,这样我可以直接将参数化的数据拷贝到记事本上,一共拷贝了1000条数据,但保存后,在参数列表中只显示了100条数据,不知道这是为什么?难道只允许参数化100条数据吗,还是列表只显示100条数据,实际是有1000条数据的,我用的license应该没什么问题,是支持web 10000的license


         希望知道的朋友帮忙解答和探讨,谢谢!

  • LR测试问题求教

    2009-10-22 17:46:02

        对一个系统中的某个功能进行压力测试,在录制脚本时为这个功能设置了Start Transaction和End Transaction,场景设置运行完成后,Transaction中的Passed是否显示的是该功能通过的事物数,即该功能被执行了多少次呢?


        主要的疑问是,脚本中只有一个客户登陆,但设置场景时我输入的客户数是>1的不同数目,且设置的是同时登陆,运行完成后系统记录的这个功能通过的事物数也是>1,为什么会有那么多的通过事物数呢,而且我所测试的这个系统有个限制就是同一个IP同时只能有一个客户登陆,所以想请教下高手,测试结果中所显示的通过事物数是否就是这个功能被执行过的次数呢?


        因为这个疑问使得我现在不能确定得到的数据是否准确

    具体设置描述:
    1)对一个BS系统中的一项筛选功能进行压力测试,录制脚本时我用一个用户账号登陆,录制完成后并没 有对脚本的登录账号进行客户化,仍然用这一个账号的脚本设置了场景
    2)在场景设置中,我将Quantity设置为10或者更多,循环次数设置为一次
    3)Edit Schedule设置为Load all Vusers simultaneously

  • LoadRunner性能测试指标

    2009-08-14 11:51:44

    LoadRunner性能测试指标


    Object

    Counters

    Descrīption

    Reference value

    Memory

    Available Mbytes

    可用物理内存数.如果Available Mbytes的值很小(4 MB或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。

    4 MB或更小,至少要有10%的物理内存值

    Page/sec

    (Input/Out)

    为了解析硬页错误,从磁盘取出或写入的页数。一般如果Page/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引起的硬盘数据流量)。Pages/sec的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。

    推荐00-20

    如果服务器没有足够的内存处理其工作负荷,此数值将一直很高。如果大于80,表示有问题(太多的读写数据操作要访问磁盘,可考虑增加内存或优化读写数据的算法)。

    该系列计数器的值比较低说明响应请求比较快, 否则可能是服务器系统内存短缺引起(也可能是缓存太大, 导致系统内存太少)。

     

     

    >5越低越好

    Page Fault

    处理器每秒处理的错误页(包括软/硬错误)。

    当处理器向内存指定的位置请求一页(可能是数据或代码)出现错误时,这就构成一个Page Fault。如果该页在内存的其他位置,该错误被称为软错误(用Transition Fault/sec记数器衡量);如果该页必须从硬盘上重新读取时,被称为硬错误。许多处理器可以在有大量软错误的情况下继续操作。但是,硬错误可以导致明显的拖延。

    Page Input/sec

    为了解决硬错误页,从磁盘上读取的页数。

    Page Output/sec

     

    Page reads/sec

    为了解决硬错误页,从磁盘上读取的次数。解析对内存的引用,必须读取页文件的次数。阈值为>5.越低越好。大数值表示磁盘读而不是缓存读。

    Cache Bytes

    文件系统缓存,默认情况下为50%的可用物理内存。如IIS5.0运行内存不够时,它会自动整理缓存。需要关注该计数器的趋势变化

     

    内存泄露

    如果您怀疑有内存泄露,请监视Memory\\ Available Bytes和Memory\\ Committed Bytes,以观察内存行为,并监视您认为可能在泄露内存的进程的Process\\Private Bytes、Process\\Working Set和Process\\Handle Count。如果您怀疑是内核模式进程导致了泄露,则还应该监视Memory\\Pool Nonpaged Bytes、Memory\\ Pool Nonpaged Allocs和Process(process_name)\\ Pool Nonpaged Bytes。

     

    Process

    Page Faults/sec

    将进程产生的页故障与系统产生的相比较,以判断这个进程对系统页故障产生的影响。

     

    Private Bytes

    此进程所分配的无法与其它进程共享的当前字节数量。如果系统性能随着时间而降低,则此计数器可以是内存泄漏的最佳指示器。

     

    Work set

    处理线程最近使用的内存页,反映了每一个进程使用的内存页的数量。如果服务器有足够的空闲内存,页就会被留在工作集中,当自由内存少于一个特定的阈值时,页就会被清除出工作集。

     

    Processor

    % Processor Time

    被消耗的处理器时间数量.如果服务器专用于sqlserver可接受的最大上限是80% -85%.也就是常见的CPU使用率.

     

    ProcessorQueue Length

    判断CPU瓶颈,如果processor queue length显示的队列长度保持不变(>=2)并且处理器的利用率%Processor time超过90%,那么很可能存在处理器瓶颈.如果发现processor queue length显示的队列长度超过2,而处理器的利用率却一直很低,或许更应该去解决处理器阻塞问题,这里处理器一般不是瓶颈.

     

    Physical

    Disk

    %DiskTime

    指所选磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。

    正常值<10,此值过大表示耗费太多时间来访问磁盘,可考虑增加内存、更换更快的硬盘、优化读写数据的算法。若数值持续超过80 (此时处理器及网络连接并没有饱和),则可能是内存泄漏。

     

    CurrentDiskQueueLength

    读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。(磁盘数1.5-2倍)

     

    Avg.Disk Queue

    Length

    Avg.Disk Read

    QueueLength

    Avg.Disk Write

    QueueLength

    Disk Read/sec

    Disk Write/sec

    读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。

    磁盘瓶颈判断公式:

    每磁盘的I/O数=(读次数+(4*写次数))/磁盘个数。

    如果计算出来的每磁盘的I/O数大于磁盘的处理能力,那么磁盘存在瓶颈。

    Avg.DiskQueue Length正常值<0.5,此值过大表示磁盘IO太慢,要更换更快的硬盘。

     

     

    附:

    1、SQL数据库:

    1. User 0 Connections (用户连接数,也就是数据库的连接数量);

    2. Number of deadlocks/Sec/-Total (数据库死锁)

    3. Memory\ Availalle Mbyte 内存监控 (可用内存)

    4. Physicsdisk \disk time \-Total(磁盘读写总时间)(出现瓶颈时检查读磁盘的时间长还是写磁盘的时间长)

    5. Butter Caile hit(数据库缓存的选取命中率)

    6. 数据库的命中率不能低于92%

    2、Web Server:

    1. Processor \ Processon time \ Tatol cpu时间

    2. Memory \ Availalle MbyteAvai 应用服务器的内存

    3. Requst Quened 进入HTTP队列的时间;队列/每秒

    4. Total request 总请求数时间

    5. Avg Rps 平均每秒钟响应次数= 总请求时间 / 秒数

    6. Avg time to last byte per terstion (mstes)平均每秒迭代次数 ; 上一个页面到下一个页面的时间是你录入角本的一个过程的执行

    7. Http Error 无效请求次数

    8. Send 发送请求次数字节数

    Webload的压力参数:

    l Load Size(压力规模大小)

    l Round Time(请求时间)

    l Rounds (请求数)

    l Successful Rounds(成功的请求)

    l Failed Rounds (失败的请求)

    l Rounds Per Second (每秒请求次数)(是指你录入角本的任务在一秒中执行的次数,类似Avg time to last byte per terstion (mstes))

    l Successful Rounds Per Second(每秒成功的请求次数)

    l Failed Rounds Per Second(每秒失败的请求次数)

    l Page Time 页面响应时间

    l Pages (页面数)

    l Pages Per Second (每秒页面响应数)

    l H it Time(点击时间)

    l Hits(点击次数,也可以是请求次数,不过有一些不一样)

    l Successful Hits (成功的点击次数)

    l Failed Hits (失败的点击次数)

    l Hits Per Second (每秒点击数)

    l Successful Hits Per Second (每秒成功的点击次数)

    l Failed Hits Per Second (每秒失败的点击次数)

    l Attempted Connections (尝试链接数)

    l Successful Connections(成功的连接数)

    l Failed Connections(失败的连接数)

    l Connect Time(连接时间)

    l Process Time(系统执行时间,一般用来显示CPU的运算量,服务器端与客户端都要记录)

    l Receive Time(接受时间)

    l Send Time(请求时间)

    l Time To First Byte ()

    l Throughput (Bytes Per Second)()

    l Response Time(回应时间)

    l Response Data Size()

    l Responses()

     

     

     

    Transactions per second(每秒处理事务数) http连接Get or Post方法的事务数

    Rounds per second(每秒完成数) 每秒完全执行Agenda〔代理〕的数量

    Throughput(吞吐量)(bytes per second〔每秒字节数〕) 测试服务器每秒传送的字节数

    Round Time 完成一次事务所用的必要时间,单位是秒

    Transaction Time是完成一次事务的必须时间。事务:包括连接时间,发送、响应和处理时间。

    Connect Time 客户端到测试服务器的一个连接完成的时间,单位秒(包括建立和收到的TCP/IP时间)

    Send Time 是将事务写入测试服务器的缓冲必要时间 ,单位秒

    Response Time 是客户端请求接受测试服务器响应的必要时间,单位秒

    Process Time 处理数据的必要时间

    Load Size 负载测试时开启的虚拟客户数量〕

    Rounds 在测试会话期间执行议程脚本的时间数

    Attempted Connections 尝试连接测试服务器的数量

    HTTP Response Status 每一个http响应被结束的时间数量

    Response Data Size 由测试服务器发送的响应大小,单位字节。

  • 性能测试工具篇loadrunner(部分)(转51testing)

    2009-07-14 15:06:59

    以下部分是本人总结各大论坛faq和实际工作经验而来,属于<性能测试工具篇之loadrunner>部分内容。

    问题解答篇
    1.        监视服务器资源?
    在Controller的场景运行中,在Graphs中选中System Resource Graphs下Windows Resources节点,点击Windows Resources的右键菜单项add measurements,加入你要监视的机器名称。注意监视的服务器必须启动Remote Registry Service。
    2.        错误“the ip wizard does not support dhcp-enabled network cards.  your network card is either dhcp-enabled or configured with invalid settings”
    这是由于ip Spoofer不支持动态获得ip
    3.        找不到设置多IP运行方式
    必须在Cotroller中设置Expert Mode才能设置多ip方式。
    4.        解决lr编辑器中显示乱码的问题
    loadrunner7.8版本中,在Virtual User Generator设置Tool->record options->advanced中support charset选项。
    5.        LoadRunner7.5支持ie6的一个解决方法
    在ie中,tool->internet选项,切换到高级页面,设置http1.1设置,选择通过代理连接使用http1.1
    6.        修改WinSock协议生成的代码,参数化
        socket脚本的参数化数据在data.ws中.
    建议同样的业务录制两遍,比较一下两个脚本中的data.ws,找找需要参数化的地方.
    7.        分析结果中如何处理think time
    Analysis 可以设定 Filter,Filter 就可以把 think time 过略掉。
    8.        LoadRunner测试ftp模式的相关经验
    什么叫做PASV mode(被动模式传送)?他是如何工作的?
    FTP一般有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接。FTP服务程序一般支持两种不同的模式,一种是Port模式,一种是Passive模式(Pasv Mode)。

    先假设客户端为C,服务端为S.
    Port模式:
    当客户端C向服务端S连接后,使用的是Port模式,那么客户端C会发送一条命令告诉服务端S(客户端C在本地打开了一个端口N在等着你进行数据连接),当服务端S收到这个Port命令后 就会向客户端打开的那个端口N进行连接,这种数据连接就生成了。
    Pasv模式:
    当客户端C向服务端S连接后,服务端S会发信息给客户端C,这个信息是(服务端S在本地打开了一个端口M,你现在去连接我吧),当客户端C收到这个信息后,就可以向服务端S的M端口进行连接,连接成功后,数据连接也建立了。

    Actions()
    {
    char acTest[100];
    char acTest2[100];
    char* pcTest3;

    //生成发送的串
    sprintf(acTest,"kkkhhhh\r\n");
    //指定发送的串
    lrs_set_send_buffer ("socket0", acTest, strlen(acTest));
    //发送,由于之前运行了lrs_set_send_buffer,所以这里的"buf0"参数无效
    lrs_send("socket0", "buf0", LrsLastArg);

    //接收返回的串
    lrs_receive("socket0", "buf1", LrsLastArg);
    //把返回的串放到变量中
    pcTest3=lrs_get_received_buffer ("socket0", 0, -1, NULL);
    //对返回串中的数据操作
    if (pcTest3[0]=='k')
    {
    lrs_set_send_buffer ("socket0", pcTest3, strlen(pcTest3));
    lrs_send("socket0", "buf0", LrsLastArg);
    lrs_receive("socket0", "buf1", LrsLastArg);
    }

    //等待一段时间
    lr_think_time(6);

    return 0;
    }

    PASV模式

    data.ws:

    send buf25
    "TYPE I\r\n"
    recv buf26 20
    "200 Type set to I.\r\n"
    send buf27
    "PASV\r\n"
    recv buf28 50
    "227 Entering Passive Mode (10,19,119,104,133,58)\r\n"
    send buf29
    "RETR startweblogic\r\n"
    recv buf30 74
    "150 Binary data connection for startweblogic (10.3.9.3,2707) (53 bytes).\r"
    "\n"
    recv buf31 53
    "cd ./user_projects/mydomain\n"
    "nohup startWebLogic.sh &\n"
    recv buf32 31
    "226 Binary Transfer complete.\r\n"

    Actions:
    lrs_send("socket4", "buf25", LrsLastArg);
    lrs_receive("socket4", "buf26", LrsLastArg);
    lrs_send("socket4", "buf27", LrsLastArg);
    lrs_receive("socket4", "buf28", LrsLastArg);
    lrs_send("socket4", "buf29", LrsLastArg);
    lrs_create_socket("socket6", "TCP", "LocalHost=0", "RemoteHost=10.19.119.104:34106", LrsLastArg);
    lrs_receive("socket4", "buf30", LrsLastArg);
    lrs_receive("socket6", "buf31", LrsLastArg);
    lrs_close_socket("socket6");
    lrs_receive("socket4", "buf32", LrsLastArg);

    注意其中的buf27,发出PASV命令,server在buf28返回端口号“133,58”,133*256+58=34106,于是client端就有这一句“lrs_create_socket("socket6", "TCP", "LocalHost=0", "RemoteHost=10.19.119.104:34106"”,这里面的34106端口号就是这样计算出来的。以后每次lrs_create_socket的时候,就要从前面的PASV应答包中解出端口号来。

    非PASV模式

    data.ws:
    send buf28
    "TYPE I\r\n"
    recv buf29 20
    "200 Type set to I.\r\n"
    send buf30
    "PORT 10,3,9,3,11,96\r\n"
    recv buf31 30
    "200 PORT command successful.\r\n"
    send buf32
    "RETR startweblogic\r\n"
    recv buf33 74
    "150 Binary data connection for startweblogic (10.3.9.3,2912) (53 bytes).\r"
    "\n"
    recv buf34 53
    "cd ./user_projects/mydomain\n"
    "nohup startWebLogic.sh &\n"
    recv buf35 31
    "226 Binary Transfer complete.\r\n"

    Actions:
    lrs_send("socket4", "buf28", LrsLastArg);
    lrs_receive("socket4", "buf29", LrsLastArg);
    lrs_create_socket("socket7", "TCP", "LocalHost=0", "Backlog=1", LrsLastArg);
    lrs_send("socket4", "buf30", LrsLastArg);
    lrs_receive("socket4", "buf31", LrsLastArg);
    lrs_send("socket4", "buf32", LrsLastArg);
    lrs_receive("socket4", "buf33", LrsLastArg);
    lrs_accept_connection("socket7", "socket8");
    lrs_close_socket("socket7");
    lrs_receive("socket8", "buf34", LrsLastArg);
    lrs_close_socket("socket8");
    lrs_receive("socket4", "buf35", LrsLastArg);


    注意,buf30中的“11,96”就是client端监听的端口号,11*256+96=2912,而在此之前,client端是先lrs_create_socket了,也就是说,这个2912是在lrs_create_socket的时候生成的监听端口号,然后用发给server端,让server端连过来。此脚本要正常执行,就必须在lrs_create_socket之后取出socket7的监听端口,然后放到"PORT 10,3,9,3,11,96\r\n"包中(修改11和96),发给server端。
    9.        指定Scenario运行时间
    设定了start time,然后必须start scenio
  • Linux 常用的命令

    2009-02-06 17:03:00

    Linux 常用的命令可以分成五大类:

    1)文件管理类:cd、chmod、chown、chgrp、
    comm、cp、crypt、diff、file、find、ln、ls、mkdir、mv、od、pr、pwd、rm、rmdir。

    2)进程管理类:at、kill、mail、nice、nohup、ps、time、write、mesg

    3)文本加工类:
    cat、crypt、grep、norff、uniq、wc、sort、spell、tail、troff。

    4)软件开发类:cc、f77、
    login、logout、size、yacc、vi、emacs、dbs、lex、make、lint、ld。

    5)系统维护类:date、
    man、passwd、stty、tty、who。

  • JMeter 中的如何区分 Server Time 和 Network Time (转自JACKEI)

    2008-12-27 15:24:06

    在 LR 中是有一个“网页细分图”的,通过这个图,你可以比较容易的区分哪些请求的响应时间最长,如果响应时间过程,是消耗在server处理的时候,还是消耗在网络传输过程中——也就是所谓的 Server time 和 Network time。
    JMeter 并没有提供这么详细的区分——至少目前尚未发现,但是在 JMeter 的执行结果中也有一个字段可以利用一下。如果想看到这一项,首先要设置将 JMeter 运行结果保存到 XML 格式。

    JMeter.properties 中找到
    JMeter.save.saveservice.output_format=csv   改为
    JMeter.save.saveservice.output_format=xml

    重新启动 JMeter ,执行一个脚本并保存测试结果。
    使用任何一个文本编辑工具打开 .jtl 文件,内容如下:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <testResults version="1.2">
     3 <httpSample t="2969" lt="1906" ts="1159349557390" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" ng="5" na="5"/>
     4 <httpSample t="2797" lt="1719" ts="1159349557609" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-2" dt="text" ng="5" na="5"/>
     5 <httpSample t="2625" lt="1594" ts="1159349558015" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-4" dt="text" ng="5" na="5"/>
     6 <httpSample t="2843" lt="1812" ts="1159349557812" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-3" dt="text" ng="5" na="5"/>
     7 <httpSample t="2687" lt="1110" ts="1159349558218" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-5" dt="text" ng="5" na="5"/>
     8 <httpSample t="844" lt="391" ts="1159349560374" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" ng="5" na="5"/>
     9 <httpSample t="843" lt="437" ts="1159349560406" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-2" dt="text" ng="4" na="4"/>
    10 <httpSample t="781" lt="422" ts="1159349560640" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-4" dt="text" ng="3" na="3"/>
    11 <httpSample t="782" lt="391" ts="1159349560905" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-5" dt="text" ng="2" na="2"/>
    12 <httpSample t="1188" lt="485" ts="1159349560655" s="true" lb="http://jackei.cnblogs.com/" rc="200" rm="OK" tn="Thread Group 1-3" dt="text" ng="1" na="1"/>
    13 
    14 </testResults>
    15 

    找到 lt 这一项。

    结合 JMeter 的几篇文章和 email,解释一下 lt 的意思。
    lt = latency time (ms)

    JMeter 中执行一个脚本时,大概的过程如下:

    Start timer
    Send Request
    Wait for data
    Initial (first) response packet occurs - this is latency
    more data
    ...
    end of response
    Stop timer - this is the response time


    这里可以看到 lt 是接收到响应的第一个包的时间。
    而上面的 XML 文件中,t 这一项表示的是 elapsed time。也就是一个请求从发出到收到完整的响应的时间。
    那么 lt 就相当于 LR 中的 Server time,而 t-lt 就相当于 LR 中的 Netwrok time。

  • JMeter 通过 JDBC 访问 Oracle 和 MySQL (转自JACKEI)

    2008-12-27 11:47:53

    关键字:开源性能测试工具  JMeter  Oracle


    JMeter 的手册中描述了如何访问 MySQL,但是没有说明如何访问 Oracle。对于没有 Java 应用开发经验和对 Oracle 不是特别熟悉的朋友,可以参考这篇文章来简单、快速的配置好 JMeter 中的 JDBC 连接和 JDBC Request。


    步骤:

    1. 新建一个 Thread Group

    2. 新增 JDBC Connection Configuration

    3. 点击新增的 JDBC Connection Configuration ,需要修改的参数包括:

    • Variable Name:可以先填一个 Oracle,等会解释;

    • Database URLjdbc:oracle:thin:@{host_IP_or_machine_name}:{Oracle 监听器监听的端口}:{你的Oracle实例的名字}  ——大家要注意,“{ }” 大括号 只是我用来说明用的,在配置 JMeter 时,请将 “{ }” 大括号去掉 ^_^

    • JDBC Driver classoracle.jdbc.driver.OracleDriver

    • Username:访问上面Oracle实例的用户名

    • Password:对应的密码

    1. 新增一个 JDBC Request,需要修改的参数包括:

    • Variable Name:和上面的 JDBC Connection Configuration填写同样的内容。这里表示 JDBC Connection Configuration建立一个名为Oracle 的连接池,之后其它的JDBC Request都共用这个连接池;

    • Queryselect * from table_name 。 这里建议打开你的数据查询工具,输入一条SQL查询语句,保证可以执行看到结果的,然后copy 过来;

    1. 新增一个View Results Tree

    2. 点击 Run,查看结果。可以在Response data tab 看到响应的返回结果。


    注意事项:

    1. 执行时提示:No Suitable Driver

      在电脑上搜索一下 classes12.jar 这个文件,然后copy到JMeter的Lib目录下。如果找不到classes12.jar这个文件,就找找classes12.zip文件,然后把扩展名改为jar;

    2. 执行时提示:ORA-00911: invalid character

      确保你在JDBC Request里面的Query中输入的SQL语句是正确的。


    JMeter 用户手册中关于配置通过JDBC对数据库性能进行测试的部分如下:

    http://jakarta.apache.org/jmeter/usermanual/build-db-test-plan.html


    另外,我做了两个 Test Plan,一个是 for Oracle 的,一个是 for MySQL 的,你可以点击下面的链接下载。

     
    MySQL JDBC Driver (下载后需要自己把扩展名改为 .jar 然后放到 JMeter 的 lib 目录下)
     
  • 使用 JMeter 分布式性能测试 (转自jackei)

    2008-12-27 11:37:15

    作为一个纯 JAVA 的GUI应用,JMeter 对于CPU和内存的消耗还是很惊人的,所以当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起JAVA内存溢出的错误。不过,JMeter 也可以像 LoadRunner 一样通过使用多台机器运行所谓的 Agent 来分担 Load Generator 自身的压力,并借此来获取更大的并发用户数。根据 JMeter官方文档的署名,你需要自己完成这个配置,不过不用担心,这将非常简单 ^_^

    1.              在所有期望运行 JMeter 作为 Load Generator 的机器上安装 JMeter,并确定其中一台机器作为 Controller,其他的机器作为 Agent。然后运行所有 Agent 机器上的JMeter-server.bat文件——假定我们使用两台机器 192.168.0.1 和 192.168.0.2 作为 Agent;

    2.              在Controller 机器的 JMeter 安装目录下找到 bin 目录,再找到 JMeter.properties 这个文件,使用记事本或者其他文字编辑工具打开它;

    3.              在打开的文件中查找“remote_hosts=”这个字符串,你可以找到这样一行“remote_hosts=127.0.0.1”。其中的 127.0..0.1 表示运行 JMeter Agent 的机器,这里需要修改为“remote_hosts=192.168.0.1:1664,192.168.0.2:1664”——其中的 1664 为 JMeter 的 Controller 和 Agent 之间进行通讯的默认 RMI 端口号;

    4.              保存文件,并重新启动 Controller 机器上的 JMeter.bat,并进入 Run -> Remote Start 菜单项。看到啥了?^_^

     

    原文地址:http://www.cnblogs.com/jackei/archive/2006/09/14/504638.html
  • 各大银行网银转账手续费一览表

    2008-10-29 12:32:19

    各大银行网银转账手续费一览表
    http://www.51xkx.com/youyong/wangyin-zhuanzhang-shouxufei.html

     

    本行同城转账:

    工商:免费
    农行:免费
    中行:免费
    建行:免费
    交行:免费
    招商:免费
    广发:免费
    广大:免费
    邮政:按汇款的0.5 %收取费用,最高50元。
    民生:免费
    浦发:免费
    中信:免费

    本行异地转款:

    工商:转账金额的1%,最低1元/笔,最高50元/笔。
    农行:交易金额的0.4%;最低1元,最高20元。
    中行:一万元以下(含1万)5.5元,另加收汇划费的30%;1万元--10万元10.5元,另加收汇划费的30%;10万-50万15.5元,另加收汇划费的30%。
    建行:交易金额的0.25%,最低2元,最高25元。
    交行:转账金额的0.15%,最低1元/笔,最高50元/笔。
    招商:2元
    广发:同行账号之间划转按通存金额0.5‰收手续费,最高不超过20元,最低不少于1元。
    广大:手续费为汇款金额的0.5%,最低为2元,最高20元。
    邮政:按汇款的0.5 %收取费用,最高50元。
    民生:按汇款金额的0.1%收取手续费用,最低1元,最高50元。
    浦发:免费
    中信:按汇款金额的0.2%收取费用,最低10元,最高50元。

    跨行同城转账

    工商:转款金额的1%,最低1元/笔,最高50元/笔。
    农行:5000以下:2元/笔,5000元-5万:3元/笔,5万--10万:5元/笔,10万以上:8元/笔。
    中行:1万以下(含1万)5.5元,1万以上10.5元。
    建行:交易金额的0.5%,最低2元,最高25元。
    交行:转账金额的0.7%,最低2元/笔,最高50元。
    招商:按汇款金额的0.2%收取费用,最低2元,最高50元。
    广发:每笔收取划汇费5.5元。加收万分之五的通存费,最低1元,最高20元。
    广大:手续费为汇款金额的0.5%,最低为5元,最高50元。
    邮政:按汇款的0.5 %收取费用,最高50元。
    民生:2元
    浦发:按汇款金额的0.2%收取费用,最低2元,最高10元。
    中信:2元。

    跨行异地转账:

    工商:转账金额的1%,最低1元/笔,最高50元/笔。
    农行:交易金额的0.5%;最低1元,最高35元。
    中行:1玩以下(含1万)5.5元,1万以上10.5元。
    建行:交易金额的0.5%,最低2元,最高25元。
    交行:转账金额的0.7%,最低2元/笔,最高50元/笔。
    招商:按汇款金额的1%收取费用,最低10元,最高25元。
    广发:每笔收取汇划费5.5元,加收万分之五的通存费,最低1元,最高20元。
    广大:手续费为汇款金额的0.5%,最低5元,最高50元。
    邮政:按汇款的0.5 %收取费用,最高50元。
    民生:1W(含)他行人民币汇款,电子汇划费5元,手续费0.5元;1W--10W(含)他行人民币汇款,电子汇划费10元,手续费0.5元;10W--50W(含)他行人民币汇款,电子汇划费15元,手续费0.5元;50W-100W(含)他行人民币汇款,电子汇划费20元,手续费0.5元;大于100W,按照汇款金额的0.02‰(最高200元)收费
    浦发:按汇款金额的0.8%收取费用,最低2元,最高40元。
    中信:按汇款金额的1%收取费用,最低10元,最高50元。

    到账时间:

    工商:1,系统内实时到帐,50W以上次日。2,跨系统根据人民银行的时间。
    农行:这个电话没打通
    中行:1,系统内9:00-17:00实时到帐。2,跨行1-3个工作日。
    建行:1,系统内9:00-16:30实时到帐。2,跨行1-3个工作日。
    交行:系统内实时到帐,跨系统24小时工作日。
    招商:1,系统内:同城资金实时到帐,异地正常情况下资金可在2个工作日内到账。2,跨行:同城可在2个工作日内到账。异地正常情况下资金可在5个工作日内到账。
    广发:1,系统内:1-2个工作日。2,跨行1-2个工作日。
    广大:1,系统内1W以下实时到帐,1W以上次日到账。2,跨行1-2个工作日。
    邮政:暂未确定
    民生:系统内实时。1,同城票交:周一至周五工作日运行,1至2个工作日到账。2,异地汇款:周一至周五工作日运行,3至5个工作日到账。3,大金额实时支付:周一至周五工作日早8:30--下午17:00运行,半个小时到达对方总行。4,小金额实时支付:7X24小时运行,2个小时内到达对方总行。
    浦发:系统内实时到帐,跨系统24小时工作日。
    中信:所有都是1-2个工作日。

    转账限额:

    工商:单笔:50W 。日累计:250W
    农行:暂未确定
    中行:1,系统内单笔:20W,日累计:100W。跨行单笔:2W,日累计:50W。
    建行:1,系统内单笔:20W,日累计:100W。2,跨行单笔:20W,日累计:100W。
    交行:1.系统内单笔:100W,日累计:100W。2,跨行单笔:10W,日累计:100W。
    招商:无限制
    广发:无限制
    广大:1,系统内5000W。2,跨行10W。
    邮政:暂未确定
    民生:单笔:50W,日累计:200W
    浦发:手机:5W。证书:200W
    中信:无限制

    有无年费

    工商:证书客户每户12元,其他免费。
    农行:证书客户每户12元,其他免费。
    中行:免费
    建行:普通用户免费,高级用户36元。
    交行:免费
    招商:免费
    广发:免费
    广大:免费
    邮政:暂未确定
    民生:免费
    浦发:免费
    中信:免费

    Key盘费用

    工商:60元
    农行:50元
    中行:60元
    建行:60元
    交行:70元
    招商:60元
    广发:50元
    广大:暂未确定
    邮政:暂未确定
    民生:70元
    浦发:36元
    中信:80元

621/41234>
Open Toolbar