发布新日志

  • SQL常用命令使用方法

    2007-06-09 08:25:45

    |SQL常用命令使用方法:|

    获取服务器当前时间:Select  GETDATE()  

    (1) 数据记录筛选:

    sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"

    sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"

    sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"

    sql="select * from 数据表 where 字段名 in ('1','2','3')"

    sql="select * from 数据表 where 字段名 between 1 and 2"

    (2) 更新数据记录:

    sql="update 数据表 set 字段名=字段值 where 条件表达式"

    sql="update 数据表 set 字段1=1,字段2=2 …… 字段n=n where 条件表达式"

    (3) 删除数据记录:

    sql="delete from 数据表 where 条件表达式"

    sql="delete from 数据表" (将数据表所有记录删除)

    (4) 添加数据记录:

    2insert语句:1)带字段名2)不带字段名(即针对所有的字段,并进行赋值,值不确定为null

    sql="insert into 数据表 (字段1,字段2,字段3 …) values (1,2,3 …)"

    也可以不写上字段名:

    sql=”insert into 包装 values('009','恐龙',2.3,null,null)”//前提:列名或所提供值的数目与表定义必须匹配

    sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)   //前提:列名或所提供值的数目与表定义必须匹配

    (5) 数据记录统计函数:

    AVG(字段名) 得出一个表格栏平均值

    COUNT(*¦字段名) 对数据行数的统计或对某一栏有值的数据行数统计

    MAX(字段名) 取得一个表格栏最大的值

    MIN(字段名) 取得一个表格栏最小的值

    SUM(字段名) 把数据栏的值相加

    引用以上函数的方法:

    sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"

    set rs=conn.excute(sql)

    rs("别名") 获取统的计值,其它函数运用同上。

    (5) 数据表的建立和删除:

    CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )

    例:CREATE TABLE tab01(name varchar(50),datetime default now())

    DROP TABLE 数据表名称 (永久性删除一个数据表)

    //字段类型  char:数字,用于ID,比较短的名称如州,邮编,电话等char(3)

                Varchar:字符,用于文字等,varchar(20)||varchar(20) null

                Money:价格,money|money null可允许为空||money not null不允许为空

                Image:照片,image null

                Int:年份,销售数量,int

                Smallint:月份,samllint

                Datetime:日期,datetime||datetime null

  • Insert,Select,Update和Delet!!

    2007-06-09 08:23:59

    Insert,Select,Update和Delete

    2007-6-07

    掌握SQL四条最基本的数据操作语句:InsertSelectUpdateDelete

       练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。

      在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句数据操作语言(DML)语句进行处理。

      SQL中有四种基本的DML操作:INSERTSELECTUPDATEDELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。

      INSERT语句

      用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:

      INSERT INTO EMPLOYEES VALUES

       ('Smith','John','1980-06-10',

       'Los Angles',16,45000);

      通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME……以此类推。

      我们说过系统会试着将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。

      如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。

       回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。

      同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。

      对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。

      既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:

      INSERT INTO EMPLOYEES VALUES

       ('Bunyan','Paul','1970-07-04',

       'Boston',12,70000);

      INSERT INTO EMPLOYEES VALUES

       ('John','Adams','1992-01-21',

       'Boston',20,100000);

      INSERT INTO EMPLOYEES VALUES

       ('Smith','Pocahontas','1976-04-06',

       'Los Angles',12,100000);

      INSERT INTO EMPLOYEES VALUES

       ('Smith','Bessie','1940-05-02',

       'Boston',5,200000);

      INSERT INTO EMPLOYEES VALUES

       ('Jones','Davy','1970-10-10',

       'Boston',8,45000);

      INSERT INTO EMPLOYEES VALUES

       ('Jones','Indiana','1992-02-01',

       'Chicago',NULL,NULL);

      在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULLSQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。

      有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:

      INSERT INTO EMPLOYEES(

       FIRST_NAME, LAST_NAME,

       HIRE_DATE, BRANCH_OFFICE)

      VALUES(

       'Indiana','Jones',

       '1992-02-01','Indianapolis');

      这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAMELAST_NAME项(这两项规定不能为空),SQL操作将失败。

      让我们来看一看上述INSERT语句的语法图:

      INSERT INTO table

       [(column { ,column})]

      VALUES

       (columnvalue [{,columnvalue}]);

      和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。

      SELECT语句

      SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。

      SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQLdirect SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。

      SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算选择(或称限制),但实际上它也可以完成其他两种关系运算—“投影连接SELECT语句还可以完成聚合计算并对数据进行排序。

      SELECT语句最简单的语法如下:

      SELECT columns FROM tables;

      当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。

      让我们看一下使用图1EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。

      假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:

      SELECT BRANCH_OFFICE FROM EMPLOYEES;

      以上SELECT语句的执行将产生如图2中表2所示的结果。

      由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:(目的:去掉查询结果中相同的项,仅保留着一项)

      SELECT DISTINCT BRANCH_OFFICE

      FROM EMPLOYEES;

      这次查询的结果如表3所示。

      现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:

      SELECT DISTINCT BRANCH_OFFICE

      FROM EMPLOYEES

      ORDER BY BRANCH_OFFICE ASC;

      这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC

      同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。

      假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:

      SELECT BRANCH_OFFICE,FIRST_NAME,

       LAST_NAME,SALARY,HIRE_DATE

      FROM EMPLOYEES

      ORDER BY SALARY DESC,

       HIRE_DATE DESC;//按照工资和聘用时间来排序(可以按多个条件来排序!!)

      这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。

      将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:

      SELECT * FROM EMPLOYEES;

      这次查询返回整个EMPLOYEES表,如表1所示。

       下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):

      SELECT [DISTINCT]

       (column [{, columns}])| *

      FROM table [ {, table}]

      [ORDER BY column [ASC] | DESC

       [ {, column [ASC] | DESC }]];

      定义选择标准

      在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:

      SELECT columns FROM tables [WHERE predicates];

      WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:

      SELECT * FROM EMPLOYEES

      WHERE LAST_NAME = 'Jones';

      LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。

      使用最多的六种比较

      我们上例中的断言包括一种基于等值的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:

      等于 =

      不等于 <>

      小于 <

      大于 >

      小于或等于 <=

      大于或等于 >=

      下面给出了不是基于等值比较的一个例子:

      SELECT * FROM EMPLOYEES

      WHERE SALARY > 50000;

      这一查询将返回年薪高于$50,000.00的职员(参见表7)。

      逻辑连接符

      有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看Davy Jones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符ANDORNOT。为了只得到职员Davy Jones的记录,用户可以输入如下语句:

      SELECT * FROM EMPLOYEES

      WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';

      在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符:

      SELECT * FROM EMPLOYEES

      WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';

      有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询:

      SELECT * FROM EMPLOYEES

    WHERE NOT(BRANCH_OFFICE = 'Boston');

    或者写成

    SELECT * FROM EMPLOYEES

    WHERE BRANCH_OFFICE <> 'Boston';

      关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。

      断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:

      SELECT * FROM EMPLOYEES

      WHERE (LAST_NAME = 'Jones'

      AND FIRST_NAME = 'Indiana')

      OR (LAST_NAME = 'Smith'

      AND FIRST_NAME = 'Bessie');

      SQL沿用数学上标准的表达式求值的约定圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。

      以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新:

      SELECT [DISTINCT]

       (column [{, column } ] )| *

  • 测试工具大全(各类测试工具简介)

    2007-06-08 11:41:04

    企业级自动化测试工具WinRunner

    图片可在新窗口打开 style="CURSOR: pointer" src="http://images.csdn.net/20061215/winrunner.jpg"> 

    提名理由:Mercury Interactive公司的WinRunner是一种企业级的功能测试工具,用于检测应用程序是否能够达到预期的功能及正常运行。通过自动录制、检测和回放用户的应用操作,WinRunner能够有效地帮助测试人员对复杂的企业级应用的不同发布版进行测试,提高测试人员的工作效率和质量,确保跨平台的、复杂的企业级应用无故障发布及长期稳定运行。

    工业标准级负载测试工具Loadrunner

     

    提名理由:LoadRunner 是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。

    全球测试管理系统testdirector

     

    提名理由:TestDirector 是业界第一个基于Web的测试管理系统,它可以在您公司内部或外部进行全球范围内测试的管理。通过在一个整体的应用系统中集成了测试管理的各个部分,包括需求管理,测试计划,测试执行以及错误跟踪等功能,TestDirector极大地加速了测试过程。

    功能测试工具Rational Robot

     

    提名理由:IBM Rational Robot 是业界最顶尖的功能测试工具,它甚至可以在测试人员学习高级脚本技术之前帮助其进行成功的测试。它集成在测试人员的桌面 IBM Rational TestManager 上,在这里测试人员可以计划、组织、执行、管理和报告所有测试活动,包括手动测试报告。这种测试和管理的双重功能是自动化测试的理想开始。

    单元测试工具xUnit系列

     

    提名理由:目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(Php )等等。该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。

    功能测试工具SilkTest

     

    提名理由:Borland SilkTest 2006属于软件功能测试工具,是Borland公司所提出软件质量管理解决方案的套件之一。这个工具采用精灵设定与自动化执行测试,无论是程序设计新手或资深的专家都能快速建立功能测试,并分析功能错误。 

    性能测试工具WAS

     

    提名理由:Microsoft Web Application Stress Tool 是由微软的网站测试人员所开发,专门用来进行实际网站压力测试的一套工具。透过这套功能强大的压力测试工具,您可以使用少量的Client端计算机仿真大量用户上线对网站服务所可能造成的影响。

    自动化白盒测试工具Jtest

     

    提名理由:Jtest是parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。parasoft同时出品的还有C++ test,是一款C/C++白盒测试工具。

    功能和性能测试的工具JMeter

     

    提名理由:JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现。

    性能测试和分析工具WEBLODE

     

    提名理由:webload是RadView公司推出的一个性能测试和分析工具,它让web应用程序开发者自动执行压力测试;webload通过模拟真实用户的操作,生成压力负载来测试web的性能。

     测试工具大全

    Author: Vince

    工具类别 工具名称 生产厂商 相关网站
    通用功能自动化测试工具 Winrunner Mercury
    Quicktest pro Mercury
    Xrunner Mercury
    QARun Compuware
    TestPartner Compuware
    WebKing Parasoft http://www.parasoft.com
    Robot IBM Rational http://www.ibm.com/cn
    Visual Test IBM Rational http://www.ibm.com/cn
    Functional Tester IBM Rational http://www.ibm.com/cn
    SilkTest Segue
    SilkTest International Segue
    e-Tester Empirix
    WebFT Radview
    TestComplete AutomatedQA
    QA Wizard Seapine
    Software EggPlant RedStone
    Test Edition Microsoft Visual Studio
    PureTest Minq
    Autotester Autotester
    Testbench400 Original Software
    TestExpert VEReCOMM
    TestRunner Qronus
    TTCN suite Telelogic http://www.telelogic.com.cn
    QC/Replay Centerline
    Web AutoTester
    eValid Software Research
    WebART OCLC
    MaxQ 开源
    WebInject 开源
    Marathon 开源
    性能测试/监控工具  LoadRunner Mercury
    SiteScope Mercury
    Topaz Mercury
    QaLoad Compuware
    PerformaSure/benchmark Quest
    Silkperformer Segue
    Silkperformer Lite Segue
    SilkCentralTM Performance Manager Segue
    e-Load Empirix
    Robot IBM Rational http://www.ibm.com/cn
    Performance Tester IBM Rational http://www.ibm.com/cn
    WebLoad RadView
    Web applicaton stress tool  Microsoft
    Application center test Microsoft
    PureLoad Minq
    Athene APR Metron
    ForeCast Facilita
    Impact/Impact for CBT Cyrano
    Berkeley Laboratory sniffer Lawrence
    Jmeter 开源
    openSTA 开源
    Siege 开源
    StressMark 开源
    DBMonster 开源
    白盒测试/代码分析工具  VcTester ezTester http://www.eztester.com
    Jtest Parasoft http://www.parasoft.com
    C++test Parasoft http://www.parasoft.com
    SOA test Parasoft http://www.parasoft.com
    .test Parasoft http://www.parasoft.com
    Codewizard Parasoft http://www.parasoft.com
    Insure++ Parasoft http://www.parasoft.com
    DataRecon Parasoft http://www.parasoft.com
    Numega devpartner studio Compuware
    DevPartnerJavaEdition Compuware
    BoundsChecker Compuware
    SmartCheck Compuware
    DBPartner Compuware
    Bean-test Empirix
    Aqtime AutomatedQA
    QESatJava AutomatedQA
    Visual Unit Unitware
    PC-lint Gimpel Software
    Macabe Macabe
    Optimizeit Suite Borland
    JProbe Suite Quest Software
    Application assurance suite Quest Software
    Sql optimizer Quest Software
    Jprofiler ej-technologies
    workbench Cyrano
    Logiscope TeleLogic http://www.telelogic.com.cn
    rulecheck TeleLogic http://www.telelogic.com.cn
    SilkPerformer Component Test Edition Segue
    Purifyplus IBM rational http://www.ibm.com/cn
    Rational Test Realtime IBM rational http://www.ibm.com/cn
    junit 开源
    cactus 开源
    Hansel 开源
    TestNG 开源
    StrutsTestCase 开源
    JFCUnit 开源
    Httpunit 开源
    Dunit 开源
    cppunit 开源 http://sourceforge.net/projects/cppunit
    Nunit 开源
    Xunit 开源
    JTR 开源
    MallocDebug Linux平台工具
    Valgrind Linux平台工具
    Kcachegrind Linux平台工具
    dmalloc Linux平台工具
    ElectricFence Linux平台工具
    LeakTracer Linux平台工具
    memprof Linux平台工具
    ccmalloc Linux平台工具
    mprof Linux平台工具
    yamd Linux平台工具
    njamd Linux平台工具
    mpatrol Linux平台工具
    嵌入式测试工具 VcTester ezTester http://www.eztester.com
    codetest Metrowerks
    Cantata/cantana++ IPL
    IceMaster Reflex Technology
    System test Reflex Technology
    scorecast DDC-I
    Testquest Testquest
    UniText ATTOL
    vectorcast Vector software
    testrunner Qronus
    Logiscope Telelogic http://www.telelogic.com.cn
    测试管理工具 TestDirector(QualityCenter) Mercury
    QADirector Compuware
    certify Worksoft
    Product manager Aimware
    SilkCentral Test Manager Segue
    Doors Telelogic http://www.telelogic.com.cn
    e-manager Empirix
    testmanager IBM Rational http://www.ibm.com/cn
    TestView Manager RadView
    Professional T-Plan
    缺陷管理工具 TestDirector(QualityCenter) Mercury
    ClearQuest IBM Rational http://www.ibm.com/cn
    TrackRecord Compuware
    TestTrack pro Seapine
    TrueTrack McCabe
    Devtrack Techexcel
    Notes IBM Lotus
    SilkCentral Issue Manager Segue
    PVCS Tracker Merant
    AR System Remedy
    URTrack LealSoft
    Butterfly Hansky
    Bugzilla 开源
    Mantis 开源
    JIRA 开源
    BugFree 开源
    配置管理工具 ClearCase IBM Rational http://www.ibm.com/cn
    PVCS Version Manager Merant
    VCS Diamond
    StarTeam Borland
    Perforce Perforce
    TRUEchange McCabe
    SYNERGY CM  Telelogic http://www.telelogic.com.cn
    VSS Microsoft
    Firefly Hansky
    CVS Subversion
    SCCS RCS
    CCC/Harvest Computer Associates

  • 通过PING命令中的TTL来判断对方操作系统

    2007-06-08 11:37:58

    通过PING命令中的TTL来判断对方操作系统

    2007-06-02 15:40:48 / 个人分类:网络技术

    通过PING命令中的TTL来判断对方操作系统

    简单来说,TTL全程Time to Live,意思就是生存周期。
    首先要说明ping命令是使用的网络层协议ICMP,所以TTL指的是一个网络层的网络数据包(package)的生存周期,这句话不懂的先回去复习OSI7层协议去。

    第一个问题,为什么要有生存周期这个概念。

    很显然,一个package从一台机器到另一台机器中间需要经过很长的路径,显然这个路径不是单一的,是很复杂的,并且很可能存在环路。如果一个数据包在传输过程中进入了环路,如果不终止它的话,它会一直循环下去,如果很多个数据包都这样循环的话,那对于网络来说这就是灾难了。所以需要在包中设置这样一个值,包在每经过一个节点,将这个值减1,反复这样操作,最终可能造成2个结果:包在这个值还为正数的时候到达了目的地,或者是在经过一定数量的节点后,这个值减为了0。前者代表完成了一次正常的传输,后者代表包可能选择了一条非常长的路径甚至是进入了环路,这显然不是我们期望的,所以在这个值为0的时候,网络设备将不会再传递这个包而是直接将他抛弃,并发送一个通知给包的源地址,说这个包已死。
    其实TTL值这个东西本身并代表不了什么,对于使用者来说,关心的问题应该是包是否到达了目的地而不是经过了几个节点后到达。但是TTL值还是可以得到有意思的信息的。

    每个操作系统对TTL值得定义都不同,这个值甚至可以通过修改某些系统的网络参数来修改,例如Win2000默认为128,通过注册表也可以修改。而 Linux大多定义为64。不过一般来说,很少有人会去修改自己机器的这个值的,这就给了我们机会可以通过ping的回显TTL来大体判断一台机器是什么操作系统。

    以我公司2台机器为例
    看如下命令
    D:\Documents and Settings\hx>ping 61.152.93.131

    Pinging 61.152.93.131 with 32 bytes of data:

    Reply from 61.152.93.131: bytes=32 time=21ms TTL=118
    Reply from 61.152.93.131: bytes=32 time=19ms TTL=118
    Reply from 61.152.93.131: bytes=32 time=18ms TTL=118
    Reply from 61.152.93.131: bytes=32 time=22ms TTL=118

    Ping statistics for 61.152.93.131:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss
    Approximate round trip times in milli-seconds:
    Minimum = 18ms, Maximum = 22ms, Average = 20ms

    D:\Documents and Settings\hx>ping 61.152.104.40

    Pinging 61.152.104.40 with 32 bytes of data:

    Reply from 61.152.104.40: bytes=32 time=28ms TTL=54
    Reply from 61.152.104.40: bytes=32 time=18ms TTL=54
    Reply from 61.152.104.40: bytes=32 time=18ms TTL=54
    Reply from 61.152.104.40: bytes=32 time=13ms TTL=54

    Ping statistics for 61.152.104.40:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss
    Approximate round trip times in milli-seconds:
    Minimum = 13ms, Maximum = 28ms, Average = 19ms
    第一台TTL为118,则基本可以判断这是一台Windows机器,从我的机器到这台机器经过了10个节点,因为128-118=10。而第二台应该是台Linux,理由一样64-54=10。
    了解了上面的东西,可能有人会有一些疑问,例如以下:

    1,不是说包可能走很多路径吗,为什么我看到的4个包TTL都是一样的,没有出现不同?

    这是由于包经过的路径是经过了一些最优选择算法来定下来的,在网络拓扑稳定一段时间后,包的路由路径也会相对稳定在一个最短路径上。具体怎么算出来的要去研究路由算法了,不在讨论之列。

    2,对于上面例子第二台机器,为什么不认为它是经过了74个节点的Windows机器?因为128-74=54。

    对于这个问题,我们要引入另外一个很好的ICMP协议工具。不过首先要声明的是,一个包经过74个节点这个有些恐怖,这样的路径还是不用为好。

    要介绍的这个工具是tracert(*nix下为traceroute),让我们来看对上面的第二台机器用这个命令的结果
    D:\Documents and Settings\hx>tracert 61.152.104.40

    Tracing route to 61.152.104.40 over a maximum of 30 hops

    1 13 ms 16 ms 9 ms 10.120.32.1
    2 9 ms 9 ms 11 ms 219.233.244.105
    3 12 ms 10 ms 10 ms 219.233.238.173
    4 15 ms 15 ms 17 ms 219.233.238.13
    5 14 ms 19 ms 19 ms 202.96.222.73
    6 14 ms 17 ms 13 ms 202.96.222.121
    7 14 ms 15 ms 14 ms 61.152.81.86
    8 15 ms 14 ms 13 ms 61.152.87.162
    9 16 ms 16 ms 28 ms 61.152.99.26
    10 12 ms 13 ms 18 ms 61.152.99.94
    11 14 ms 18 ms 16 ms 61.152.104.40

    Trace complete.

    从这个命令的结果能够看到从我的机器到服务器所走的路由,确实是11个节点(上面说10个好像是我犯了忘了算0的错误了,应该是64-54+1,嘿嘿),而不是128的TTL经过了70多个节点。
    既然已经说到这里了,不妨顺便说说关于这两个ICMP命令的高级一点的东西。
    首先是ping命令,其实ping有这样一个参数,可以无视操作系统默认TTL值而使用自己定义的值来发送ICMP Request包。
    例如还是用那台Linux机器,用以下命令:
    D:\Documents and Settings\hx>ping 61.152.104.40 -i 11

    Pinging 61.152.104.40 with 32 bytes of data:

    Reply from 61.152.104.40: bytes=32 time=10ms TTL=54
    Reply from 61.152.104.40: bytes=32 time=13ms TTL=54
    Reply from 61.152.104.40: bytes=32 time=10ms TTL=54
    Reply from 61.152.104.40: bytes=32 time=13ms TTL=54

    Ping statistics for 61.152.104.40:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
    Minimum = 10ms, Maximum = 13ms, Average = 11ms

    D:\Documents and Settings\hx>
    这个命令我们定义了发包的TTL为11,而前面我们知道,我到这台服务器是要经过11个节点的,所以这个输出和以前没什么不同。现在再用这个试试看:
    D:\Documents and Settings\hx>ping 61.152.104.40 -i 10

    Pinging 61.152.104.40 with 32 bytes of data:

    Reply from 61.152.99.94: TTL expired in transit.
    Reply from 61.152.99.94: TTL expired in transit.
    Reply from 61.152.99.94: TTL expired in transit.
    Reply from 61.152.99.94: TTL expired in transit.

    Ping statistics for 61.152.104.40:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
    Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

    D:\Documents and Settings\hx>

    可以看到,结果不一样了,我定义了TTL为10来发包,结果是TTL expired in transit.就是说在到达服务器之前这个包的生命周期就结束了。注意看这句话前面的ip,这个ip恰好是我们前面tracert结果到服务器之前的最后1个ip,包的TTL就是在这里减少到0了,根据我们前面的讨论,当TTL减为0时设备会丢弃包并发送一个TTL过期的ICMP反馈给源地址,这里的结果就是最好的证明。
    通过这里再次又证明了从我机器到服务器是经过了11个节点而不是70多个,呵呵。
    最后再巩固一下知识,有人可能觉得tracer这个命令很神奇,可以发现一个包所经过的路由路径。其实这个命令的原理就在我们上面的讨论中。

    想象一下,如果我给目的服务器发送一个TTL为1的包,结果会怎样?
    根据前面的讨论,在包港出发的第一个节点,TTL就会减少为0,这时这个节点就会回应TTL失效的反馈,这个回应包含了设备本身的ip地址,这样我们就得到了路由路径的第一个节点的地址。
    因此,我们继续发送TTL=2的包,也就受到第二个节点的TTL失效回应

    依次类推,我们一个一个的发现,当最终返回的结果不是TTL失效而是ICMP Response的时候,我们的tracert也就结束了,就是这么简单。


    顺便补一句ping命令还有个-n的参数指定要发包的数量,指定了这个数字就会按照你的要求来发包了而不是默认的4个包。如果使用-t参数的话,命令会一直发包直到你强行中止它。


    WINDOWS NT/2000   TTL:128
    WINDOWS 95/98     TTL:32
    UNIX              TTL:255
    LINUX             TTL:64

    在windows下面可以通过修改注册表的方式修改TTL的默认值

    位于:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
    找到defaultttl 修改为10进制的(x)即可.

  • 软件测试常用单词

    2007-06-08 11:35:57

    软件测试常用单词

    2007-06-06 17:03:13

    1.静态测试:Non-Execution-Based Testing或Static testing
            代码走查:Walkthrough
    代码审查:Code Inspection
    技术评审:Review
    2.动态测试:Execution-Based Testing
    3.白盒测试:White-Box Testing
    4.黑盒测试:Black-Box Testing
    5.灰盒测试:Gray-Box Testing
    6.软件质量保证SQA:Software Quality Assurance
    7.软件开发生命周期:Software Development
    Life Cycle
    8.冒烟测试:Smoke Test
    9.回归测试:Regression Test
    10.
    功能测试:Function Testing
    11.
    性能测试:Performance Testing
    12.压力测试:Stress Testing
    13.负载测试:Volume Testing
    14.易用性测试:Usability Testing
    15.安装测试:Installation Testing
    16.界面测试:UI Testing
    17.配置测试:Configuration Testing
    18.文档测试:Documentation Testing
    19.兼容性测试:Compatibility Testing
    20.
    安全性测试:Security Testing
    21.恢复测试:Recovery Testing
    22.
    单元测试:Unit Tes
    23.集成测试:Integration Test
    24.系统测试:System Test
    25.验收测试:Acceptance Test
    26.测试计划应包括:
    测试对象:The Test Objectives,
    测试范围: The Test  Scope,
    测试策略: The Test  Strategy
    测试方法: The Test  Approach,
    测试过程: The test procedures,
    测试环境: The Test Environment,
    测试完成标准:The test Completion criteria
                                           
    测试用例:The Test Cases
                                            测试进度表:The Test Schedules
                                            风险:Risks
                                            Etc
    27.主测试计划: a master test plan
    28.需求规格说明书:The Test Specifications
    29.需求分析阶段:The Requirements Phase
    30.接口:Interface
    31.最终用户:The End User
    31.正式的测试环境:Formal Test Environment
    32.确认需求:Verifying The Requirements
    33.有分歧的需求:Ambiguous Requirements
    34.运行和维护:Operation and Maintenance.
    35.可复用性:Reusability
    36.可靠性: Reliability/Availability
    37.电机电子工程师协会IEEE:The Institute of Electrical and Electronics Engineers)  
    38.要从以下几方面测试软件:
    正确性:Correctness
    实用性:Utility
    性能:Performance
    健壮性:Robustness
    可靠性:Reliability

    关于Bugzilla:
    1.Bug按严重程度(Severity)分为:
    Blocker,阻碍开发和/或测试工作
                  Critical,死机,丢失数据,内存溢出
                 Major,较大的功能缺陷
                 Normal,普通的功能缺陷
                Minor,较轻的功能缺陷
    Trivial,产品外观上的问题或一些不影响使用的小毛病,如菜单或对话框中的文字拼写或字体问题等等
            Enhancement,建议或意见
    2.Bug按报告状态分类(Status)
       待确认的(Unconfirmed)
             新提交的(New)
            已分配的(Assigned)
       问题未解决的(Reopened)
             待返测的(Resolved)
             待归档的(Verified)
             已归档的(Closed)
    3.Bug处理意见(Resolution)
                          已修改的(Fixed)
    不是问题(Invalid)
                           无法修改(Wontfix)
            以后版本解决(Later)
                     保留(Remind)
                            重复(Duplicate)
                     无法重现(Worksforme)

  • 网络接入技术之ISDN

    2007-06-08 11:31:47

    网络接入技术之ISDN

      ISDN这个名词对于大多数网民来说并不陌生,但它的使用群体却并没有预计的那么乐观。ISDN作为一种数据通讯手段,从技术上来说十分成熟,也已经发展了20多年,国外更是得到了广泛应用,由于国外的网络接入技术发展比较快,因此近两年在国外ISDN大有被淘汰之势。但ISDN在我国确是最近两年才“爆炒”起来的“东东”,大家对它的评论也是褒贬不一。

      定义

      ISDN(Integrated Service Digital NeTwork)中文名称是综合业务数字网,通俗称为“一线通”,它采用数字传输和数字交换技术,将电话、传真、数据、图像等多种业务综合在一个统一的数字网络中进行传输和处理。ISDN起源于1967年,CCITT(现ITU-T)对ISDN是这样定义的:ISDN是以综合数字电话IDN为基础发展演变而成的通信网,能够提供端到端的数字连接,用来支持包括话音在内的多种电信业务,用户能够通过有限的一组标准化的多用途用户网络接口接入网内。利用一条ISDN用户线路,就可以在上网的同时拨打电话、收发传真,就像两条电话线一样。实际上ISDN理论可以提供8个终端同时通信,但因为目前设备限制,所以暂提供两个终端同时通信。

      特点

      ISDN最吸引人的地方就是在上网的同时可以接听电话,这个功能对于V.90 Modem的使用者来说是望尘莫及的。这是因为ISDN基本速率接口有两条64Kbps的信息通路和一条16Kbps的信令通路,简称2B+D,当有电话拨入时,它就会自动释放一个B信道来进行电话的接听。

      传统的调制解调器传输的是模拟信号,所以需要有一个“调制”和“解调”的过程,而ISDN的传输则是纯数字的过程,通信质量大大提高,经测试表明ISDN数据传输比特误码性能比传统电话线路至少改善十倍,此外它的连接速度非常快,通常只有几秒钟就可以拨通。

      在价格上看如果只使用一个B信道,那么它的费用和我们用普通Modem的花费是一样的,如果同时打开了2个B信道进行通信的话,那就需要2倍的花费,这与使用两条电话线是一样的,只是只交一份的固定月租费而已,从这点上看使用ISDN还是比传统的Modem有一些优势,毕竟稳定的64K连接比50K左右的“老猫”强了很多。当然安装ISDN需要有一个初装费,无论是改装还是加装都需要花费一笔额外的费用,但是这个费用全国没有统一的标准,各地都有各地的“优惠”政策,一般开销在几百乃至数千元不等。

  • 网络接入技术之DDN

    2007-06-08 11:30:15

    网络接入技术之DDN

      DDN虽然算不上什么新兴的“东东”,但这种接入方式却并不为大多数网民所熟悉,因为DDN更多的是面向集团公司等大客户,家庭上网用DDN似乎并不多见,事实上DDN也不仅仅可以用来上网,那么DDN是不是如此的高贵和神秘呢?下面就给大家简单地介绍一下。

      DDN简介

      DDN是英文Digital Data Network的缩写,是随着数据通信业务的发展而迅速发展起来的一种新型网络。DDN的主干网传输媒介有光纤、数字微波、卫星信道等;到用户端多使用普通电缆和双绞线。DDN利用数字信道传输数据信号这与传统的模拟信道相比有本质的区别,DDN传输的数据具有质量高、速度快、网络时延小等一系列的优点,特别适合于计算机主机之间、局域网之间、计算机主机与远程终端之间的大容量、多媒体、中高速通信的传输,DDN可以说是我国的中高速信息国道。

      DDN特点

      由于DDN是采用数字传输信道传输数据信号的通信网,因此,它可提供点对点、点对多点透明传输的数据专线出租电路,为用户传输数据、图像、声音等信息。使用DDN具有如下特点:

      1、DDN是透明传输网。由于DDN将数字通信的规则和协议寄托在智能化程度的用户终端来完成,本身不受任何规程的约束,所以是全透明网,是一种面向各类数据用户的公用通信网,它可以看成是一个大型的中继开放系统。

      2、传输速率高,网络时延小。由于DDN用户数据信息是根据事先的协议,在固定通道带宽和预先约定速率的情况下顺序连接网络,这样只需按时隙通道就可以准确地将数据信息送到目的地,从而免去了目的终端对信息的重组,因此减少了时延。

      3、DDN可提供灵活的连接方式。DDN可以支持数据、语音、图像传输等多种业务,它不仅可以和客户终端设备进行连接,而且还可以和用户网络进行连接,为用户网络互连提供灵活的组网环境。DDN的通信速率可根据用户需要在N×64Kbps(N=1~32)之间进行选择,当然速度越快租用费用也就越高。

      4、灵活的网络管理系统。DDN采用的图形化网络管理系统可以实时地收集网络内发生的故障并进行故障分析和定位。通过网络图形颜色的变化,显示出故障点的信息,其中包括网络设备的地点、网络设备的电路板编号及端口位置,从而提醒维护人员及时准确地排除故障。

      5、保密性高。由于DDN专线提供点到点的通信,信道固定分配,保证通信的可靠性,不会受其他客户使用情况的影响,因此通信保密性强,特别适合金融、保险客户的需要。

      总之,DDN将数字通信技术、计算机技术、光纤通信技术以及数字交叉连接技术有机地结合在一起,提供了高速度、高质量的通信环境,为用户规划、建立自己安全、高效的专用数据网络提供了条件,因此在多种接入方式中深受广大客户的青睐。

      DDN的申请及费用

      DDN的租用申请需要到当地的数据通信部门办理入网登记等手续,客户从申请到开通,需要做的事情并不多,因为当地的电信部门对于DDN的服务会比较到位。DDN的收费一般采用的都是包月制度,这与我们用拨号上网的记费方式不同,使用DDN可以一天24小时泡在上面了,但DDN的租用费确实是不低的,普通个人用户根本负担不起,个人也没有必要使用DDN这

      种方式,它面向的是集团公司等需要综合运用的单位,因此有特定的客户群就会有相应的价格,DDN按照不同的速率带宽收费也采用不同的价格。例如在中国电信申请一条128Kbps的区内DDN专线,月租费大约为2000元。

      DDN的发展

      我国DDN的建设始于20世纪90年代初,到目前为止,已覆盖全国的大部分地区,我国DDN网络规模大、数量多,为了组网灵活、扩容方便、业务组织管理清晰,按网络功能层次把DDN划分为核心层、接入层和用户接口层3层网络结构。核心层由大、中容量网络设备组成,用2048Kbps或更高速率的数字电路互连;接入层由中、小容量网络设备组成,用2048Kbps的数字电路与核心层互连,并为各类DDN业务提供接入;用户接口层由各种用户复用设备、网桥/路由器设备、帧中继业务的帧装/拆设备组成。如果按地理位置分又可分为国家骨干网、省际DDN和本地网。

      我国DDN虽然发展的时间并不算非常久,但应该说现在已经具备了一定的规模,在面对今天的“宽带”大战中,DDN的情况如何呢?DDN由于它传输数据的高质高效性以及它在安全性上的优势,能满足人们对传送大信息量、低误码率的要求,因此作为一个有独特优势的网络,DDN将赋于更长远的使命。即使是在美国这样一个各种通信手段都很发达的国家,DDN也处于相对稳定的地位而始终不被其他新网络所完全取代。

      总结

      DDN作为一种特殊的接入方式有着它自身的优势和特点,也有着它特定的目标群体,它较之ISDN有着速率高、传输质量好、信息量大的优点,而相对于卫星通信又有时延小、受外界影响小的优势,所以它是集团客户和对传输质量要求较高、信息量较大的客户的最佳选择。相信在未来的“宽带大战”中DDN应该不会很快“阵亡”。

  • 网络接入技术之ADSL

    2007-06-08 11:25:37

    网络接入技术之ADSL

      上网冲浪,最主要的三个关键要素分别是:带宽、带宽、还是带宽。随着广大群众对信息化需求的与日剧增,大量的网络信息资源给人们的生活工作带来了极大的便捷,从而也就给上网的速度提出了更高的要求。今天就先给大家介绍一下电信推崇的杀手锏——ADSL。

      简介

      DSL(Digital Subscriber Line,数字用户环路)是以铜质电话线为传输介质的传输技术组合,它包括HDSL、SDSL、VDSL、ADSL和RADSL等,一般称之为xDSL技术。它们主要的区别就是体现在信号传输速度和有效距离的不同以及上行速率和下行速率对称性不同这两个方面。

      ADSL(Asymmetrical Digital Subscriber Line,非对称数字用户环路)是一种能够通过普通电话线提供宽带数据业务的技术,是目前极具发展前景的一种接入技术。ADSL素有“网络快车”之美誉,因其下行速率高、频带宽、性能优、安装方便、不需交纳电话费等特点而深受广大用户的喜爱,成为继Modem、ISDN之后的又一种全新的、更快捷、更高效的接入方式。

      特点

      ADSL这种方案最大特点是不需要改造信号传输线路,完全可以利用普通铜质电话线作为传输介质,只要配上专用的Modem即可实现数据高速传输。ADSL支持上行速率640Kbps到1Mbps,下行速率1Mbps到8Mbps,其有效的传输距离在3~5公里范围以内;ADSL接入方案比网络拓扑结构更为先进,每个用户都有单独的一条线路与ADSL局端相连,它的结构可以看做是星型结构,数据传输带宽是由每一用户独享的。

      ADSL使用普通电话线作为传输介质,虽然传统的Modem也是使用电话线传输的,但传统的Modem只使用了0KHz~4KHz的低频段,而电话线理论上有接近2MHz的带宽,ADSL正是使用了26KHz以后的高频带才能提供如此高的速度。具体工作流程是:经ADSL Modem编码后的信号通过电话线传到电话局后再通过一个信号识别/分离器,如果是语音信号就传到交换机上,如果是数字信号就接入Internet。

      比起普通拨号Modem的最高56K速率以及N-ISDN 128K的速率,ADSL的速率优势是不言而喻的。与普通拨号Modem或ISDN相比,ADSL更为吸引人的地方是:它在同一铜线上分别传送数据和语音信号,数据信号并不通过电话交换机设备,减轻了电话交换机的负载,并且不需要拨号,一直在线,属于一种专线上网方式,这意味着使用ADSL上网并不需要缴付另外的电话费。

      此外使用ADSL的用户都将分配一个或几个固定的IP地址,这样有兴趣的朋友可以在自己的机器上设立个人主页,甚至架起相关的服务器。

      ADSL技术作为一种宽带接入方式,可以为用户提供多种业务:

      1、高速的数据接入

      用户可以通过ADSL宽带接入方式快速地浏览各种互联网上的信息进行网上交谈、收发电子邮件、获得所需要的信息。

      2、视频点播

      由于ADSL技术传输的非对称性,特别适合用户对音乐、影视和交互式游戏的点播,可以根据用户自己的需要,任意地对上述业务进行随意控制,而不必像有线电视节目一样受电视台的控制。

      3、网络互连业务

      ADSL宽带接入方式可以将不同地点的企业网或局域网连接起来,避免了企业分散所带来的麻烦,同时又不影响各用户对互联网的浏览。

      4、家庭办公

      部分企业的工作人员因为某种原因需要在家里履行自己的工作职责,他将通过高速的接入方式从自己企业信息库中提取所需要的信息,甚至面对面地和同事进行交谈,完成工作任务。

      5、远程教学、远程医疗等

      随着人们生活水平的提高,人们在家里接受教育和再教育以及得到必要的医疗保证将成为一种时尚,通过宽带的接入方式,你可以获得图文并茂的多媒体信息,或者和老师或医生进行随意交谈。

      相关产品

      和拨号上网相似,使用ADSL同样需要有相应的调制解调器来帮忙,现在市场上ADSL终端设备不少,国际上众多的通信及电子设备制造公司纷纷推出自己的ADSL设备和器件,这其中不乏阿尔卡特、AMD、Harris、Intel、Motorola等著名公司,目前在我国比较常见的ADSL设备是全向、百灵达、爱立信和阿尔卡特。ADSL Modem同样有内置和外置之分,在价格上还是内置的更有优势,但对于一般人来说还是比较贵,大概在两三千元左右。前不久全向同时推出三款ADSL Modem,分别适合PCI插槽(图1)、以太网接口(图2)和USB接口,满足了不同需求者的需求。其中以太网接口的ADSL Modem针对办公室应用,方便快捷,省却软硬件的配合问题,只要将该Modem接到办公室的局域网上,按照说明书做一下IP配置,整个局域网就可以共享上网了。而PCI接口的ADSL Modem则提供了更为经济的解决方案。对于越来越多的移动办公一族或者已经觉得机箱内插了太多PCI卡的用户,USB接口的ADSL Modem可能会是您更好的选择。

      发展障碍

      ADSL的种种优势让人羡慕不已,但它的价格却居高不下,虽然说现在有些地方已经作了不小的调整,但毕竟“优惠”的范围太小了,在大多数人面前,ADSL仍然是“贵族”话的东东。抛开价格暂且不说,在技术上也有着它的局限性,当然这个局限性就是相对而言的了:

      首先,ADSL方案以现有的电话双绞铜线为接入线路,而电话线毕竟是为打电话而设计的,其传输质量和可靠性无法与现代通信电缆相比。

      再次,大多数Web服务器的性能还远远不能与ADSL所提供的带宽相适应。许多服务器的速率不够,主干网繁忙,一个连接点可以有20个或20个以上的路由器,可能造成极大的延时。

      总结

      目前,ADSL的热潮席卷世界各地,Microsoft、Intel、Compaq等大公司相继推出ADSL的产品并致力于ADSL的发展;全球许多电信公司、ISP也纷纷推广各自的ADSL服务,相信2001年必将是ADSL大步发展的一年。业界许多专家都坚信,以ADSL为主的xDSL技术终将成为铜双绞线上的赢家,目前采用普通拨号Modem及N-ISDN技术接入的用户将逐步过渡到ADSL等宽带接入方式,并最终实现光纤接入,渴望能够舒心冲浪的人们,让我们共同期待吧!

  • 三层交换机的工作原理

    2007-06-08 11:18:58

    三层交换机的工作原理

    2007-06-02 15:37:50 / 个人分类:网络技术

    三层交换机工作原理

    这天晚上,令狐冲心灰意懒,借酒消愁,这时,一个黑影出现在他的面前,原来是一个道风仙骨的老人,正是风清扬。风清扬听了令狐冲的疑惑,说:路由器接口不够,把路由器做在lanswitch内部不就可以了;交换速度慢,是因为路由器查找的是网段路由,而lanswitch直接查mac对应出端口,当然速度快。为什么不能直接根据ip地址查到出端口呢?令狐冲一听,大为仰慕,但还是不明白,ip地址那么多,而且经常变化,如何能够直接查到出端口呢?风清扬说:

    "你先坐下,让我来问你,华山派有多少弟子?"
    "一万六千左右。"
    "你全知道他们住哪里吗?"
    "不知道。"
    "岳不群要你找一个不知道住哪里的人,如何去找?"
    "查华山派电话号码查询系统,找到他的地址,然后去找他。"
    "如果你回来后再让你找这个人,又如何去找?"
    "如何.... ,查华山派电话号码查询系统,找到他的地址,然后去找他。"
    "你不知道到这个人的地址吗?"
    "知道,但师父说,华山派的地址那么多,而且经常变化,不用知道地址。"
    "岳不群这小子,把徒弟都教成木头了!我问你,你自己认为应该如何找?"
    "直接去找!"
    "好!你这人还不算太苯。那你知道了一个人的地址后,是不是永远记住了?"
    "有的人记住了。其它的都忘了。"
    "为什么忘了?"
    "因为我记不了那么多人,而且一段时间没有去找他。"
    "华山派电话号码查询系统里的地址是如何获得的?"
    "我在空旷处大喊一声他的名字,他听到后就会来找我,告诉我他的地址。"

    风清扬又问了大把类似脑筋急转弯的问题,然后风清扬说:"现在你明白根据ip地址直接查出端口的道理了吗?等到你明白这个道理,你自然会做出三层交换机来",令狐冲仔细回忆了今天的话,终于明白了和二层转发由mac地址对应到出端口的道理一样,三层转发也可以直接由ip地址对应到出端口,ip地址的路由可以通过arp来学习,同样需要老化。这样,vlan间转发除第一个包需要通过arp获得主机路由外,其它的报文直接根据ip地址就能够查找到出端口,转发速度远远高于路由器转发的速度。抬头看时,风清扬已经走了。

  • SQL SERVER中一些常见性能问题的总结

    2007-06-08 11:11:53

    作者:pbsql(风云)  
    ;aS? }{ O I(a"q5Y65703  日期:2005-12-06  
    D x]W/{5JW65703    51Testing软件测试网W t3Q7f;B+U|*A.t
      1.对查询进行优化,应尽量避免全表扫描,首先应考虑在   where   及   order   by   涉及的列上建立索引。  
    E?y@[8k lT65703    51Testing软件测试网D,RM{!J~%k
      2.应尽量避免使用   left   join   和   null   值判断。left   join   比   inner   join   消耗更多的资源,因为它们包含与   null   (不存在)数据匹配的数据,所以如果可以重新编写查询以使得该查询不使用任何   inner   join   ,则会得到相应的回报。   51Testing软件测试网:vB J @5l5r(} u
      例如有两表:   51Testing软件测试网 t}6o+r _@ q!O@9}8?
      product(product_id   int   not   null,product_type_id   int   null,...),产品表,   product_id   为大于0的整数,   product_type_id   与表   product_type   关联,但可为空,因为有的产品没有类别  
    t#d J7L+yN2r Z}+PG65703  product_type(product_type_id   not   null,product_type_name   null,...),产品类别表  
    !Kyb%@&kK65703  此时要关联两表后查询   product   的内容,马上会想到使用   inner   join   ,但下面有一种方法可避免使用   inner   join   :   51Testing软件测试网^\@3~0e}/d a
      在   product_type   中增加一条记录:0,'',...,并将   product   的   product_type_id   设置为   not   null   ,当产品没有类别时将其   product_type_id   设为0,这样查询就可以使用   inner   join   了。  
    Yu.a#p:jp7b;S&_+P1C65703   
    (wd)zF%{4\"nAK65703  3.应尽量避免在   where   子句中使用!=或<>操作符,否则引擎可能放弃使用索引而进行全表扫描。  
    $e IOU\*cPb$S65703    51Testing软件测试网i7^B ^ l&?
      4.应尽量避免在   where   子句中使用   or   来连接条件,否则将可能导致引擎放弃使用索引而进行全表扫描,如有表   t   ,   key1   、   key2   上建有索引,需要下面的存储过程:   51Testing软件测试网-c,c N'rX#jT"Q
      create   procedure   select_proc1   @key1   int=0,@key2   int=0  
    Lq^aiU65703  as  
    X u7Ehk65703  begin  
    {x5?0UwnR/V65703      select   key3   from   t   51Testing软件测试网0?A/OKE G[%ja
          where   (@key1=0   or   key1=@key1)  
    +Q|o&o?hc65703          and   (@key2=0   or   key2=@key2)   51Testing软件测试网vgpT/Z/Y
      end   51Testing软件测试网MjW+{5o)n0|G2n+dy;Q e J
      go  
    ke S4dMG+v.o\65703  这个存储过程会导致全表扫描,可作如下修改:   51Testing软件测试网)G&YC!F+](t6@;sC
      create   procedure   select_proc2   @key1   int=0,@key2   int=0   51Testing软件测试网0Y$n:gu$[qlZ
      as   51Testing软件测试网$w$Qo%^.gw/TD
      begin   51Testing软件测试网jbge V3c
          if   @key1   <>0   and   @key2<>0   51Testing软件测试网:u9aV_jRr mY
              select   key3   from   t   51Testing软件测试网2p)sMz+O lB+oo0?\:Z
              where   key1=@key1   and   key2=@key2   51Testing软件测试网:G)pb Q6SlZ)}
          else   51Testing软件测试网 m$u7gq&hrQS
              if   @key1<>0   51Testing软件测试网GzC*@ K\3z
                  select   key3   from   t   where   key1=@key1  
    +EZ Qdr-[)K65703          else  
    D/W t"s(MV.V8Xb!Y65703              select   key3   from   t   where   key2=@key2   51Testing软件测试网"@&@:M M5f5zM8]8O&f
      end   51Testing软件测试网x"Tde7x)a1LF.Z)`
      go   51Testing软件测试网:u*zBng.Q I`
      更改后虽然代码增加了,但效率提高了。  
    btQuu5dM65703   
    )lM/Lg1NUp^G;~ B65703  5.in   和   not   in   也要慎用,如:  
    wVe4d~y65703  select   id   from   t   where   num   in(1,2,3)  
    g6M8ym/| Xy0nJ65703  对于连续的数值,能用   between   就不要用   in   了:   51Testing软件测试网R2g{ o,TOd^D
      select   id   from   t   where   num   between   1   and   3   51Testing软件测试网 G3dglb
        51Testing软件测试网(z2Rrk$p:vH%s-Br
      6.下面的查询也将导致全表扫描:   51Testing软件测试网\ hOGq~9fC
      select   id   from   t   where   name   like   '%abc%'  
    #zR%`tj1{4g65703  若要提高效率,可以考虑全文检索。  
    #r]3w?|!z)?A4z65703   
    ;S.m"R.wL5vT#@:K"p65703  7.如果在   where   子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:  
    UC3g5myA(Cm `65703  select   id   from   t   where   num=@num   51Testing软件测试网:E rO,|5@SY
      可以改为强制查询使用索引:   51Testing软件测试网/J8N'K6F,JC(f2t
      select   id   from   t   with(index(索引名))   where   num=@num  
    UOu7y"vJ8j65703    51Testing软件测试网7X3MGP@ KEP
      8.应尽量避免在   where   子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:   51Testing软件测试网.Aks&` eNMP
      select   id   from   t   where   num/2=100  
    U"v*I1p@CL,Q65703  应改为:     51Testing软件测试网#Jomq;_ |X
      select   id   from   t   where   num=100*2   51Testing软件测试网+pcN`A"K
       
    &_(@Q1naB65703  9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:   51Testing软件测试网?6xLc1p|
      select   id   from   t   where   substring(name,1,3)='abc'--name以abc开头的id  
    OC cRNd!E-@x65703  select   id   from   t   where   datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id   51Testing软件测试网nl$G}O?`@8{
      应改为:   51Testing软件测试网o:|]Q.oz
      select   id   from   t   where   name   like   'abc%'   51Testing软件测试网1d~7a)JX
      select   id   from   t   where   createdate>='2005-11-30'   and   createdate<'2005-12-1'  
    "e]7I1Zt}2P+WGP65703   
    G+V1IDu)u65703  10.不要在   where   子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。   51Testing软件测试网} o/k*yBGT
        51Testing软件测试网S9a}%yA jf
      11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。  
    p E,rr{C!gO65703    51Testing软件测试网:p\p3C|&YHUc1V
      12.不要写一些没有意义的查询,如需要生成一个空表结构:  
    s~ B&S1H7{6u65703  select   col1,col2   into   #t   from   t   where   1=0  
    R6{.Tn"|M65703  这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:  
    (iQ O)IA,f^apos65703  create   table   #t(...)  
    /O$^;@8y\$E's6i65703    51Testing软件测试网yt&y2x%^hxk
      13.很多时候用   exists   代替   in   是一个好的选择:   51Testing软件测试网([lS1wC/}t2~ NM
      select   num   from   a   where   num   in(select   num   from   b)  
    Ch*bplE.y/{9h65703  用下面的语句替换:   51Testing软件测试网+@#Qb~/pr@:[7\ t
      select   num   from   a   where   exists(select   1   from   b   where   num=a.num)  
    @'mR7G};R!RG)T65703   
    7_,a5T"eJ7Cb)p65703  14.并不是所有索引对查询都有效,   SQL   是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段   sex   ,   male   、   female   几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。   51Testing软件测试网 BP-} Gr6z/b9[4u
        51Testing软件测试网{ [J?:f
      15.索引并不是越多越好,索引固然可以提高相应的   select   的效率,但同时也降低了   insert   、   update   及   delete   的效率,因为   insert   或   update   时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。  
    L+{/_wS N65703    51Testing软件测试网lEuV'@%?"]
      16.应尽可能的避免更新   clustered   索引数据列,因为   clustered   索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新   clustered   索引数据列,那么需要考虑是否应将该索引建为   clustered   索引。   51Testing软件测试网8Mx}w#u+}2kY q1I
       
    2J5jH|c$|f65703  17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。   51Testing软件测试网 s Kxm`'OR:|
        51Testing软件测试网cE:cyC T,p
      18.尽可能的使用   varchar/nvarchar   代替   char/nchar   ,因为首先变长字段存储空间小,可以节省存储空间(定长字段即使在数据为null时也需要定长的存储空间(7.0及更高版本)),其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些,而且每页(8KB)可能存储更多的记录数,这样也可以减少I/O的消耗而提高性能。  
    +pW8U'O]w65703    51Testing软件测试网%?w!e&c5U,@r3b
      19.任何地方都不要使用   select   *   from   t   ,用具体的字段列表代替“*”,不要返回用不到的任何字段。  
    s*~-a\*R$x4[ A65703   
    8A+G b@"h G65703  20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。   51Testing软件测试网s+~%S`cZ1RiH4f/v
       
    i1CT2? Te3~#X65703  21.避免频繁创建和删除临时表,以减少系统表资源的消耗。  
    \'}&a Na9Ae5_65703    51Testing软件测试网_+] h7xQ-v+Jo d
      22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。   51Testing软件测试网]}Z1])IA O
       
    p[+~G4^~7O0t65703  23.在新建临时表时,如果一次性插入数据量很大,那么可以使用   select   into   代替   create   table,避免造成大量   log   ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先   create   table   ,然后   insert   。  
    !j2BLUod4ub"JA]B65703    51Testing软件测试网v E,\ RHEB/~)|
      24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先   truncate   table   ,然后   drop   table   ,这样可以避免系统表的较长时间锁定。   51Testing软件测试网q@P Z5Od2W ngm/Z
       
    ny7h {m"H!oy5GY65703  25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。   51Testing软件测试网I2lmwgTt i!s
        51Testing软件测试网 f ^YYu7E d*Os
      26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。  
    *EdhgU)s,n9i65703    51Testing软件测试网 brC&TN~
      27.与临时表一样,游标并不是不可使用。对小型数据集使用   FAST_FORWARD   游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。  
    i,DdW1w"\65703   
    +t OR*aE65703  28.在所有的存储过程和触发器的开始处设置   SET   NOCOUNT   ON   ,在结束时设置   SET   NOCOUNT   OFF   。无需在执行存储过程和触发器的每个语句后向客户端发送   DONE_IN_PROC   消息。  
    M$zFq#\^._65703    51Testing软件测试网4^2IxW.v;P&|8[
      29.尽量避免大事务操作,提高系统并发能力。当使用约束和触发器都能完成同样的功能时,优先考虑使用约束。   51Testing软件测试网g,T ?N3oC?HZ"c*f5U
       
    _`/m%|7w)a|yIg65703  30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
  • [转]子网掩码计算方法

    2007-06-08 11:07:54

    子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。

    最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。

    请看以下示例:

    运算演示之一:aa
    I P 地址  192.168.0.1
    子网掩码  255.255.255.0
    AND运算

    转化为二进制进行运算:
    I P 地址 11010000.10101000.00000000.00000001
    子网掩码 11111111.11111111.11111111.00000000
    AND运算

         11000000.10101000.00000000.00000000
    转化为十进制后为:

          192.168.0.0


    运算演示之二:
    I P 地址  192.168.0.254
    子网掩码  255.255.255.0
    AND运算

    转化为二进制进行运算:
    I P 地址 11010000.10101000.00000000.11111110
    子网掩码 11111111.11111111.11111111.00000000
    AND运算

         11000000.10101000.00000000.00000000
    转化为十进制后为:

          192.168.0.0


    运算演示之三:
    I P 地址  192.168.0.4
    子网掩码  255.255.255.0
    AND运算

    转化为二进制进行运算:
    I P 地址 11010000.10101000.00000000.00000100
    子网掩码 11111111.11111111.11111111.00000000
    AND运算

         11000000.10101000.00000000.00000000
    转化为十进制后为:

          192.168.0.0


      通过以上对三组计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0

      所以计算机就会把这三台计算机视为是同一子网络,然后进行通讯的。我现在单位使用的代理服务器,内部网络就是这样规划的。

    也许你又要问,这样的子网掩码究竟有多少了IP地址可以用呢?你可以这样算。
    根据上面我们可以看出,局域网内部的ip地址是我们自己规定的(当然和其他的ip地址是一样的),这个是由子网掩码决定的通过对255.255.255.0的分析。可得出:
      前三位IP码由分配下来的数字就只能固定为192.168.0  所以就只剩下了最后的一位了,那么显而易见了,ip地址只能有(2的8次方-1),即256-1=255一般末位为0或者是255的都有其特殊的作用。

    那么你可能要问了:如果我的子网掩码不是255.255.255.0呢?你也可以这样做啊假设你的子网掩码是255.255.128.0

    那么你的局域网内的ip地址的前两位肯定是固定的了(什么,为什么是固定的?你看上边不就明白了吗?·#¥)

    这样,你就可以按照下边的计算来看看同一个子网内到底能有多少台机器

    1、十进制128 = 二进制1000 0000

    2、IP码要和子网掩码进行AND运算

    3、
    I P 地址 00010000.01001001.1*******.********
    子网掩码 11111111.11111111.10000000.00000000
    AND运算

         00010000.01001001.10000000.00000000
    转化为十进制后为:

          16 . 73 . 128 . 0

    4、可知我们内部网可用的IP地址为:

    00010000.01001001.10000000.00000000
           到
    00010000.01001001.11111111.11111111

    5、转化为十进制:

    16.73.128.0 到 16.73.255.255

    6、0和255通常作为网络的内部特殊用途。通常不使用。

    7、于是最后的结果如下:我们单位所有可用的IP地址为:
    192.168.128.1-192.168.128.254
    192.168.129.1-192.168.129.254
    192.168.130.1-192.168.130.254
    192.168.131.1-192.168.131.254
    . . . . . . . . . . . . .
    192.168.139.1-192.168.139.254
    192.168.140.1-192.168.140.254
    192.168.141.1-192.168.141.254
    192.168.142.1-192.168.142.254
    192.168.143.1-192.168.143.254
    . . . . . . . . . . . . .
    192.168.254.1-192.168.254.254
    192.168.255.1-192.168.255.254

    8、总数为(255-128+1)*(254-1+1) =128 * 254 = 32512

    FAINT!!!!@#!@把我们公司都买了还买不了这么多的机器呢!·¥!·#

    9、看看的结果是否正确

      (1)、设定IP地址为192.168.128.1

        Ping 192.168.129.233通过测试

        访问http://192.168.129.233可以显示出主页

      (2)、设定IP地址为192.168.255.254

        Ping 192.168.129.233通过测试

        访问http://192.168.129.233可以显示出主页

    10、结论

      以上证明我们的结论是对的。


    现在你就可以看你的子网中能有多少台机器了

    255.255.255.128
    分解:
    11111111.11111111.11111111.1000000
    所以你的内部网络的ip地址只能是
    xxxxxxxx.xxxxxxxx.xxxxxxxx.0???????

    xxxxxxxx.xxxxxxxx.xxxxxxxx.01111111

  • LoadRunner函数中文翻译系列之一--Action

    2007-06-08 10:47:37

    web_url

    语法:

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

    返回值

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

    参数:

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

    url:页面url地址。

    List of Attributes

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

    List of Resource Attributes

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

    说明

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

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

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

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

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

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

     

    web_image

    语法:

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

    返回值

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

    参数:

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

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

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

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

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

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

    5Ordinal参见Web_link的同名参数。

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

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

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

    3MapName:图象的映射名。 

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

    1Xcoord:点击图象时的X坐标。

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

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

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

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

    说明

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

    ToosRecording Option,如果录制级别设为基于HMTL的录制方式时,web_image才会被录制到。

    web_image支持客户端(client-side)和服务器端server-side的图片映射。

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

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

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

    例子

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

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

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

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

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

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

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

    web_image("dpt_house.gif",

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

           "MapName=dpt_house",

           "AreaOrdinal=4",

           LAST)

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

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

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

           "Ordinal=1",

           "XCoord=91",

           "YCoord=17",

           LAST)

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

    web_image("dpt_house.gif",
            "Src/sfx=dpt_house.gif", LAST)

     

    web_link

    语法:

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

    返回值

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

    参数:

    StepNameVuGen中树形视图中显示的名称,在自动事务设置中也被用做事务名称。

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

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

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

    3.      TargetFrameResourceByteLimit:见List of Attributes一节。

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

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

    LAST:结尾标示符。

    说明

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

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

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

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

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

     

    web_submmit_form

    语法:

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

    返回值

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

    参数:

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

    List of Attributes支持以下属性:

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

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

    3.      TargetFrameResourceByteLimitList of Attributes的同名参数。

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

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

    查看(565) 评论(0) 收藏 分享 管理

  • 软件测试之常用的功能测试方法解析

    2007-06-08 10:35:23

    【编者按】
      功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。常用的测试方法如下:页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。
    【正文】
      功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。常用的测试方法如下:

      1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。

      2. 相关性检查:删除/增加一项会不会对其他项产生影响,如果产生影响,这些影响是否都正确。

      3. 检查按钮的功能是否正确:如update, cancel, delete, save等功能是否正确。

      4. 字符串长度检查: 输入超出需求所说明的字符串长度的内容, 看系统是否检查字符串长度,会不会出错.

      5. 字符类型检查: 在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.

      6. 标点符号检查: 输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.

      7. 中文字符处理: 在可以输入中文的系统输入中文,看会否出现乱码或出错.

      8. 检查带出信息的完整性: 在查看信息和update信息时,查看所填写的信息是不是全部带出.,带出信息和添加的是否一致

      9. 信息重复: 在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.

      10. 检查删除功能:在一些可以一次删除多个信息的地方,不选择任何信息,按”delete”,看系统如何处理,会否出错;然后选择一个和多个信息,进行删除,看是否正确处理.
     
     

    11. 检查添加和修改是否一致: 检查添加和修改信息的要求是否一致,例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.

    12. 检查修改重名:修改时把不能重名的项改为已存在的内容,看会否处理,报错.同时,也要注意,会不会报和自己重名的错.

    13. 重复提交表单:一条已经成功提交的纪录,back后再提交,看看系统是否做了处理。

    14. 检查多次使用back键的情况: 在有back的地方,back,回到原来页面,再back,重复多次,看会否出错.

    15. search检查: 在有search功能的地方输入系统存在和不存在的内容,看search结果是否正确.如果可以输入多个search条件,可以同时添加合理和不合理的条件,看系统处理是否正确.

    16. 输入信息位置: 注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方.

    17. 上传下载文件检查:上传下载文件的功能是否实现,上传文件是否能打开。对上传文件的格式有何规定,系统是否有解释信息,并检查系统是否能够做到。

    18. 必填项检查:应该填写的项没有填写时系统是否都做了处理,对必填项是否有提示信息,如在必填项前加*

    19. 快捷键检查:是否支持常用快捷键,如Ctrl+C Ctrl+V Backspace等,对一些不允许输入信息的字段,如选人,选日期对快捷方式是否也做了限制。

    20. 回车键检查: 在输入结束后直接按回车键,看系统处理如何,会否报错。


  • 界面设计与测试规则

    2007-06-08 10:31:20

    界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。目前界面的设计引起软件设计人员的重视的程度还远远不够,直到最近网页制作的兴起,才受到专家的青睐。而且设计良好的界面由于需要具有艺术美的天赋而遭拒绝。
    目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。

          1:易用性:
         按钮名称应该易懂,用词准确,屏弃没楞两可的字眼,要与同一界面上的
    其他按钮易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确操作。

         易用性细则:
         1):完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。
         2):完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。
         3):按功能将界面划分局域块,用Frame框括起来,并要有功能说明或标题。
         4):界面要支持键盘自动浏览按钮功能,即按Tab键的自动切换功能。
         5):界面上首先应输入的和重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口上较醒目的位置。
         6):同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。
         7):分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab
         8):默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。
         9):可写控件检测到非法输入后应给出说明并能自动获得焦点。
         10):Tab键的顺序与控件排列顺序要一直,目前流行总体从上到下,同时行间从左到右的方式。
         11):复选框和选项框按选择几率的高底而先后排列。
         12):复选框和选项框要有默认选项,并支持Tab选择。
         13):选项数相同时多用选项框而不用下拉列表框。
         14):界面空间较小时使用下拉框而不用选项框。
         15):选项数叫少时使用选项框,相反使用下拉列表框。
         16):专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。
         2: 规范性:
         通常界面设计都按Windows界面的规范来设计,即包含“菜单条、工具栏、工具厢、状态栏、滚动条、右键快捷菜单”的标准格式,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供工具厢。

         规范性细则:
         1):常用菜单要有命令快捷方式。
         2):完成相同或相近功能的菜单用横线隔开放在同一位置。
         3):菜单前的图标能直观的代表要完成的操作。
         4):菜单深度一般要求最多控制在三层以内。
         5):工具栏要求可以根据用户的要求自己选择定制。
         6):相同或相近功能的工具栏放在一起。
         7):工具栏中的每一个按钮要有及时提示信息。
         8):一条工具栏的长度最长不能超出屏幕宽度。
         9): 工具栏的图标能直观的代表要完成的操作。
         10):系统常用的工具栏设置默认放置位置。
         11):工具栏太多时可以考虑使用工具厢。
         12):工具厢要具有可增减性,由用户自己根据需求定制。
         13):工具厢的默认总宽度不要超过屏幕宽度的1/5。
         14): 状态条要能显示用户切实需要的信息,常用的有:
    目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一操作需要的时间较长,还应该显示进度条和进程提示。
         15):滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。
         16):状态条的高度以放置五好字为宜,滚动条的宽度比状态条的略窄。
         17):菜单和工具条要有清楚的界限;菜单要求凸出显示,这样在移走工具条时仍有立体感。
         18):菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。
         19):右键快捷菜单采用与菜单相同的准则。

         3:帮助设施:
         系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。

         帮助设施细则:
         1):帮助文档中的性能介绍与说明要与系统性能配套一致。(我们的系统帮助文档都是系统的祖先时期的说明,让人困惑)。
         2):打包新系统时,对作了修改的地方在帮助文档中要做相应的修改。
         3):操作时要提供及时调用系统帮助的功能。常用F1。
         4):在界面上调用帮助时应该能够及时定位到与该操作相对的帮助位置。也就是说帮助要有即时针对性。
         5):最好提供目前流行的联机帮助格式或HTML帮助格式。
         6):用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。
         7):如果没有提供书面的帮助文档的话,最好有打印帮助的功能。
         8 ):在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。

         4:合理性:
         屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。

         合理性细则:
         1):父窗体或主窗体的中心位置应该在对角线焦点附近。
         2):子窗体位置应该在主窗体的左上角或正中。
         3):多个子窗体弹出时应该依次向右下方偏移,以显示窗体出标题为宜。
         4):重要的命令按钮与使用较频繁的按钮要放在界面上注目的位置。
         5):错误使用容易引起界面退出或关闭的按钮不应该放在易点位置。横排开头或最后与竖排最后为易点位置。
         6):与正在进行的操作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该按钮)。
         7):对可能造成数据无法恢复的操作必须提供确认信息,给用户放弃选择的机会。
         8):非法的输入或操作应有足够的提示说明。
         9): 对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形成无限期的等待。
         10):提示、警告、或错误说明应该清楚、明了、恰当。
         5:美观与协调性:
         界面应该大小适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。

         美观与协调性细则:
         1): 长宽接近黄金点比例,切忌长宽比例失调、或宽度超过长度。
         2): 布局要合理,不宜过于密集,也不能过于空旷,合理的利用空间。
         3): 按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置。
         4): 按钮的大小要与界面的大小和空间要协调。
         5): 避免空旷的界面上放置很大的按钮。
         6):放置完控件后界面不应有很大的空缺位置。
         7): 字体的大小要与界面的大小比例协调, 通常使用的字体中宋体9-12较为美观,很少使用超过12号的字体。
         8): 前景与背景色搭配合理协调,反差不宜太大,最好少用深色,如大红、大绿等。常用色考虑使用Windows界面色调。
         9): 如果使用其他颜色,主色要柔和,具有亲和力与磁力,坚决杜绝刺目的颜色。
         10): 大型系统常用的主色有"#E1E1E1"、"#EFEFEF"、"#C0C0C0"等。
         11): 界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方。
         12): 如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌只放大窗体而忽略控件的缩放。
         13):对于含有按钮的界面一般不应该支持缩放,即右上角只有关闭功能。
         14): 通常父窗体支持缩放时,子窗体没有必要缩放。
         15):如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。

         6:菜单位置:
         菜单是界面上最重要的元素,菜单位置按照按功能来组织。

         菜单设
    测试细则:
         1):菜单通常采用“常用--主要--次要--工具--帮助”的位置排列,符合流行的Windows风格。
         2):常用的有“文件”、“编辑”,“查看”等,几乎每个系统都有这些选项,当然要根据不同的系统有所取舍。
         3):下拉菜单要根据菜单选项的含义进行分组,并切按照一定的规则进行排列,用横线隔开。
         4): 一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。
         5): 没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头, 不常用的靠后放置;重要的放在开头,次要的放在后边。
         6): 如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。
         7): 菜单深度一般要求最多控制在三层以内。
         8): 对常用的菜单要有快捷命令方式,组合原则见8。
         9):对与进行的操作无关的菜单要用屏蔽的方式加以处理,如果采用动态加载方式——即只有需要的菜单才显示——最好。
         10):菜单前的图标不宜太大,与字高保持一直最好。
         11):主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。
         12):主菜单数目不应太多,最好为单排布置。

  • 构造朴实的测试用例

    2007-06-08 10:29:59

     测试用例这种东西对于刚入行的人来说是一种诱惑,初入测试的人急于掌握这门学问,所以一开始就会问测试用例怎么写,问的同时或许还包含了一些期望。其实测试用例就是一个测试矩阵,任何人没有必要注重形式问题,如果你现在或者未来的公司有套非常完善的文档管理体系,那么你可以参考标准模版,如果没有你们大可跟我一样使用下面的格式:

    -------------------------------------------------------------------------
    - ID-ACT-DATA-EXPECTED-ACTUAL-T/F-DATE
    -------------------------------------------------------------------------

        我认为没有什么问题,ID代表标号(如果你愿意可以用这个ID对应需求文档的ID或者使用详细设计的文档的ID,间接连接需求),ACT代表一种动作,因为测试动作非常复杂,如果手动执行或者自动执行,或者或者是一种异常状态都可以占用此位置,但是注意不能使用性能、数据或者安全测试替代,为什么请各位自己考虑。DATA代表数据,很多的测试类书籍中虽然没有直接讲明测试数据的划分,但是通常我们引用三种数据“正常”、“异常”、“错误”,分别对应关键字“PASS”、“ERROR”、“FAIL”,对于数据的划分我以前曾经说过这里不再细谈,为什么会在一个文档中体现着点,主要是为了以后数据程序化作接口,一个不能将手动测试转为自动测试的人员注定是平庸的。EXPECTED、ACTUAL分别代表期望和实际,我们做这一行的经常对这两种值的差异感到困惑,是不是“正常”、“异常”、“错误”就看个人的经验了。T/F的引入是因为有这样的一种情况介入,如果EXPECTED、ACTUAL是不同的,但是我们还是要给个T,因为对于单项的是否通过测试人员有着使用权,但决定权在于市场或者高层决策。DATE是一种好习惯,通常记为发现“PASS”、“ERROR”、“FAIL”的时间,很多人会忽略这个值,当然对于我们来说没什么损失,对于QA团队来说,仅仅提供给他们T/F是不够的。

        我觉得这就是一种构造朴实的测试用例的方式,不要过于在意一份文档的表现形式,如果你有很多的时间,如果你一年才写一个这样的文档,那么你可以从互联网上下在很多的资源把这份文档修饰的像APPLE一样。

        入行的人员会更进一步的发挥测试偏执狂的能力,这时候他们急需一种数量,例如:我们一个动态库的测试用例就有3000多个厉害吧?厉害,我当然说你厉害,你难道不厉害吗?我记得有个500强的
    面试题就是你能为LOGIN动作写多少的测试用例?我想了半天我说就三个,或者四个,在听到了一声深深叹息后,我惶恐的说大概我能写5个吧?!当然我自己也没底,我就能写出三个。LOGIN/PASS、LOGIN/ERROR、LOGIN/FAIL,所有的测试用例就是他们的衍生,一种本源的问题。我们继续讨论3000多个测试用例的事情,有人明眼就会说:这家伙肯定是微软的,没错,除了这种大公司有了充足的资源和技术支持,哪家公司能跟他们一样呢?当然了,写3000个我想入行久了谁都可以,并且跟你对系统的熟悉程度,工作经验有莫大的关系,但是这里我又想说说关于构造朴实的测试用例的问题了。

       
    单元测试、集成测试这些说明的是测试范围,功能测试性能测试这些说明的是测试的手段,也可以这样说某个功能测试包含了若干个功能测试也内隐含了若干个单元测试的联动,当你开始测试的时候,实际上最终是对代码设定路径的一种验算,如果我们都生活在单线程、无UI的年代你可以更清楚的看到“PASS”、“ERROR”、“FAIL”三种状态,可我们已经错过了这个年代,我们有了包装的UI,有了封装的API,有了各种各样的MESSAGE,所以你就要承受更多ERROR的打击。这个时候有人就会通过增加测试用例的数量来回避这些陷阱,出发点是好的做法是累死人的,如果你愿意你可以为机器码写1亿个测试用例,如果你还是很偏执,你可以为门电路写上1万亿个测试用例,你有命执行吗?

        我通常不愿意写太多的测试用例,很多人认为我工作态度有问题,我认为这更能说明我的态度:我愿意朴实的构造我的测试用例,但是我有原则来保证我的测试用例:

    1。接到任务不急于作而在于多思考,首先在纸上构造一个大致的业务流图
    2。流图构造好,快速剔除公用的测试用例
    3。构造测试用例先写符合主路径的三种“PASS”、“ERROR”、“FAIL”
    4。精化测试用例努力为ERROR多构造1-7种假设
    5。执行测试用例强化FAIL的标准化失败输出,但是对应减少PASS测试用例
    6。进一步精化测试用例,使“PASS”、“ERROR”、“FAIL”所占的比例分别为%20、%70、%10


        如果我还是测试,我将继续我的朴实理论,多出来的安全时间我可以看看蓝天享受享受生活!

     

    我很同意楼上的说法,作为测试人员,当设计测试用例时一定要首先从大处入手。架构的搭建才决定了用例的有效性和覆盖面,假若1000个用例中有1/3个用例和其他用例所起到的作用重复,那么每作一次回归测试所花费的时间和人力就会成倍数增长;其次,对整个系统来讲,最重要的是尽可能将功能覆盖地广,其次才是粒度问题。这也取决于企业对软件产品质量的要求,我相信大多数的企业都不倾向于打造品牌,而更倾向于满足客户的基本需求,能够赚钱就好。所以像微软那样的测试用例设计模式对国内中小企业实际上是不适用的。
    回过头来再重申一下,我认为测试用例的设计比用例的数量更应该受到人们的关注,不能仅凭用例的个数来判断一个测试人员的能力,像楼主的提出思路才是测试人员应该去学习和掌握的。

  • 界面设计规范

    2007-06-08 10:27:11

    界面设计规范

    字体:        | 上一篇 下一篇 | 打印

    界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。设计良好的界面能够引导用户自己完成相应操作,起到向导作用。

    界面设计主要是为了达到以下目的:

    1. 1) 以用户为中心。设计由用户控制的界面,而不是界面控制用户。
    2. 2) 清楚一致的设计。所有界面的风格保持一致,所有具有相同含义的术语保持一致,且易于理解和使用。
    3. 3) 拥有良好的直觉特征。以用户所熟悉的现实世界事务的抽象来给用户暗示和隐喻,来帮助用户能迅速学会软件的使用。
    4. 4) 较快的响应速度。
    5. 5) 简洁、美观。

    以下规则应该重视:

    界面风格一致性

    操作项

    基本规范

    UI色彩与字体

    1. 1) UI 字体,色彩要一致。
    2. 2) 整体色彩搭配要融为一体,同时诸如CaptionButton 起提示、提交作用的部分要清楚,醒目。
    3. 3) 不可修改的字段,统一使用灰色文字显示。(例:浏览页面、删除页面均需显示灰色)

    窗口风格

    1. 1) 所有窗口最大化、最小化风格要一致。
    2. 2) 报错页面的风格一致,最好有统一的报错页面。
    3. 3) 类似功能的窗口打开的风格要一致。
    4. 4) 相同功能在不同模块的名称要一致。
    5. 5) 子窗体应尽量在显示在主窗体的左上或居中放置。
    6. 6) 弹出式窗口应尽量在不借助水平和垂直滚动条的情况下显示所有内容。
    7. 7) 窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;不能只放大窗体而忽略控件的缩放。
    8. 8) 父窗体支持缩放时,子窗体不必缩放。
    9. 9) 实现自定义界面风格(可参考电子社区系统)

    布局与间距(待定)

    1. 1) 窗体控件布局和间距尽量与Windows标准保持一致。
    2. 2) 按钮与窗体上、下、左、右之间的间距为
    3. 3) 按钮之间的间距为
    4. 4) ……

    菜单深度

    1. 1) 菜单深度一般不要超过三层
    2. 2) 菜单层次太多时,应给出返回主窗口、主分支的快捷链接。

    1. 1) 按钮风格相同,大小相似,标题字体保持一致,在整个系统中的显示位置要统一。
    2. 2) 无效按钮要屏蔽。

    1. 1) 各复选框和选项框按选择几率的高低而先后排列。
    2. 2) 复选框和选项框要有默认选项,并支持Tab选择。
    3. 3) 界面空间较小时使用下拉框而不用选择框。
    4. 4) 选项数较少时使用选项框,相反使用下拉列表框。

    文本框输入

    操作项

    基本规范

    必 输 项

    1)必输项中不可为空,不可输入空格

    2)必输项给出必输项标识(*)。

    3)非必输项字段,Null 插入数据库时不会出错,在数据库中设置默认值。

    字段长度

    超过数据库规定长度时不允许输入,自动截断超长部分(注:2字符=1字)

    格式校验

    1)身份证号、E-MAIL、邮箱等特定字段的格式要符合需求的规定。

    日期格式

    1. 1) 日期显示格式一致,为 :yyyy-mm-dd
    2. 2) 使用日期控件,则不可手工录入。
    3. 3) 若允许手工输入:需做格式校验。不可输入字符串、汉字、特殊字符。
    4. 4) 若允许手工输入:对于日期段,需在截止日期小于开始日期时给出提示。

    特殊字符

    1)输入区域输入特殊字符,插入数据库时不出错或提示不允许输入特殊字符。特殊字符包括:‘ “ = @ ` ~ $ % ^ % & # @

    英文输入

    英文输入不区分大小写,不可输入汉字、数字及特殊字符

    数值字段

    只能输入+ ,— ,0~9及功能键(BackSpace 光标) 。数值不能为负数。

    字符字段

    字符字段中只能输入字符,非法字符如单引号、数字均不可输入

    单行文本框/多行文本框

    1. 1) 长度合适,可以容纳相应文字,但不能超过数据库该字段长度,最好将可以输入的最大字符数标在旁边。建议单行文本框中当输入的字符超过一定长度时再输入无效;对于多行文本框给出最大字符数标识

    附件

    1. 1) 可正常添加符合格式的附件。
    2. 2) 附件可正常打开和保存,附件名较长时可正常操作。
    3. 3) 直接输入错误的附件地址,保存时应给出提示信息。
    4. 4) 附件打开和保存到本地时,文件名要显示原文件的文件名。

    密码输入

    1. 1) 需在需求中定义密码是否允许为空或空格;密码是否允许特殊字符;是否区分大小写,密码的可输入长度。
    2. 2) 程序中应给出文字说明密码的可输入长度。

    用户界面行为

    操作项

    基本规范

    1)鼠标为不可点击状态时显示箭头,可点击状态显示手型;系统忙时显示沙漏形状

    光标定位

    1. 1) 打开新增(修改)页面时,光标初始定位在第一个待输入的文本区
    2. 2) 因输入不正确提示用户重新输入时,光标默认focus在出错的输入区,并高亮全选该错误输入。
    3. 3) 若必输项未填写完毕就提交,应给出说明信息并能自动获得焦点;
    4. 4) 可写控件检测到非法输入后应给出说明并能自动获得焦点

    TAB

    1. 1) 界面支持键盘自动浏览按钮功能。即TAB的自动切换功能。
    2. 2) Tab键的顺序与控件排列顺序要一致,一般情况下总体从上到下,同时行间从左到右的方式。

  • 边界值分析法实例

    2007-06-08 10:26:00

    实例:
    “某一为学生考试试卷评分和成绩统计的程序,其规格说明指出了对程序的要求:
    程序的输入文件由80个字符的一些记录组成,这些记录分为三组:
    (1)标题:这一组只有一个记录,其内容为输出报告的名字。
    (2)试卷各题标准答案记录:每个记录均在第80个字符处标以数字“2”。该组的第一个记录的第1至第3个字符为题目编号(取值1—999)。第10至59个字符给出第1至第50题的答案(每个合法字符表示一个答案)。该组的第2,第3,等等记录相应为第51至第100,第101至第150,等等题的答案。
    (3)每个学生的答卷描述:该组中每个记录的第80个字符均为数字“3”。每个学生的答卷在若干个记录中给出。如甲的首记录第1至第9字符给出学生姓名及学号,第10至59字符列出的是甲所做的第1至第50题的答案。若试题数超过50,则其第2,第3,等等记录分别给出他的第51至第100,第101至150,等等题的解答。然后是学生乙的答案记录。
    若学生最多为200人,输入数据的形式如下图所示:
    该程序应给出4个输出报告,即:
    按学生学号排序,每个学生的成绩(答对的百分比)和等级报告。
    按学生得分排序,每个学生的成绩。
    平均分数,最高与最低分之差。
    按题号排序,每题学生答对的百分比。
    以下两个表分别针对输入条件和输出条件,根据其边界值设置了
    测试用例。(共43个测试用例)
    输入条件 测试用例 
    输入文件 空输入文件 

    标题 无标题记录
    只有1个字符的标题
    具有80个字符的标题 

     

    出题个数 出了1个题
    出了50个题
    出了51个题
    出了100个题
    出了999个题
    没有出题
    题目数是非数值量 

    答案记录 标题记录后没有标准答案记录
    标准答案记录多1个
    标准答案记录少1个 


    学生人数 学生人数为0
    学生人数为1
    学生人数为200
    学生人数为201 

    生答题 某学生只有1个答卷记录,但有2个标准答案记录
    该学生是文件中的第1个学生
    该学生是文件中的最后1个学生 

    学生答题 某学生有2个答卷记录,但仅有1个标准答案记录
    该学生是文件中的第1个学生
    该学生是文件中最后1个学生 

    输出条件 测试用例 

    学生得分 所有学生得分相同
    所有学生得分都不同
    一些学生(不是全部)得分相同(用以检查等级计算)
    1个学生得分0分
    1个学生得分是100分 
    输出报告
    (1)(2) 1个学生编号最小(检查排序)
    1个学生编号最大
    学生数恰好使报告印满1页(检查打印)
    学生人数使报告1页打印不够,尚多1人 
    输出报告
    (3) 平均值最大值(所有学生均得满分)
    平均值为0(所有学生都得0分)
    标准偏差取最大值(1学生得0分,1学生得100分)
    标准偏差为0(所有学生得分相同) 
    输出报告
    (4) 所有学生都答对第1题
    所有学生都答错第1题
    所有学生都答对最后1题
    所有学生都答错最后1题
    报告打印完1页后,恰剩1题未打
    题数恰好使得报告打印在1页上

  • 从测试用例看测试的问题及变化

    2007-06-08 10:02:33

     本文为dionysus在51testing论坛上发表的一篇文章
        对于一个测试人员来说测试用例的设计编写是一项必须掌握的能力。但有效的设计和熟练的编写却是一个十分复杂的技术,它需要你对整个软件不管从业务还是从功能上都有一个明晰的把握。

    一、问题:
        许多测试类书籍中都有大幅的篇章介绍用例的设计方法,如等价类划分,边界值,错误推断,因果图等。但实际应用中这些理论却不能给我们很明确的行为指导,尤其是业务复杂,关联模块紧密,输入标准和输出结果间路径众多时,完全的遵循这些方法只能让我们在心理上得到一种满足,而无法有效的提高测试效率。有时我们只有依靠以前项目的用例编写经验(或习惯),希望能在这一个项目中更加规范,但多数情况下我们规范的只是“书写的规范”,在用例设计上以前存在的问题现在依旧。
        当好不容易用例基本完成,我们却发现面对随之而来的众多地区特性和新增需求,测试用例突然处于一种十分尴尬的境地:
     从此几乎很少被执行
     已经与程序的实现发生了冲突(界面变动,功能变动)
     执行用例发现的bug很少
     根本没有时间为新的功能需求增补用例
     有时间补充,但用例结构越来越乱,
     特性的用例与通性用例之间联系不明确(以新增需求为主线列出所有涉及到的更改,但特性与通行之间的数据或业务联系在用例中逐渐淡化)
     知道怎样执行这个用例,但它要说明什么呢?(多数用例给我们的感觉是只见树木,不见森林,只对某一功能,无法串起)

        通过上面的一系列问题可以看到,似乎测试用例给我们带来的问题远多于益处,也正是因为在实际过程中遇到的问题积累,导致我们有很充分的理由忽视或拒绝用例的应用。
    但没有用例或简略用例的编写我们又会舒服很多么?不言自明,谁也不想倒退发展吧。

    二、原因:
        事实上我们在测试用例编写和设计上遇到的一系列问题只是一种表面的呈现,究其原因我认为有如下几点:

    1、没有适合的规范
        “适合的规范”或称“本地化的规范”。这是我们在测试过程中遇到的第一个问题,通常也是很容易习惯且淡忘的。我们拥有相当多的流程文档、书本上的定义,但它适合我们当前的项目么?
    每一个测试工程师在进入这个职业的初期都会了解一些测试上的概念和术语,进入公司或项目组后也会进一步学习相应的文档,例如怎样规范编写,怎样定义bug级别,软件实现的主要业务等。但当测试经理开始给我们分配某一模块的用例编写时,又有多少人知道该怎样去写,怎样写算是好?
    在测试论坛中常能看到介绍用例编写方法的帖子,而迷茫于怎样应用到实践的回复也不为少数。为何我们无法在公司和项目组内找到明确且适合的规范?于是我们只得选择从书本或之前的用例中复制,不管是结构还是方式都依赖于以往•的经验,我并不是说这样就是错误的,但不能总结成文的经验无法给予测试更多帮助。
    我们有太多经验,但却没有形成适合的规范。

    2、功能与业务的分离
        我们知道怎样列举一个输入框的用例,但却很少考虑说明这个输入框是用来做什么的,如果仔细分析不难发现,用例中这种功能与业务的分离越来越普遍也越来越明显。
    边界值、等价类划分、因果图,这些用例方法是一种高度提纯的方法,本身就很偏向于功能及代码,所以怎样编写业务的用例我们就从理论上失去了参考。
        复杂的业务会贯穿于整个软件,涉及众多功能点,里面组合的分支更不可胜数。测试用例务求简洁、明确,这一点也与业务“格格不入”。功能用例依赖程序界面,业务描述依赖需求文档。于是我们更偏向于根据已实现的界面编写功能用例,列举出众多的边界值、等价类。流程的操作只有凭借经验和理解,这时测试出的bug是最多的,但我们却无法使这个bug对应到一个用例中(点击一个按钮报出的错误有时原因并不在这个按钮或按钮所在的窗体)。正因为我们没有很好的积累业务上的用例,才使得我们感到执行用例时发现的bug不多。
    用例结构的划分一定程度上也造成了功能和业务的分离,依照界面模块建立文件夹,并在其中新建不同用例,这使得用例从结构上就很难联通起来。

    3、测试未能跟上变化
        变化!想象一下,当我们越来越多的听到开发人员在那里高呼“拥抱变化”“敏捷开发”的时候,测试又有什么举措呢?当地区特性,软件版本越来越多的时候,测试是否在积极响应呢?变化是我们面临的最大挑战,我认为测试未能跟上变化是造成测试过程中遇到种种问题和矛盾的主要原因。
    对需求和程序的变化测试人员的感受是非常深的,测试总是跟在需求和开发后面跑,使得所有风险都压在自己身上。不断压缩的时间和资源使我们只能放弃那些“不必要”的工作:尽快投入测试,尽快发现bug,而非从整体把握软件的质量情况,统筹策略。
    疲于应对的直接影响就是程序质量无法准确度量,进度无法控制,风险无法预估。用例与程序脱节,新增用例混乱和缺少。长此以往我们只得放弃修改、增补用例,甚至放弃之前积累的所有成果。用例变为程序变更的记录摘要,没有测试数据的保留,测试步骤和重点无法体现,新加功能与原来的程序逐渐“脱离”,可能还会出现相互违背的情况,但这我们却无法很快发现。
    永远是变化决定我们的下一步工作,这也是混乱的开始。

    三、可能的解决办法:
        在这里我希望以探讨的方式提出一些可能的解决办法,因为上面的问题也许在成熟的公司和项目组内很少遇到,而遇到问题的也需根据不同的情况单独考虑。不用拘泥形式,最适合的就是最好的。

    1、测试驱动开发,用例指导结果,数据记录变化
        “测试驱动开发”(TDD)是一个比较新的概念,在网上可以看到很多介绍文章,它主要讨论如何让开发的代码更奏效(Work)更洁净(Clean),“测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码”。可以看到,TDD是建立在“代码”级别的驱动,但目前我们需要探讨的问题是怎样在黑盒测试中做到“测试驱动开发”。
    首先我们需要纠正一个态度,很多人认为黑盒测试的技术含量不高,可思考可拓展的内容不多,主要的工作就是用鼠标在那里瞎点,于是很多“高级”的技术方法都试图与黑盒测试划清界限。但测试人员发现的bug有80%以上都是黑盒测试发现的,手工操作软件仍是目前检验软件质量最有效的一种方法。
        如何在黑盒测试中做到测试驱动开发?我认为可以从用例级别做起,以业务用例指导过程和结果。
    开发人员通常比较关注技术,对于业务上的理解容易忽视并出现偏差,而需求文档又不会很明确的指出应该实现怎样的结果,这使得从业务到功能出现一个“阅读上的障碍”,如果最后程序错误了还需返工,这样耗费的人力物力就非常大了。使用业务用例驱动开发,就是一个比较好的方法,同样这也需要运用测试中的各种方法,列举出业务流程里数据的等价类和边界值。
    业务用例的构造要先于程序实现,与需求和开发人员沟通一致,并以此作为一个基准,保证程序实现不会错,还能对整个软件的进度和质量有一个很好的估计和度量。业务用例可以不关注程序的界面,但一定要有数据的支持。这就是测试主导变化的另一点“数据记录变化”。
    我们不仅要应对变化,还要记录变化,使测试用例成为对程序持续性的监控,数据可以作为最基本、最简单的支持。当一个业务很复杂时可以拆分成段(业务段与程序中以窗体或页面的划分是不一样的),使用典型的用例方法列出实际输入和预期结果。我们希望数据能做到通用和共享,最理想的情况就是建立一个“数据库”,每个业务用例都从“数据库”中取得输入数据和预期结果,这个数据只是针对业务入口和出口的,当程序内部设计变更时,保留的数据不会因此而作废。举一个例子,例如我的程序要从某种文件中读取数据并计算结果,一段时间后程序内部字段增加了,如果是以保存的文件附件方式提供数据,则现在程序很可能就打不开这个文件了。使用“数据库”指导测试人员可以在变化的程序里直接针对业务输入,而不关心程序内部结构。
        再进一步的话“数据库”就开始涉及到程序内部的接口了,这需要开发人员的配合。

    2、为用例标明时间(版本)和优先级
        为测试用例标明时间或版本可以起到一种基准的作用,标明项目进度过程中的每一个阶段,使用例直接和需求基线、软件版本对应。同样这需要规范流程,也是对变更的一种确认和控制。或者可以为用例增加一个状态,指明这个用例目前是否与程序冲突,当程序变更时改变用例的状态,并更新用例版本。
        为测试用例标明优先级可以指出软件的测试重点、用例编写的重点,减少用例回归的时间,增加重点用例执行的次数,帮助项目组新人尽快了解需求,在自动化测试的初期也可以参考这个优先级录制脚本。

    3、功能用例与业务用例分开组织
        将功能用例与业务用例分开组织,按照不同关注点列举执行路径。业务用例应在开发前或同期编写,帮助测试人员和开发人员明确业务,了解正确流程和错误流程。功能用例更依赖于程序界面的描述,但功能用例并不等于使用说明。对某些模块的等价类、边界值测试会发现很多严重的bug,也许与业务无关,但用户往往很容易这样操作(例如登录名,你是否考虑到很长的名字,或者用户的键盘有问题,总是敲入n多空格在里面,这与业务无关,但程序将会怎样处理?)。

    4、审核用例,结对编写
        测试组长或经理对用例进行审核可以做到用例的补充和校对,但一般情况下是很难做到的,我们可以采用另一种方法,就是结对编写测试用例(前提是你有两个以上的测试人员),内部审核。
    测试用例不是一个人编写一个人执行,它需要其他测试人员都能读懂且明白目标所指。结对编写可以尽量减少个人的“偏好习惯”,同时也能拓展思维,加强测试重点的确认,小组内部达到统一。一定程度上结对编写也可以减少组长或经理对用例的管理,提高组员的参与积极性。

    四、发展
        上面的这些解决方法只是一种建议,具体怎样实施到项目中还需根据情况而定。可以看到测试的发展方向是很多很广的,传统的黑盒测试并不是毫无新意,测试工作怎样适合我们而发展,将给予我们更多的思考
  • 登陆、添加、删除、查询模块的测试点

    2007-06-08 09:40:47

    这是在51testing论坛上一位会员提供的关于登陆、添加、删除、查询模块的测试.原始链接:http://bbs.51testing.com/thread-47421-1-1.html一下是他写的内容:
        以前在这里看到一篇文章说,要积累各个常用模块的测试点,然后到需要测试的时候就根据这些测试点设计测试用例,我觉得这是一个好方法,就决定总结一下。我的实际经验不多,根据我在论坛中学到的零散的东西和自己的想象,总结出以下几点,欢迎各位继续补充。
    1.        登陆
    2.        添加
    3.        查询
    4.        删除


    1.        登陆
    ①        用户名和密码都符合要求(格式上的要求)
    ②        用户名和密码都不符合要求(格式上的要求)
    ③        用户名符合要求,密码不符合要求(格式上的要求)
    ④        密码符合要求,用户名不符合要求(格式上的要求)
    ⑤        用户名或密码为空
    ⑥       
    数据库中不存在的用户名,不存在的密码
    ⑦        数据库中存在的用户名,错误的密码
    ⑧        数据库中不存在的用户名,存在的密码
    ⑨        输入的数据前存在空格
    ⑩        输入正确的用户名密码以后按[enter]是否能登陆

    2.        添加
    ①        要添加的数据项均合理,检查数据库中是否添加了相应的数据
    ②        留出一个必填数据为空
    ③        按照边界值等价类设计测试用例的原则设计
    其他输入项的测试用例
    ④        不符合要求的地方要有错误提示
    ⑤        是否支持table键
    ⑥        按enter是否能保存
    ⑦        若提示不能保存,也要察看数据库里是否多了一条数据

    3.        删除
    ①        删除一个数据库中存在的数据,然后查看数据库中是否删除
    ②        删除一个数据库中并不存在的数据,看书否有错误提示,并且数据库中没有数据被删除
    ③        输入一个格式错误的数据,看是否有错误提示,并且数据库中没有数据被删除。
    ④        输入的正确数据前加空格,看是否能正确删除数据
    ⑤        什么也不输入
    ⑥        是否指出table键
    ⑦        是否支持enter键

    4.        查询
    精确查询:
    ①        输入的查询条件为数据库中存在的数据,看是否能正确地查出相应得数据
    ②        输入正确的查询条件以前加上空格,看是否能正确地查出相应的数据
    ③        输入格式或范围不符合要求的数据,看是否有错误提示
    ④        输入数据库中不存在的数据
    ⑤        不输入任何数据
    ⑥        是否支持table键
    ⑦        是否支持enter键
    模糊查询:
    在精确查询的基础上加上以下一点
    ①        输入一些字符,看是否能查出数据库中所有的相关信息
     
  • 界面测试经验总结

    2007-06-08 09:39:42

    1.应验证界面显示内容的完整性:

    a) 报表显示时应考虑数据显示宽度的自适应或自动换行。

    b) 所有有数据展现的界面(如统计、查询、编辑录入、打印预览、打印等),必须使测试数据的记录数超过一屏/一页,以验证满屏/页时其窗体是否有横向、纵向滚动条或换页打印,界面显示是否正常;

    2.应验证界面显示内容的一致性:

    a) 如有多个系统展现同一数据源时,应保证其一致性;

    3.应验证界面显示内容的准确性:

    a) 对于报表中的所有字段值都应该有明确的定义,对于无意义的字段值,不应该显示空,应显示“--”或“/”,表示该字段值无意义。

    4.应验证界面显示内容的友好性:

    a) 对统计的数据应按用户习惯进行分类、排序。

    b) 某些重要信息在输入、修改、删除时应有“确认”提示信息;

    c) 界面内容更新后系统应提供刷新功能。

    d) 用户在退出系统后重新登陆时应考虑是否需要自动返回到上次退出系统时的界面;

    5.应验证界面提示信息的指导性:

    a) 在多个业务功能组成的一个业务流程中,如果各个功能之间的执行顺序有一定的制约条件,应通过界面提示用户。

    b) 用户提示信息应具有一定的指导性,在应用程序正在进行关键业务的处理时,应考虑在前台界面提示用户应用程序正在进行的处理,以及相应的处理过程,在处理结束后再提示用户处理完毕。

    c) 在某些数据输入界面,如果要求输入的数据符合某项规则,应在输入界面提供相应的规则描述;当输入数据不符合规则时应提示用户是否继续。

    d) 在对任何配置信息修改后,都应该在用户退出该界面时提示用户保存(如果用户没有主动保存的情况下);

    6.应验证界面显示内容的合理性:

    a) 在对某些查询功能进行测试时,应考虑查询条件的设置的合理性以及查询结果的互补性。如某些后台处理时间不应该作为查询条件。

    b) 界面测试时,应考虑某一界面上按钮先后使用的顺序问题,以免用户对此产生迷惑。例如只能在查询成功后显示执行按钮。

    c) 界面测试时,应验证窗口与窗口之间、字段与字段之间的浏览顺序是否正确;

    7.界面测试时,应考虑用户使用的方便性:

    a) 在某些对数据进行处理的操作界面,应考虑用户可能对数据进行处理的频繁程度和工作量,考虑是否可以进行批量操作。

    8.界面测试时,应考虑界面显示及处理的正确性:

    a) 界面测试时应验证所有窗体中的对象状态是否正常,是否符合相关的业务规则需要。

    b) 应验证各种对象访问方法(Tab 健、鼠标移动和快捷键)是否可正常使用,并且在一个激活界面中快捷键无重复;

    c) 界面测试不光要考虑合理的键盘输入,还应考虑是否可以通过鼠标拷贝粘贴输入。

    d) 对于统计查询功能的查询结果应验证其是否只能通过界面上的查询或刷新按键人工触发,应避免其他形式的触发。

    e) 对界面上的任何对象进行拖拉,然后进行查询、打印,应保证查询打印结果不变;

    9.界面测试时,应考虑数据显示的规范性:

    a) 确保数据精度显示的统一:如单价0元,应显示为0.00元;

    b) 确保时间及日期显示格式的统一;

    c) 确保相同含义属性/字段名的统一;

    d) 对所有可能产生的提示信息界面内容和位置进行验证,确保所有的提示信息界面应居中。

Open Toolbar