发布新日志

  • RFT,QTP,ROBOT工具比较小结

    2013-04-18 08:55:22

    RFT,QTP,ROBOT工具比较小结

    前提:

    RFT使用时间:2个月

    QTP使用时间:1个月

    ROBOT使用时间:36个月

     

    之所以用“小结”是就目前我使用的情况而言的,因为毕竟我对RFTQTP使用并不是很长时间,下面我将对我使用过的几点,将三个工具加以对照:

     

    1.      脚本语言:RFT使用的是JAVA, QTP使用的是VBROBOT使用的是SQABasic

     

    2.      对象识别能力:RFT对象识别能力比ROBOT有了很大的提高,与QTP的对象识别能力不相上下。RFTQTP都用到了对象库技术,即在录制脚本时,把录制的每个控件作为一个对象记录在对象库里。而且这个对象库里的内容一般是不让修改的(就目前使用的试用版RFT而言,对中文的支持很不友好,在界面上识别的中文全部是乱码)。

     

    3.      录制脚本:QTP在录制时不是只录你操作的对象,而是把所有出现在页面上的控件作为对象全部记录下来,这样就导致我们在录脚本时,必须把页面上所有控件的内容改动一下,如果不是这样的话,回放很难成功。举个例说一下:在线预订时,在录制时没有选择日期,入住日期默认是当天的日期,用QTP录制时在它的对象库里会记录下这个入住日期,在第二天回放该脚本时,则不会成功,因为QTP会把日期改为录的那一天,而且这个值不能在脚本里改,这个值在对象库里改不了。一般的解决办法是重新录,这样导致这个脚本的维护性很低。而在ROBOTRFT中,这点确表现的很好,录什么则记录什么,也可以追加录制,很灵活方便。

     

    4.      日志记录能力:RFT的日志记录能力最强。它可以形成HTML日志或TEXT日志或记录在TESTMANAGER里。而且除了文档,它还可以生成伪视频,捕捉在出错前的一个短视频。

     

    5.      文本编辑能力:三者之中QTP最弱,ROBOT次之,RFT最强。而且RFT是基于ECLIPS编辑器的,所以编辑功能比之前的ROBOT大大加强。

     

    6.      回放速度:QTP的回放速度最快,ROBOTRFT差不多。

     

    7.      数据池:QTP的数据池最简单,不用设计变量类型,而ROBOTRFT的都要复杂些,特别是RFT还需要指出类型所在的包。

     

    8.      对系统资源要求:RFT对系统资源的要求最高,在默认设置下,RFT的回放需要700M内存,而且是就这一个工具运行而言。


  • QESAT/C++软件分析与测试工具

    2011-11-02 17:39:03

    QESAT/C++ 软件分析与测试工具
     

      QESat/C++ 是北京航空航天大学软件工程研究所自主研制的C++软件分析与测试工具。它采用静态分析技术帮助您快捷地分析和理解源程序,并采用插装技术支持对程序进行语句覆盖、分支覆盖、方法覆盖、类覆盖等白盒测试。QESat/C++不仅是软件开发人员必备工具,同时也是软件维护人员的得力助手。

    • 程序基本信息的提取:QESat/C++通过分析源代码自动提取程序中的各种基本信息,包括程序中定义的文件和类,类中的成员变量和成员函数,以简洁的树形目录形式完整地显示给用户。用户可以在目录的引导下,便捷地选择和展示这些程序元素的详细信息和结构特点。
    • 类图模型的可视化:QESat/C++可以自动地逆向生成程序的类图模型,并采用多种视图来展示程序中的类及其相互之间的各种关系,包括类的继承、关联和聚集关系。QESat/C++采用UML标准的类图模型表示法,使用自主设计的层次型自动布图算法来绘制类图。QESat/C++还提供了对类图布局的编辑、相关信息的交叉显示等功能。
    • 方法的控制流程的可视化: QESat/C++可以自动地逆向生成方法的控制流程图,清晰展示方法内部控制结构。同时,根据被测程序动态执行结果,控制流程图中被执行过的分支将被自动着色,从而向测试者直观地展示出测试的进程。
    • 六种复杂性度量的提取:根据静态分析的结果,QESat/C++提供了可执行语句数、McCabe圈复杂度、Halstead科学复杂度、类的DIT、NOC、RFC等六种度量。作为国际上通行的衡量程序复杂度的指标,它们成为软件人员评价软件质量的重要参考依据。复杂度越高的程序意味着内藏错误的危险性越高,程序难于理解和维护,测试工作量也会随之成倍增加。
    • 软件覆盖率测试: QESat/C++支持传统的语句覆盖率测试和分支覆盖率测试,以及针对面向对象的类覆盖测试和方法覆盖测试。QESat/C++除了根据语句覆盖和分支覆盖的结果分别在源代码和控制流程图上对已经执行过的部分进行着色,还提供关于各种覆盖测试结果的统计报表。
    • 程序执行频度分析: QESat/C++自动统计在程序中每个类的实例化次数和每个方法被动态调用次数,从而找出程序中被频繁执行的“核心”代码,确定测试的重点,并指导对程序结构或算法的改进和优化,以提高程序的执行效率。

      QESat/C++提供了一个支持多窗口、菜单驱动的用户工作环境。在这个操作简明的工作环境中,用户可以方便地分析程序结构,编译和运行程序,以及察看分析和测试结果。

    1. 类关系视图:

           

    2. 类聚集关系视图:

            

    3. 类视图:

          

    4. 方法控制流程图:

          

    5. 信息视图:

         
    6. 报表:
        

  • [测试]QESatJava白盒测试工具

    2011-11-02 17:37:55

    在人们的意识中,往往会认为软件测试工具是为一些软件开发的专业人员设计的,但就
    Java软件分析与测试工具而言,其适用范围还不仅限于专业人员。开发软件产品的专业技术人
    员的确需要Java软件分析与测试工具帮助他们提高和保证产品的质量,而另一方面,项目的提
    出单位或使用单位也需要Java软件分析与测试工具来评估和验收由开发单位提交的软件产品的
    质量。负责产品维护的人员,无论是开发单位的人员还是使用单位的人员,更需要Java软件分
    析与测试工具来帮助分析和理解系统,并在对系统做了任何修改之后,重新加以系统地测试。

    Java软件分析与测试工具是一个通用的软件分析和测试工具,适用于分析和测试各种类型
    的应用软件和系统软件。被处理的软件可以是一个完整的程序、一个方法库、程序的一部分或
    者是单一的方法模块。

    Java软件分析与测试工具,是在基于Java技术开发过程中为确保软件质量而不可缺少的一
    个重要工具。它帮助分析和测试程序,使开发人员更快捷有效地理解程序结构,及早地发现程
    序中暗藏的错误,提高程序的质量。

    QESAT-Java

    Java软件分析与测试工具,是一个分析与测试的支持工具,也可以说是一个质量保证工
    具,同时还是一个Java软件理解工具。它通过对Java软件的源代码进行分析和运行程序,提供
    下列服务:

    ◆ 项目基本信息的提取功能:通过对源代码的分析,提取被测项目的基本信息,包括项目中
    所含的包、类等,以及它们的相关信息(例如修饰符、所在行号等)。将这些通过逆向分析所
    得的信息,组织成树的形式显示出来,既方便查看,又可作为浏览其它图或表时的导航。

    ◆ 项目中类的可视化分析功能:提供了整个项目中类之间的关系图(包括关联、聚集、继承
    三种关系)。关系图均以类为结点、有向线段反映类之间的关系,采用层次型的布图方式反映
    了软件粗粒度的结构。这些关系图支持测试信息的交叉显示,支持图的编辑和保存,还支持在
    整体视图中显示单个类的个体行为。

    ◆ 方法内控制流程的分析功能:提供了项目中每个方法的控制流程图,是软件中粒度的结构
    反映。静态分析出的控制流程,以图的方式显示出来,既反映了方法内部的结构信息,又表明
    了每个控制流的可能走向。动态分析出的结果,以染色的方式标志在图上,反映了某次运行的
    实际执行轨迹。

    ◆ 六种复杂性度量:这六种度量是国际上通行的衡量程序复杂度的指标。复杂度越高的程序
    意味着内藏错误的危险性越高,测试工作也会成倍增加,程序难于理解和维护。

    ◆ 软件覆盖率测试:支持软件测试充分性的两种国际标准,语句覆盖率测试和分支覆盖率测
    试,同时还支持基于面向对象的两种覆盖测试,类覆盖测试和方法覆盖测试。覆盖率测试的结
    果,以两种方式直观显示。语句、分支覆盖的结果以在函数控制流程图及源代码上着色的形式
    表示;另外,所有覆盖结果还提供可打印的表单。

    ◆ 程序执行频度分析:统计类被实例化的次数以及类中的方法被动态调用次数。结合程序的
    动态执行频度和复杂度,有效指导改善程序的结构或算法以提高程序的执行效率。

    Java软件分析与测试工具提供了一个支持多窗口、菜单驱动的用户工作环境。在这个操作
    简明的工作环境中,用户可以方便地编译和运行程序,分析和检查程序结构及测试结果。

  • SQL系统语句大全

    2008-08-18 11:00:05

    1、用户

    查看当前用户的缺省表空间
    SQL>select username,default_tablespace from user_users;

    查看当前用户的角色
    SQL>select * from user_role_privs;

    查看当前用户的系统权限和表级权限
    SQL>select * from user_sys_privs;
    SQL>select * from user_tab_privs;

    显示当前会话所具有的权限
    SQL>select * from session_privs;

    显示指定用户所具有的系统权限
    SQL>select * from dba_sys_privs where grantee='GAME';

    显示特权用户
    select * from v$pwfile_users;

    显示用户信息(所属表空间)
    select default_tablespace,temporary_tablespace
    from dba_users where username='GAME';

    显示用户的PROFILE
    select profile from dba_users where username='GAME';


    2、表

    查看用户下所有的表
    SQL>select * from user_tables;

    查看名称包含log字符的表
    SQL>select object_name,object_id from user_objects
    where instr(object_name,'LOG')>0;

    查看某表的创建时间
    SQL>select object_name,created from user_objects where object_name=upper('&table_name');

    查看某表的大小
    SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&table_name');

    查看放在ORACLE的内存区里的表
    SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;

    3、索引

    查看索引个数和类别
    SQL>select index_name,index_type,table_name from user_indexes order by table_name;

    查看索引被索引的字段
    SQL>select * from user_ind_columns where index_name=upper('&index_name');

    查看索引的大小
    SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments
    where segment_name=upper('&index_name');

    4、序列号

    查看序列号,last_number是当前值
    SQL>select * from user_sequences;

    5、视图

    查看视图的名称
    SQL>select view_name from user_views;

    查看创建视图的select语句
    SQL>set view_name,text_length from user_views;
    SQL>set long 2000; 说明:可以根据视图的text_length值设定set long 的大小
    SQL>select text from user_views where view_name=upper('&view_name');

    6、同义词

    查看同义词的名称
    SQL>select * from user_synonyms;

    7、约束条件

    查看某表的约束条件
    SQL>select constraint_name, constraint_type,search_condition, r_constraint_name
    from user_constraints where table_name = upper('&table_name');

    SQL>select c.constraint_name,c.constraint_type,cc.column_name
    from user_constraints c,user_cons_columns cc
    where c.owner = upper('&table_owner') and c.table_name = upper('&table_name')
    and c.owner = cc.owner and c.constraint_name = cc.constraint_name
    order by cc.position;

    8、存储函数和过程

    查看函数和过程的状态
    SQL>select object_name,status from user_objects where object_type='FUNCTION';
    SQL>select object_name,status from user_objects where object_type='PROCEDURE';

    查看函数和过程的源代码
    SQL>select text from all_source where ōwner=user and name=upper('&plsql_name');

  • 再论TD的数据迁移

    2007-09-29 10:12:53

         因为经常出差去客户那里进行现场测试,虽然TestDirector可以提供外网访问的功能,但毕竟多人通过外网访问起来,速度还是比较慢的.为了解决这个问题,我们决定通过一台笔记本作为临时TD服务器,去现场测试的时候将服务器中的TD项目导入到笔记本中,笔记本作为临时的TD服务器,现场测试完毕回到公司后再把项目导入到TD服务器中.(通过EXCEL的导入导出也能解决我们的问题,但是EXCEL在编写计划以及用例和bug的时候不够直接)

        曾经在网上找到过一篇介绍TD如何做项目迁移的文章,但是通过实践,觉得那样迁移还是比较麻烦的,经过不懈的摸索,终于找到了一个比较省事的方法,在这里记录下来,希望能和广大测试人员进行交流.

    环境

        我们使用是TD7.6+sp4,服务器和笔记本均为win2003系统,数据库均为sql2000(笔记本在xp系统下也实现过此种方法的迁移) 服务器和笔记本均采用集成环境,也就是把TD服务程序以及TD数据库均放在同一台机器上.对于分布式环境能否这样移植我们没有试验过,有兴趣的朋友可以试试.

    步骤

    1、笔记本安装好sql2000和TD7.6后,使用TD建立一个和服务器上要迁移的项目名称相同的项目。如:需要迁移原服务器上在LOTT域下的sd-004项目,则需要在笔记本上的TD中建立一个同样域名、同样项目名的项目。如图原服务器上的sd-004项目。(注意:在安装TD时最好按照它的默认进行安装,安装完毕后设置数据库别名,数据库别名一定要和安装TD时默认的数据库名称一致)

    2、关闭笔记本上的TD,打开sql,本地服务器的数据库中已有了刚才我们建立的sd-004数据库,此时在sql中建立与TD服务器的连接,将TD服务器中sd-004数据库导出到本地服务器中,并覆盖本地服务器的sd-004数据库。

    3、将TD服务器C:\TD_Dir\LOTT\sd-004文件夹下的文件全部拷出,覆盖到笔记本的C:\TD_Dir\LOTT\sd-004文件夹下。

    4、将TD服务器C:\Program Files\Common Files\Mercury Interactive\DomsInfo文件夹下的文件doms文件拷出,覆盖到笔记本的C:\Program Files\Common Files\Mercury Interactive\DomsInfo文件夹下。

    5、重新启动笔记本的TD服务,此时项目已经移植成功。

    注意

        TD是个相当脆弱的软件,即使按照我上边的操作步骤完成也可能会出现问题,我就出现过移植完成后进入项目时提示找不到数据库目录的错误信息,此时在原TD的基础上重新安装一下TD,此问题便可解决。
     

  • TestDirector项目数据迁移

    2007-09-29 09:53:43

    【摘要】TestDirector, (以下简称TD)它是Mercury Interactive 公司推出的基于WEB浏览器环境下的测试管理工具。通过TD的流程控制可以规范软件企业的测试流程、改善测试质量、减轻测试人员的负担、提高工作效率。在接触TD过程中仍然存在着很多未知领域等待着我们这些从事软件测试工作的同行去研究去拓展,如何更有效的使用TD提高我们的测试管理,将是我们继续研究关注的方向。本文总结了我们在移植TD项目方面的一些经验和技巧,希望对大家有所帮助。

    【关键词】项目移植集成工作环境分布式工作环境

    这里我们先将以上的几个名词解释一下:

    项目移植:这里说的项目移植是指将已经建立的TD项目整体文件在保证数据安全和完整的前提下移植到其他服务器的过程,这个过程包括以下几个方面(1)数据库的移植(2)项目文件的移植(3)项目配置文件的移植。经过移植后的TD项目可以实现双机备份的功能。

    集成工作环境:我们把TD服务程序和TD 使用的数据库存放在同一台计算机上的这种工作环境称为集成工作环境。这种工作环境节省成本,维护较复杂,不利于数据的安全性。

    分布式工作环境:我们把TD服务器程序和TD后台使用的数据库存放在不同机器上,也就是使用单独的一台计算机作为TD项目的数据库服务器,TD服务程序通过网络访问数据库服务器,这种工作环境称为分步式工作环境。这种环境的成本较高,但是利用维护,数据的安全性较高。对一些专业性的企业尤其是需要将TD开放到Internet上,我们建议使用这种工作环境。

    移植说明

    基于IIS WEB服务下的TD服务程序支持的数据库有ACCESS,SQL SERVER、SYBASE、ORACLE。由于ACCESS数据库的迁移比较容易本文就不介绍,本文主要讨论SQL SERVER数据库的移植。掌握SQL SERVER数据库类型的TD项目移植,对ORACLE、SYBASE类型数据库的项目移植工作也能做到触类旁通。下面大家就跟我们一切进入TD项目移植的具体工作吧!

    下面的移植工作,我们选用了一个名为:E-CIS的项目进行实例移植,同时我们将其他计算机上的TD项目(SAAA、SIMS、E-ICID)与E-CIS进行了合并。

    。集成工作环境的数据迁移

    1、拟分析产生的原因和解决方法

    产生的原因:

    由于我们配置的TD服务器与数据库服务器是同一台计算机,一旦计算机发生故障,TD项目中的数据既便是备份出来也很难恢复,其主要原因是:

    • 使用TD建立项目时,TD会在数据库中自动建立一个名为TD的用户,我们运行的E-CIS项目中所有的表都是由TD这个用户建立的,无法删除和添加这个用户。
    • 在SQL查询分析器中可以看到所有相关的表都是td.*的格式,这样会造成如果SQL查询分析器是以其他用户登入,执行select * from all list出现错误。出现一定要加前缀后才能查询出来数据问题,这个就是造成恢复数据库后即使其他项目都配置正确,但TD依然不能正常使用的一个重要原因。
    • 在安装TD后会在安装盘符:\Program Files\Common Files\Mercury Interactive\Domsinfo目录下,有一个用来存放系统信息的ACCESS数据库Doms.mdb,这个数据库由TD创建,并且是经过加密的,它存放着TD所有的配置信息。这个数据库是是否能够成功恢复TD项目的一个重要因素。

    2、移植前的备份工作

    在正式移植之前,我们首先要做好数据的备份工作,这也是我们移植工作的一部分,虽然我们现在的移植技术已经相对较成熟,但是我们还是要建议大家移植之前的备份是很有必要的。备份主要备份以下的数据:

    .备份DomsInfo目录;

    默认在C:\Program Files\Common Files\Mercury Interactive下。这个目录包含了Doms.mdb文件(用户信息和工程列表)、connection strings(连接字符串)、parameters(参数)、global style sheets(全局风格表)、the database template(Empty_DB.mdb)(一些临时数据)

    .备份TD项目安装文件;

    TD_Dir包含每个工程的自动测试、附件、设置、风格列表。默认在C:\TD_Dir\Default目录下,打开这个目录可以看到TD的工程文件,我们需要将这些工程文件备份下来。

    .备份项目数据库;

    备份项目用的数据库文件。

    3、移植工作

    移植工作分为四个部分:

    ――数据库的迁移;

    ――建立访问数据表文件的TD用户;

    ――修改TD的项目配置数据库(Access);

    ――修改Project中的INI文件。

    1)数据库的迁移:

    数据库的移植目的是:将项目数据库从原来的计算机移植到新的计算机。

    具体思路:通过SQL Server 集成的导入和导出数据功能将原数据库文件导入新的SQL Server服务器中。在这个过程,原表中由TD用户创建的表也会更改为DBO用户创建。例如:数据库中的表ALL_LISTS原来由td用户创建,移植后ALL_LISTS表的用户更改为dbo这样问题也就解决了。

    我们现在开始图解数据库的操作:

              从开始菜单中打开“导入和导出数据”如图:
       

             单击 “Next”

       

             选择要恢复的数据源后单击“Next”

       

       设置数据库恢复到的位置,注意:需要在数据库 这里设定数据库被恢复的名称,点击    

       

              建立数据库名称后,单击确定后,再“Next”按钮:

       

             再“Next”(这个选项选择第三项更具有完整性)

       

             选择需要恢复的数据表后(在这里选择全部表),再”Next”:

       

             准备开始恢复,单击“Next”:

       

             单击”Finish”按钮,开始恢复:

       

              恢复成功后出现提示:

       

    数据库恢复完成。

    2)建立访问数据表文件的TD用户:

    建立td用户的目的是:使td用户具有访问新恢复项目数据库的权限。

    具体思路:建立一个名为td的用户,使这个用户具有访问TD项目数据库的控制权限,TD通过这个用户对项目数据库进行增、删、改的操作。

    打开企业管理器,在目标数据库计算机中建立TD用户,并且设定TD用户访问的数据库。

       

            在登录项中新建用户,在弹出的对话框中设定td用户相关的属性,如:

       

    设定的密码可以根据用户确定,这里设定为:tdtdtd;在“服务器角色”中设定td用户的权限,我们给出建议设定为“System Administrators”:

       

                  完成“服务器角色”的设定,为td用户设定数据库访问的权限:

       

    设定td用户能够访问TD项目的数据库和Master数据库。设定完成后,确认td用户默认数据库是否为Default_e-cis_db

    设定完成。

    3):修改TD的配置项目文件(Access):

    修改配置文件目的是:将项目文件(TDDIR目录下存在的项目文件)和项目数据库进行关联。

    具体思路:修改ACCESS数据库中每一个配置参数,使TD项目文件和项目数据库关联,通过这个操作我们还可以实现多个TD项目合并删除的功能。(在这里我们就不详细介绍,有兴趣的朋友可以研究一下)

    在TD安装的计算机中的C:\Program Files\Common Files\Mercury Interactive\DomsInfo目录下打开doms.mdb文件,此文件是经过加密处理的,其密码为:tdtdtd

    打开后可以看到相应的表:

       

    这些表,存放着TD所有的配置信息,是很重要的,我们根据自己的工作环境实际配置这个表,其中需要修改的表是:DBSERVER、DOMAINS、PARAMS、PROJECT和TDSERVERS这五个表。

    a.DBSERVER表中主要修改DBSERVER_NAME(目标数据库服务器的IP如本例为10.168.188.151)、DB_USER_PASS(用户密码如tdtdtd)、DB_ADMIN_USER(管理用户名如td)和DB_ADMIN_PASSWORD(管理用户密码如tdtdtd)字段的值,如下图:
       

          b.DOMAINS表中主要修改PHYSICAL_DIRECTORY字段的值。(基本上不要修改)

       

         c.PARAMS表中主要修改PARAM_VALUE字段的值。(基本上不要修改)

       

    d.PROJECT表中主要增加或修改一个记录就行了,其关键字段表示的意思是PROJECT_ID(项目ID号不能重复),PROJECT_NAME(项目名称),DB_NAME(项目对应的数据库名称如本例的default_e_cis_db),DB_TYPE(数据库类型1为ACCESS,2为SQL SERVER),PHYSICAL_DIRECTORY(TD服务器中的共享目录如本例为\\10.168.188.152\td_dir\default\e_cis、DB_USER_PASS(TD用户密码如本例为tdtdtd)、DBSERVER_NAME(数据库的IP地址)。

       

         e.TDSERVERS中主要修改DBSERVER_NAME、TD_IP_ADDRESS

       

    说明:以上修改是针对移植工作修改的表,如果我们需要将分布在多台计算机上的TD项目合并移植到一台服务器上,还需要修改ACCESS数据库中的SEQUENCES表中的USER_SEQ字段的数值,这个字段是用来控制用户数量,如果数值太小TD部分用户就出现无法登录的现象。

       

    总结:修改的内容还需要根据自己的实际情况进行修改,我这里只列出常修改的一些字段。

    4):修改Project中的INI文件:

    修改INI文件目的是:ini文件保存数据库信息,TD程序信息,项目名称以及相关的内容。

    具体思路:修改ini文件配置参数,使TD项目文件和项目数据库关联。

    将C:\TD_Dir\Default目录下面的E-CIS项目文件,拷贝到备份的计算机中,然后修改E-CIS文件夹内的Dbid.ini文件:

    Dbid.ini 内容:

    [General]

    Database_Type=MSSQL

    Created_Date=08/11/04 15:44:39

    Created_By=td

    AliasName=E-CIS

    Database Name=default_e_cis_db

    Database Server=10.168.188.229

    Domain Name=DEFAULT

    SendAllQualified=Y

    Has_VCS_DB=Y

    主要修改的内容是:

    Database Name=default_e_cis_db

    Database Server=10.168.188.229

    按照实际情况填写这些信息,就ok了。

    总结:通过以上的介绍,我们集成工作环境的移植工作就已经完成了。经过这样的移植,我们可以实现TD项目的双机备份,双机备份可以让我们的数据更安全、更有保障。

    .分布式工作环境的备份和恢复方法

    分布式工作环境的项目移植相对集成工作环境移植更简单,在这里我们不详细介绍,相信大家看过集成工作环境的移植对分布式移植不在话下了。

    我们对分布式工作环境移植的思路:

    • 强调首先备份项目的数据。
    • 移植TDDir目录下的项目文件到新的服务器上。
    • 复制DomsInfo目录到新服务器C:\Program Files\Common Files\Mercury Interactive下。
    • 修改这个目录下Doms.mdb文件的参数。(修改的详细方法见集成工作环境的移植)

    总结:相对集成工作环境移植来说,分布式结构移植少了数据库的移植,可以继续使用原有的数据库,在移植过程中数据库的移植是移植成功与否的关键因素之一,少了这个过程相信大家移植更为方便。

    【小结】以上我们介绍了两种结构的移植工作,经过上述修改项后,迁移数据的工作就已经成功,td服务器可以访问迁移后的数据库。通过移植工作,同时可以解决TD项目的双机相互备份的问题,保障数据的安全性。

    再次备份TD项目,只需要将原来TD后台数据库表中的数据导入另一台计算机中的数据库中,就可以实现。

     

    来源:51testing

     

     

  • QTP关键技术

    2007-09-26 12:17:02

    (一)

    1)测试对象模型(Test Object Model)
            测试对象模型是QTP用来描述应用程序中对象的一组对象类。每个测试对象类拥有一系列用于唯一确定对象属性和一组QTP能够录制的方法
     
    2)测试对象(Test Object)
            用于描述应用程序实际对象的对象,QTP存储这些信息用来在运行时识别和检查对象
     
    3)运行时对象(Run-Time Object)
            是应用程序中的实际对象,对象的方法将在运行中被执行
     
    4)QTP的录制过程
            A.确定用于描述当前操作对象的测试对象类,并创建测试对象
            B.读取当前操作对象属性的当前值,并存储一组属性和属性值到测试对象中
            C.为测试对象创建一个独特的有别于其他对象的名称,通常使用一个突出属性的值
            D.记录在对象上执行的操作
     
    5)QTP的回放过程
            A.根据对象的名称到对象存储库(Object Repository)中查找相应的对象
            B.读取对象的描述,即对象的属性和属性值
            C.基于对象的描述,QTP在应用程序中查找相应的对象
            D.执行相关的操作
     
    二 对Check Point的较为深入理解

    1. 定义:
            将特定属性的当前数据与期望数据进行比较的检查点,用于判定被测试程序功能是否正确
            Check Point可以分两类:QTP内置验证点和自定义验证点
     
    2. QTP内置验证点实现原理及优缺点
            A.录制时,根据用户设置的验证内容,记录数据作为基线数据
            B.回放时,QTP捕获对象运行时的数据,与脚本中的基线数据进行比较
            C.如果基线数据和运行数据相同,结果为PASS,反之为Failed.
            D.优点是 操作简单方便
            E.缺点是 QTP默认的检查的属性有时不符合自己的要求,如希望得到检查的属性没有在里面, 而默认的属性不需要检查等。
     
    3. QTP内置验证点结果的应用
            A.录制的验证点在没有进行调整前,仅仅是给出了检查结果是通过还是错误的
            B.实际的测试过程中,可以根据验证点的结果进行不同的操作
           If Window("Flight Reservation").WinEdit("Name:").Check(CheckPoint("Name:")) = True then
                  msgbox "oh, success!"
    Else
                  msgbox "oh, failure!"
    End If
     
    4. 自定义验证点的应用及优缺点
            A.使用条件语句对实际值和期望值进行对比,然后用Reporter对象报告结果
           '检查Ticket Number
    If CStr(dbTicketNumber) = CStr(DataTable("oTicketNumber", dtLocalSheet)) Then
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    Else
           Reporter.ReportEvent micPass, "打开订单- TicketNumber", "期望结果是:" & dbTicketNumber & ", 界面显示实际结果是:" & DataTable("oTicketNumber", dtLocalSheet)
    End If
            B.优点是 非常灵活,前者实现的所有检查都可以用此方法来实现;
            C.缺点是 代码量大,对测试人员的要求高。
     
    5. 对Check Point的深入理解

            A.个人认为在比较简单的和有Active Screen的情况下可以使用QTP内置的Check Point,在比较复杂的情况下可以通过编程和使用Reporter来完成.
            B.在使用check方法时,必须先在Keyword View或者Active Screen中新建CheckPoint。否则无法对该对象进行check,系统报错说无法在对象仓库中找到此对象。如果插入检查点,系统会自动把相关的对象添加到对象库中。
            我认为检查点并不是一个实实在在的对象。因为你可以对同一个对象设置不同的检查点,可以把它的某个属性既设定成True,也可以设定为False。而对象库中的对象的属性值是必须依赖于对象的实际属性值的。如果随意更改有可能无法识别。还有就是可以针对同一个对象设定多个检查点。在测试窗口中可以看到这两个检查点的名称是区分开来的。所以我认为检查点并不是实际存在的对象,而是一些类似映射的东西。
            尽管检查点并不是对象库中的实在的对象,但是它必须对应到对象库中的某个实实在在的对象,好像它的一个映像一样,而且在实际的操作过程中,QTP还是把它作为一个对象来处理的。
            因为我们无法像其他对象一样把“检查点对象”添加到对象库中,而QTP又认为它是个对象,所以我们无法在专家视图中直接添加检查点脚本。但是我们可以采用编成描述的方式来实现检查点的功能。
            CheckPoint 是一个依赖于Object Repository(对象库)中的某个对象的“虚拟对象”。其具体含义是:如果它所依赖的QTP 对象库中的对象没有了,那么此CheckPoint 也就不存在了;这个“虚拟对象”的属性是从它所依赖的对象的属性中“抽取”出来的,它具有它所依赖的对象的一个或几个属性,但不能增加它所依赖的对象没有的任何属性。
            CheckPoint 是一个“虚拟对象”的重要原因是:每个Object都能在Object Repository找到它的Name、Class Properties,而CheckPoint 在Object Repository中就根本不存在。选择脚本中的某个对象后,在Object Property 的对话框里面有个Respository按钮,点击它后,你会看到此对象在Object Respository 的Name、Class 和 Properties。
            选择一个CheckPoint后,在CheckPoint Properties 的对话框里没有 Respository 按钮,在Object Respository中也找不到此CheckPoint的Name、Class 和 Properties(因为它在对象库中根本就不存在!)。


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


    (二)

    一 对同步点的理解

      1)QTP的脚本语言是VBscrīpt,脚本在执行的时候,执行语句之间的时间间隔是固定的,也就是说脚本在执行完当前的语句之后,等待固定的时间间隔后开始执行下一条语句
     
      2)问题:假设后一条语句的输入是前一条语句的输出,如果前一条语句还没有执行完,这时候将要导致错误的发生!
     
      3)措施:加入同步点、加入Wait语句

      4)同步点Synchronization Point
      QTP脚本在执行过程中如果遇到同步点,则会暂停脚本的执行,直到对象的属性获取到了预先设定的值,才开始执行下一条脚本。
    如果在规定的时间内没有获取到预先设定的值,则会抛出错误信息。
     
    例如:
      Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000
      执行到上面这条语句时,QTP会暂停执行,直到显示”Insert Done…”,
      如果在规定的时间10,000ms后text的值没有等于”Insert Done…”,则会抛出错误信息
     
    5)如何获取Synchronization Point
           A.在Recording状态下,通过Insert è Synchronization Point实现
           B.非Recording状态下,在Expert View下,通过Insert è Step Generator è Category(Test Objects)è Object(The Object you’re Testing) è Operation(WaitProperty)è PropertyName、PropertyValue、TimeOut分别填写"text", "Insert Done...", 10000

    6)Wait
      总的来说就是死等,比如说wait 10,当运行到这条语句时,等待10秒钟后,才开始再读下面的语句。所以说写脚本的时候一定要估计好时间,否则的话会浪费运行的时间,或者出现等待时间不足的现象。

    二 并列Action间的参数传递 

      思路:将Action1的输出参数,传递给Action2作为输入参数。
     
      1)创建两个Action,关系是并列关系,不是嵌套的.
               

      2)右键Action1,选Action Properties,在Output Parameters中添加参数OutAction1,点OK
     
      3)右键Action2,选Action Properties,在Input Parameters中添加参数InAction2,点OK
      
      4)将Action1的输出OutAction1,传递给Action2的输入InAction2
     
      右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
      选中InAction2的Value,弹出Value Configuration Options窗口;
      在Parameter中共有四项可供选择,选择Test/Action parameter,
      在Output from previous call(s)中的Action选择Action1,Parameter中选择OutAction1;
      表示Action2中的参数InAction2,是由Action1中的参数OutAction1传递而来。

          

      以上就完成了两个并列Action间参数的传递,Action2只能调用Action1的输出参数,而不能调用Action的输入参数。
     
    三 嵌套Action间的参数传递
      参数传递思路:
      将Action1的输入参数InAction1传递给Action2的输入参数InAction2,
      将Action2的输出参数OutAction2传递给Action1的输出参数OutAction1。
      此文为Hollyzhao于2007年09月在 http://blog.csdn.net/softesting 发布,夜深了,有点累~
      1)创建两个Action,嵌套关系,在关键字视图,拖动Action2到Action1下面有缩进的地方
        
      2)右键Action1,选Action Properties,
      在Input Parameters中添加参数InAction1,
      在Output Parameters中添加参数OutAction1,点OK
     
      3)右键Action2,选Action Properties,
      在Input Parameters中添加参数InAction2,
      在Output Parameters中添加参数OutAction2,点OK
     
      4)在Action1和Action2间建立关联
      右键Action2,选Action Call Properties,弹出Action Call Properties窗口;
      此文为Hollyzhao于2007年09月在 http://blog.csdn.net/softesting 发布,夜深了,有点累~
      选中InAction2的Value,弹出Value Configuration Options窗口;
      在Parameter中共有四项可供选择,选择Test/Action parameter,
      在Parent action parameters的parameter中选择Action1
      同理,OutAction2的Store In值为OutAction1
                 
      以上的操作就是把输入值 通过Action1的输入参数,传递给Action2的输入参数进行使用,
      然后Action2运行后,将输出参数通过Action1的输出参数传递出去。
      这里只是对嵌套Action进行最基本的讲解,在实际使用当中还要灵活运用。

     

  • QTP自动化测试流程

    2007-09-26 12:11:53

     

    1)准备TestCase
            - 在进行自动化之前,将测试内容进行文档化,不建议直接录制脚本
            - 在录制脚本之前设计好脚本,便于录制过程的流畅
            - 由于测试用例设计和脚本开发可能不是同一个人完成,便于团队合作
            - 便于后期的维护
            - 文档化的方式:TD或者文档
     
    2)配置QTP
            QTP支持不同的开发环境,在正式录制之前,需要根据被测程序的开发环境,选择合适的Add-In,并进行加载。
     
    3)录制脚本
            启动QTP的录制功能,按照Test Case的操作步骤描述执行,QTP自动记录每一步操作,并自动生成VBscrīpt脚本。
     
    4)修改增强脚本
            刚刚录制好的脚本可能包含错误,或者没有达到预期的目的,这就需要在录制脚本的基础上,进行修改增强
            - 删除录制过程中多余的以及错误的操作,以最少的脚本完成任务
            - 如果前面操作的输出是后面操作的输入,则需要使用变量或者输出值来进行替换
            - 不是所有的操作都可以通过录制产生的,有些需要通过手工编码实现这些功能
            - 录制产生的脚本是线性的,可以加入条件、循环控制语句,实现更复杂的流程
            - 对脚本进行结构化
            - 加入注释,便于阅读和维护
     
    5)调试脚本
            - 回放通过的脚本,不一定是正确的,也可能会包含错误
            - 在测试脚本正式使用之前,要保证其本身的正确性
            - 避免测试脚本故障和被测程序故障搅在一起,不容易定位
     
    6)回放脚本
            - 对于回放的错误,不要急于马上提交Bug,首先要判断是脚本本身的错误还是程序的错误,确认后再提交。
     
    7)脚本维护
            - 随着工作的不断推进,脚本量会越来越多
            - 被测试程序的不断更新,也需要更新相应的测试脚本
            - 采用版本管理工具保存脚本,如CVS、VSS,可以随时获取历史版本
            - 采用统一的脚本架构
            - 采用统一的命名规范
            - 添加充分的注释,避免时间久了,自己都不能马上读懂脚本
  • SQL语句的整理

    2007-08-22 23:25:35

    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)

  • 软件测试名词解释

    2007-08-21 21:03:41

     软件缺陷----软件中含有符合下面5 条规则之一的问题称为软件缺陷

      ◆软件未达到产品说明书标明的功能。
      ◆软件出现产品说明书指明不会出现的错误。
      ◆软件功能超出产品说明书指明的范围。
      ◆软件未达到产品说明书未指出但应达到的目标。
      ◆软件测试人员或用户认为软件难以理解,不易使用,运行速度缓慢等问题。

      测试案例----测试用例的别名

      黑盒测试----指测试人员通过各种输入和观察软件的各种输出结果来发现软件的缺陷,而不关心程序具体如何实现的一种测试方法。

      静态测试----指测试不运行的部分,例如测试产品说明书,对此进行检查和审阅.

      静态白盒测试-----指在不执行的条件下有条理地仔细审查软件设计,体系结构和代码,从而找出软件缺陷的过程。有时称作结构分析

      动态测试----通过运行和使用软件进行测试。

      探索测试----通常用于没有产品说明书的测试,这需要把软件当作产品说明书来看待,分步骤逐项探索软件特性,记录软件执行情况,详细描述功能,综合利用静态和动态技术来进行测试。

      等价区间----指测试相同目标或者暴露相同软件缺陷的一组测试用例.

      测试设计----提炼测试方法,明确指出设计包含的特性和相关测试。如果要求完成测试还明确指出测试案例和测试程序,指定特性通过/失败的规则。

      软件QA----QA= Quality Assessment 质量评价。防止软件缺陷称为软件QA。

      TQM 或者TQC 原理----TQM(全面质量管理)或者TQC(全面质量控制)。其原理是,用集中的质量评判团队来负责质量是不实际的,因为工作的人不负责质量,所以他们不会设法实现质量评判目的。要想制造高质量产品,需要创立从管理开始自上而下的质量意识,使全体成员共同承担质量责任。

      SQC----软件质量控制(SQC)是测试团队很常用的名称。该名称来源于制造行业,其中QC 检验员对生产线上的产品进行采样、检测,如果测试失败,他有权停掉生产线或者整个工厂。测试团队很少有这种授权。

      Murphy 法则---永远不会有足够的时间把事情做好,但是总有时间返工。软件开发小组需要遵循一个过程,花费一些时间,变得有条理,一开始就设法作对。

  • 软件测试工程师的角色定位

    2007-08-21 21:00:34

    项目经理、系统分析师、程序员、测试工程师质量保证人员等。可见,软件测试工程师只是软件项目开发中的一个角色而已。

    戏剧舞台上的生、旦、丑是不同的角色,其表演方式具有明显的特征,这是由于角色决定的。同样,软件测试工程师的角色,在软件项目开发中也存在如何定位和表现自身的行为和责任的问题

    此处讨论测试工程师的角色并非毫无意义。须知,角色不明,责任不清,行为就失去了参照目标,结果就可能很不理想了。轻则降低了工作质量和效率,重则被视为工作能力低下,可能要退出软将项目组的舞台了。

    软件测试工程师承担的任务

    角色决定工作内容和承担的任务。测试工程师的角色应该承担什么任务呢?这没有统一的答案。因为,这与软件公司的规模,软件项目管理制度,公司领导和项目经理的管理风格,以及具体软件项目自身的特点有很大关系。而且,测试工程师也有普通和高级之分。

    笼统的答案列举如下:

    • 设置软件测试环境,安装必要的软件工具
    • 运行软件,发现和报告软件缺陷或错误。尤其需要快速定位软件中的严重的错误。
    • 对软件整体质量提出评估
    • 确认软件达到某种具体标准
    • 以最低的成本,最短的时间,完成高质量的测试任务
    • ......


    在这其中,最重要的是要明确,程序员的责任和目标。在执行任何具体测试任务前,都要在项目组内对于责任和目标达成共识,以免带来后续工作的相互推诿。


    提高测试质量的要诀


    另外一个值得注意的方面就是工作效率和质量,或许高级测试工程师与普通测试工程师的主要区别在于高级测试工程师可以更快地发现更多软件中的严重错误。对此,有什么可以借鉴的诀窍吗?请尝试以下方法,保证不会是您失望。

    • 首先测试程序的核心功能,然后测试辅助功能。
    • 首先测试功能,然后测试性能
    • 首先测试常见情况,然后测试异常情况。
    • 首先测试经过变更的部分,然后测试没有变更的部分。
    • 首先测试影响大的问题,然后测试影响小的问题。
    • 首先测试必须测试的部分,然后测试可选或没有要求测试的部分

    软件测试工程师是项目团队中的服务员

    需要强调的一点是,无论你是多么高级的测试工程师,都要明白无论测试需要的工具多么复杂,测试步骤多么冗长,测试工程师在软件项目开发中始终都是扮演服务员的角色,这是由测试工作的特点决定的。任何服务都有被服务对象—客户,软件测试工程师的服务对象有哪些呢?

    • 最重要的客户是软件的用户。测试工程师需要站在客户的使用需求角度测试软件,报告问题。
    • 项目经理也是客户。测试工程师需要报告测试工作进度和发现的问题,尤其是严重的问题。

    • 程序员是最经常打交道的客户。为了便于程序员重复报告的错误,尽量提供良好的软件问题报告,以便程序员可以更快的修复软件错误。

    技术文档工程师、市场开发人员和技术支持工程师也都是测试工程师的服务对象。
    软件测试工程师避免犯的几个错误

    前文已经指出测试工程师应该明确角色,明确任务和责任。知道哪些是自己份内的事,哪些是不属于自己的事。一定要尽最大努力完成份内的事,不要做不属于自己的事情,以免弄巧成拙。

    为了更好的扮演软件测试工程师的角色,尽量避免犯下面的错误:

    • 承诺完成测试的软件没有质量问题
    软件测试只是保证质量的一种方法,软件测试工程师的工作不会直接提高软件质量,因为绝大多数软件错误都需要程序员修复。软件测试只能证明软件存在错误,不能保证软件没有错误,不可能找出全部软件错误。个人的能力和对质量的影响范围很小,软件质量的提高要靠软件项目团队全体成员的共同努力。  

    • 承担软件的发布权利
    不要因为软件中存在还没有修复的错误,而试图提出更改软件发布的计划。也不要认为已经完成了测试计划,自己决定可以发布软件。因为,改变软件发布计划可能要失去进入市场的良机和很多客户,对此造成的经济和公司市场的损失将不是测试工程师能够承担的。另外,软件发布后,如果用户发现了新的软件错误,公司领导或项目经理可能将过错加在软件测试人员的头上,因为他们同意发布软件。通常软件发布的权利由产品经理、项目经理、测试经理、市场经理共同集体讨论决定。  

    • 扮演过程改进成员的角色
    软件测试工程师必须报告错误,有时也要分析错误的类型、特征和产生错误的原因。但是,不要主动提出改进软件过程的具体改进措施,更不要直接干涉程序员的工作方式,以免出力不讨好,影响今后的愉快合作。软件过程改进的方法是软件质量控制部门的事情,这是他们的本职工作。

  • 软件测试工程师具体是干什么的

    2007-08-21 20:58:16

         软件测试就是使用人工或自动手段,来运行或测试某个系统过程。其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。开发工作的根本是尽量实现软件用户的需求,测试工作的根本是检验软件系统是否满足软件用户的需求。
         软件测试工程师简单的说是软件开发过程中的质量检测者和保障者,负责软件质量的把关工作。软件测试工程师具体工作有:
         1 、使用各种测试技术方法来测试和发现软件中存在的软件缺陷。测试技术主要分为黑盒测试和白盒测试两大类。其中黑盒测试技术主要有等价类划分法、边界值法、因果图法、状态图法、测试大纲法以及各类典型的软件故障模型等;白盒测试的主要技术有语句覆盖、分支覆盖、判定覆盖、基本路径覆盖等;
         2 、测试工作需要贯穿整个软件开发生命周期。完整的软件测试工作包括单元测试、集成测试、确认测试和系统测试工作。单元测试工作主要在编码阶段完成,由开发人员和软件测试工程师共同完成,其主要依据是详细测试。集成测试的主要工作测试软件模块之间的接口是否正确实现,基本依据是软件体系结构设计。确认测试和系统测试是在软件开发完成后,验证软件的功能与需求的一致性、验证软件在相应的硬件条件下的系统功能是否满足用户需求,其主要依据是用户需求。
         3 、测试人员将发现的缺陷编写成正式的缺陷报告,提交给开发人员进行缺陷的确认和修复。缺陷报告编写最主要的要求是保证缺陷的重现。要求测试人员具有很好的文字表达能力和语言组织能力。
         4 、测试人员需要分析软件质量。在测试完成后,测试人员需要根据测试结果来分析软件质量,包括缺陷率、缺陷分布、缺陷修复趋势等。给出软件各种质量特性包括有功能性、可靠性、易用性、安全性、时间与资源特性等的具体度量。最后给出一个软件是否可以发布或提交用户使用的结论。
         5 、测试过程中,为了更好地组织与实施测试工作,测试负责人需要制定测试计划,包括有测试资源、测试进度、测试策略、测试方法、测试工具、测试风险等。
         6 、测试人员为了更好更有效地进行测试,保证测试工作质量,需要在执行测试工作之前首先需要设计测试用例,形成测试用例报告。设计测试用例是保证测试质量的核心工作,很多测试技术都可以用来指导设计用例。为了提高测试用例的设计效率,BTEST培训课程专门开设了高效设计测试用例一门课来讲授各种设计用例的技术与方法。
         7 、为了提高工作效率或提高测试水平,测试工作需要引进自动化测试工具,测试人员需要学会使用自动化测试工具,编写测试脚本,进行性能测试等。
         8 、测试负责人在测试工作中,还需要根据实际情况不断改进测试过程,提高测试水平,进行测试队伍的建设等。
  • 测试用例编写规范

    2007-08-20 23:08:24



    1           
    目的:统一测试用例编写的规范,以保证使用最有效的测试用例,保证测试质量。

    2           
    范围:适用于公司对产品的业务流程、功能测试测试用例的编写。

    3           
    术语解释
    3.1         
    测试分析:对重要业务、重要流程进行测试前的分析。
    3.2         
    业务流程测试用例:关于产品业务、重要流程的测试用例。

    4           
    业务流程测试用例编写原则
    4.1         
    系统性
    4.1.1      
    对于系统业务流程要能够完整说明整个系统的业务需求、系统由几个子系统组成以及它们之间的关系;
    4.1.2      
    对于模块业务流程要能够说明清楚子系统内部功能、重要功能点以及它们之间的关系;
    4.2         
    连贯性
    4.2.1      
    对于系统业务流程来说,各个子系统之间是如何连接在一起,如果需要接口,各个子系统之间是否有正确的接口;如果是依靠页面链接,页面链接是否正确;
    4.2.2      
    对于模块业务流程来说,同级模块以及上下级模块是如何构成一个子系统,其内部功能接口是否连贯;

    5           
    测试用例设计的方法
    5.1         
    等价类划分法
    5.1.1      
    确定等价类的原则
    5.1.1.1     
    如果输入条件决定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。
    5.1.1.2     
    如果输入条件规定了输入值的集合,或者规定了必须如何的条件,此时可确立一个有效等价类和一个无效等价类;
    5.1.1.3     
    如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类;
    5.1.1.4     
    如果规定了输入数据的一组值,而且程序对每个输入值分别进行处理,此时可为每一个输入值确立一个有效等价类,此外,针对这组值确立一个无效等价类,它是所有不允许输入值的集合;
    5.1.1.5     
    如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同的角度违反规则)。
    5.1.1.6     
    如果确知,已划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类。
    5.1.2      
    测试用例的选择原则
    5.1.2.1     
    为每一个等价类规定一个唯一的编号;
    5.1.2.2     
    设计一个新的测试用例,使其尽可能多的覆盖尚未被覆盖的有效等价类,重复这一步,直至所有的有效等价类都被覆盖过;
    5.1.2.3     
    设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直至所有的无效等价类都被覆盖为止。
    5.2         
    边界值分析法
    5.2.1      
    测试用例的选择原则
    5.2.1.1     
    如果输入了条件规定了值的范围,则应取刚达到这个范围的边界值,以及刚刚超越这个边界范围的值作为测试输入数据;
    5.2.1.2     
    如果输入条件规定了值的个数,则用最大个数、最小个数、比最大多1、比最小小1的数作为测试输入数据;
    5.2.1.3     
    根据规格说明的每个输出条件,使用前面的原则;
    5.2.1.4     
    如果程序的规格说明给出的输入输出域是有序集合,则应选取集合的每一个元素和最后一个元素作为测试用列;
    5.2.1.5     
    如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例;
    5.2.1.6     
    分析规格说明,找出其他可能的边界条件。

    6           
    测试用例设计的原则
    6.1         
    全面性
    6.1.1      
    应尽可能覆盖程序的各种路径
    6.1.2      
    应考虑存在跨年、跨月的数据
    6.1.3      
    大量数据并发测试的准备
    6.2         
    正确性
    6.2.1      
    输入界面后的数据应与测试文档所记录的数据一致
    6.2.2      
    预期结果应与测试数据发生的业务吻合
    6.3         
    符合正常业务惯例
    6.3.1      
    测试数据应符合用户实际工作业务流程
    6.3.2      
    兼顾各种业务变化的可能
    6.4         
    仿真性
    人名、地名、电话号码等应具有模拟功能,符合一般的命名惯例;不允许出现与知名人士、小说中人物名等雷同情况。
    6.5         
    可操作性
    测试用例中应写清测试的操作步骤,不同的操作步骤相对应的操作结果。

    7           
    测试用例编写格式细则
    7.1         
    测试用例内容
    7.1.1      
    具体实施可以采用EXCEL和图形相结合,可用EXCEL编写测试用例的同时插入图形来加以说明。测试用例设计的内容可由:模块名、功能说明或图形说明、测试用例输入、应输出结果、实际输出结果、结论、BUG编号、BUG级别8部分组成。
    7.1.2      
    在测试用例设计模版中有业务流程测试用例设计模版(包含整体业务流程)和功能测试用例设计模版两个模板可按需要选择。
    7.2         
    测试用例表格格式
    7.2.1      
    表格内容的字体为宋体;
    7.2.2      
    表格内容的字型为12号;

    8           
    测试用例优先级
    测试用例优先级                             
                A                                          
    测试计划中重要的模块功能和业务流程
                B                                          
    测试计划中比较重要的模块功能和业务流程
                C                                          
    测试计划中次重要的模块功能和业务流程
                D                                          
    测试计划中不重要的模块功能和业务流程
                E                                          
    系统小单元、系统容错功能
    对于AB 级应重点考虑

    9           BUG
    级别
    参考软件测试停止标准中的错误级别.

  • 软件测试的计划与管理

    2007-08-20 22:58:16

    1. 引言

        在工程化的软件研制过程中,软件测试活动贯穿整个软件项目的生存周期;独立的软件测试组织始终与设计/实现/维护组织并行工作;软件测试涉及的人/物/时间甚至可能超过软件项目总消耗的一半以上。因此,软件测试本身就是软件工程中值得专门计划和管理的一项子工程。

    本文将基于一个大型实时软件系统中软件测试的实践,从计划和管理的角度来分析和介绍软件测试的工作框架及其内容;然后讨论在较高层次上计划和管理软件测试时可以进一步分析和研究的内容。

     

    2. 软件测试的工作框架

    软件测试的基本组织原则为:

    a. 成立独立的测试组织,以实现第三方测试(IV&V)的要求。

       具体实现时可以采用:专职为主、兼职为辅和交叉测试的策略。

    b. 软件测试工程化、规范化。

       包括:统一制订软件测试的方法与规范;重视软件测试文档的编制;明确定义软件测试环境,同时有重点地设计和开发软件测试工具。

    c. 实现有效的测试过程管理。

       包括:测试资源(数据与程序)的配置管理;测试/回归测试的自动/半自动化执行;测试报告的自动/半自动化生成。

    d. 重视测试结果与测试结果的利用。

       包括:加强结果收集统计和分析;指导软件进展和质量评估。

       根据基本组织原则,软件测试的工作框架包括三个部分:软件测试在软件系统研制过程中的定义(外部联系);软件测试的组织策略(内部结构);软件测试的过程控制(内部联系)。前两部分的定义相对稳定,是软件测试计划与管理的重点,以下分析和介绍其中的内容。

     

    2.1 软件测试在软件系统研制过程中的定义

    在软件测试工作之初,组织者应与其他有关人员协调,以正确定位以下内容:

      a. 软件测试在软件研制中的作用;

      b. 软件测试活动与其它软件研制活动的关系;

      c. 软件测试的对象;

      d. 软件测试组织与软件开发组织界面;

      e. 软件更动控制流程。

     

    2.2 软件测试在软件研制中的作用

    软件测试的意义在于:

      a. 发现软件错误;

      b. 有效定义和实现软件成分由低层到高层的组装过程;

      c. 验证软件是否满足任务书和系统定义文档所规定的技术要求;

      d. 为软件质量模型的建立提供依据。

    即软件测试包括“找错”、“组装”、“确认”和“评估”四个层次的作用。

     

    2.2.1 软件测试活动与其它软件研制活动的关系

    软件测试是软件质量管理活动之一;软件测试组织通过软件配置管理组织获得其测试对象:软件产品(文档/代码/文件)或其中间形式;软件测试结果通过软件配置管理组织返回给软件开发组织;测试结果是软件质量控制的数据来源之一。

     

    2.2.2 软件测试的对象

    在大型软件系统中,软件成分被划分为多个层次。所有参加测试的人员都应了解其面对的软件系统的构成,同时清楚自己实现哪些部分、哪些方面的测试。

    各类系统定义文档是软件测试的依据,它们定义了各层次软件成分的功能/性能/实现的要求。必要时,测试组织者应及时汇集、整理、完善软件系统的成分树/森林,明确各层次软件成分的具体内容。当然,这部分信息也可能由其它组织提供。

     

    2.2.3 软件测试组织与软件开发组织的界面

        软件测试组织与软件开发组织的界面指:软件开发组织完成编码、调试、集成后通过软件配置管理组织移交给软件测试组织的软件成分的层次,简称“软件测试界面”。

        对低于软件测试界面的软件成分进行的排错的过程一般被称为“软件调试”;而对高于软件测试界面的软件成分进行的找错的过程被称为“软件测试”,其修改的过程被称为“软件更动”。

        一旦软件成分被提交到配置管理库中,则对其的修改就必须遵循软件更动控制规范,将涉及不少人员,媒体转移较频繁,软件修改周期也较长。因此代码的测试不应过分依赖于测试组织,即:开发组织提交的软件成分应足够稳定。为了减少整个软件测试过程(发现问题–改动软件)的人力/物力/时间的消耗,测试组织与开发组织应达成共识:尽可能提高软件测试界面。定义较高软件测试界面的益处还在于:有利于开发组织更加主动关注其软件开发过程的质量控制;同时,还有利于测试组织集中时间和资源来执行软件高层测试(功能/性能的确认)。

     

    2.2.4 软件更动控制规范

        软件测试的对象是已置于软件配置管理控制之下的软件成分(程序、数据、文档及各类受控的文件)。软件更动控制是软件配置管理的主要任务之一。

        当软件开发/测试/维护人员发现软件问题(与软件配置管理项相关的软件错误、软件不一致或未知原因的软件异常状态)时,须填写软件问题报告,按照软件更动控制流程/算法,进入软件更动循环,产生相应的软件更动申请/报告。因此软件更动控制规范应包含:软件更动控制流程/算法、软件问题报告和软件更动申请/报告的格式。

        由于软件更动控制与软件回归测试的内在联系紧密,因此测试组织应参与制订软件更动控制规范,以使该规范能在适用于系统的前提下更节省软件研制的总消耗。

     

    2.3 软件测试的组织策略

    在软件测试的管理中,以下内容的定义反映测试工作的组织策略:

      a. 软件测试遵循的标准;

      b. 软件测试的工作范畴;

      c. 软件测试环境;

      d. 软件测试产品;

      e. 适用于软件测试活动的软件资源标识规则;

      f. 软件测试的进度安排。

     

    2.3.1 软件测试遵循的标准

        组织者在指定范围内选择软件测试遵循的标准,并结合本软件系统的具体要求,使之贯彻到整个软件测试的计划、实现和管理过程之中。根据标准,需要被明确的内容包括:测试阶段和测试文档类型。

        可以从三个角度来划分测试阶段:面向测试操作类型的阶段划分、面向测试操作对象的阶段划分、面向测试实施者的阶段划分。测试操作类型包括:调试、集成、确认、验证、组装、验收、操作等。测试操作对象可以是:单元、部件、配置项、子系统、系统等。测试实施者可以是:开发者、测试者、使用者、验收者等。各类标准从不同角度定义测试评审阶段,而测试组织者可以在符合所选标准的同时,结合多个划分因素规定本系统的测试阶段。

        各标准规定的测试文档类型也不尽相同。如国标《软件产品开发文件编制指南》规定了两类测试文档:测试计划、测试分析报告;国标《计算机软件测试文件编制规范》定义了八类测试文档:测试计划、测试设计说明、测试用例说明、测试规程说明、测试项传递报告、测试日志、测试事件报告、测试总结报告;《XXXX软件工程化技术文件》定义了三类测试文档:测试计划、测试说明、测试报告。我们认为最后这种规定较易操作:因为,太少的测试文档类型不利于有步骤有层次地定义测试内容,也不利于测试用例和测试例程的良好表达;太多的测试文档类型易使测试组织陷入到繁杂的文档规范和编制中去;而第三种定义较为适中。其中:测试计划在系统分析/设计阶段提交,着重定义测试的资源、范围、内容、安排、通过准则等;测试说明在测试计划明确后开始编制,针对软件需求和设计要求具体定义测试用例和测试规程;测试报告分析和总结测试结果,测试日志是其必要附件。

     

    2.3.2 软件测试的工作范畴

    软件测试工作包括两个层次:

      a. 测试工作的组织与管理,包括:制定测试方法与规范、控制测试进度、管理测试资源。

      b. 测试工作的实施,包括:编制符合标准的测试文档、研制测试环境、与开发组织协作实现各阶段的测试活动。

    软件测试工作可以分为四个方面:

      a. 测试管理。测试小组是质量保证组织的一个成分,因此测试管理工作应被置于软件质量管理工作范围内。

      b. 测试计划。独立的测试组织负责定义软件测试的方法与规范。开发组织负责编制单元测试的计划和说明;测试组织主要负责编制其它各测试阶段的测试计划和说明。

      c. 测试实施。测试实施组织的作用是:按测试计划与测试说明的定义对测试对象进行相应的测试;填写测试报告中相应的表格。

      d. 测试评审。依据软件测试评审准则在各测试阶段评审时提交类型完整的测试文档。

     

    2.3.3 软件测试环境

    软件测试环境包括设计环境、实施环境和管理环境。

    软件测试设计环境指:编制测试计划/说明/报告及与测试有关的文件所基于的软/硬件设备和支持。

    软件测试实施环境指:对软件系统进行各级测试所基于的软/硬件设备和支持。测试实施环境包括被测软件的运行平台和用于各级测试的工具。

    软件测试管理环境指:管理测试资源所基于的软/硬件设备和支持。测试资源指测试活动所利用或产生的有形物质(如软件、硬件、文档)或无形财富(如人力、时间、测试操作等)。广义的测试管理环境包含测试设计环境、测试实施环境,和专门的测试管理工具。

    对软件测试环境的定义包括两个方面:折衷需求和实际条件来选择已有的测试工具;有重点地自行开发测试辅助工具。软件测试必须依托工具,以便:测试过程的自动/半自动执行和测试结果的自动/半自动评审和报告。目前市场上测试工具分为三类:代码分析工具、自动/半自动测试过程管理工具和测试资源管理工具。

     

    2.3.4 软件测试产品

        软件测试工作所产生的文档、程序、服务、以及相关的文件的总和称之为软件测试产品,它是软件产品的一部分。

        除了所选标准规定在各评审阶段需提交的测试文档外,还可以根据实际情况编制其它类型软件测试文档。

        测试组织需提交的程序是其开发测试工具及其测试环境。

        测试组织提供的服务包括:培训与技术支持,包括为开发组织使用测试工具与环境提供帮助、为开发组织提供测试计划/说明/报告的编写指导、协助开发组织实施相应测试;协调与建议,包括在充分理解软件系统工作原理和流程的基础上,为软件系统质量保证工作提供尽可能多的信息。

    2.3.5 适用于软件测试活动的软件资源标识规则

        测试者除了要统一给出各类测试文档的标识(或定义规则),还要定义其它测试文件,如文档审查项列表、代码审查项列表、软件审查报告、软件问题报告、软件更动申请、软件更动报告、软件测试日志等的标识。

        软件测试组织应获得或自行整理其所面对的软件系统中各级软件成分对应的文档/文件/代码的标识。另外,测试组织自行开发的测试辅助工具也将置入配置管理库,因此对其的标识定义应符合整个软件系统的标识定义规则。

     

    2.3.6 软件测试的进度安排

        软件测试工作是整个软件研制工作的一部分,因此测试进度的初步安排应在软件开发计划中定义。在各阶段测试计划中将对测试进度的安排给出更具体的定义。

        软件测试实施的开始时间将受限于软件开发的进度;每个测试阶段的进度控制将受限于测试资源(人/物/时间)。

        软件测试的组织者可以在每个月末向软件质量管理组织提交:本月的<测试工作的活动汇总>、下一月的<测试工作的初步安排>和当前状态的测试文档,以利于软件质量管理组织评估软件系统的质量、控制软件系统的测试进度。

     

    3. 结论和讨论

     

    3.1 软件测试的重点

    软件测试的重点是:

      a. 测试用例和测试例程的良好设计。测试用例及测试例程的设计是整个软件测试工作的核心。测试用例反映对被测对象的质量要求,决定对测试对象的质量评估。

      b. 测试工作的管理。尤其是对包含多个子系统的大型软件系统,其测试工作涉及大量人力和物力,有效的测试工作管理是保证有效测试工作的必要前提。

      c. 测试环境的建立。软件测试的工作量很大,重复/繁杂的劳动很多,在有限的测试条件下,建立测试环境、提供测试辅助工具是减少软件研制费用的重要措施。

     

    3.2 软件测试的难点

    软件测试的难点在于:

      a. 测试用例及测试例程是其设计者对被测对象实现原理和外部需求的理解,能否正确反映对被测对象的质量要求,很大程度上取决于其设计者的分析、理解和设计能力。这是一种缺乏指导性方法的、不易制订标准或规范的、需要“技巧”的设计活动。

      b. 目前缺乏测试管理方面的资料,几乎没有可供参考的、已实现的、完整的测试管理与测试实施模式。

      c. 软件测试的有效实施需要开发组织与测试组织充分配合。虽然测试活动看似是对开发人员劳动成果的不断“挑剔”,但测试工作的出发点是:确保开发人员的劳动成果成为可被接收的、更高品质的软件产品。因此,测试人员应向开发人员谦虚求教,在测试工作中真正发挥作用,为保证软件产品的高质量起尽可能大的作用。测试的组织者应在促进上级组织协调各组织工作方面发挥作用。

      d. 有效的测试工作需要投入足够的人力和物力,需要对工作的难度和消耗有充分的估计。测试的组织者也应在促进上级组织对资源的统一调度方面发挥作用。

     

    3.3 软件测试的进一步涵义

    进一步分析和研究以下内容,会更有利于软件测试的组织者在较高层次上计划和管理软件测试工作。

     

    3.3.1 软件测试的本质

        软件测试的本质是对比和模拟(仿真)。检验软件是否有错或是否满足要求的两个前提是:存在预期的参考;存在软件的运行环境。

        理想的软件研制过程是:每一阶段的软件产品与前一阶段的软件产品在逻辑上等价。其蕴涵了一个假设:尽管每个阶段的描述方式不同,但其描述的内容都是精确的、完全的和一致的。这个假设在实际软件工程中是不容易满足的,因此不能期望理想的软件研制过程。

        更广义的软件测试指:软件研制中某两个阶段工作结果的对比。

     

    3.3.2 软件的静态分析技术

        相对软件动态测试技术(亦称计算机测试技术),审查会(Inspection)、人工运行(或叫走查,Walkthrough)和静态检验(Desk checking )等软件的静态分析技术是在软件研制的较早阶段对非形式化软件产品的人工测试方式,如对文档-文档的静态分析(需求说明与结构设计的对比)或对文档-代码的静态分析(详细设计与源代码的对比)。

        在软件静态分析技术中,软件(文档/代码)的“运行环境”是在人头脑中模拟生成的。

        强调软件静态分析技术的原因在于:越早期的软件描述越不易形式化,其“隐含”的语义越多,其等价转换到下一阶段描述的难度越大。

        静态分析技术主要用来发现本阶段产品的缺陷,但当发现前面阶段软件产品的问题时,就要填写软件问题报告,遵循软件更动控制规范。

    3.3.3 软件测试的质量

    通过对比,应用软件测试技术可以发现以下三类软件问题:

      a. “错误”,即:前一阶段导出语义为A,本阶段导出语义为B,而A1B。

      b.“缺少”,即:前一阶段导出语义为A,本阶段无此导出语义。

      c.“多余”,即:本阶段导出语义为B,前一阶段无此导出语义。

    发现第一类软件问题的过程即谓“找错”,发现后两类软件问题的过程即谓“确认”。设计不周密的测试用例可能并不能区分这三类软件问题。

    软件测试本身的质量在于:其提供的关于软件产品质量的信息含量。发现软件问题并能区分其类型的软件测试被称为是优质的。

     

    3.3.4 软件测试的可信度

        软件测试的结果是衡量软件产品质量的依据。但软件测试的依据、设计和操作的可靠性又由什么来保证呢?因而软件测试结果本身就带有可信度。相信软件测试结果的前提是:认可测试设计者/实现者/实施者的能力和责任感,同时认可其所依赖测试工具的可靠性。

        在ISO 9001标准中规定:任何测试工具所参考的标准都不应低于使用它的软件项目的标准。对于所选购的测试工具,可以获得生产商提供的质量认证;对于自行开发的测试辅助工具,测试组织可以遵循标准,提供研制测试辅助工具的全部开发/测试文档,以提高其提供的测试结果的可信度。

     

  • 测试设计中需要考虑的22种测试类型

    2007-08-20 22:49:25

        黑盒测试:不基于内部设计和代码的任何知识,而是基于需求和功能性。

      白盒测试:基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。

      单元测试:最微小规模的测试;以测试某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。这个工作不容易作好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。

      累积综合测试:当一个新功能增加后,对应用系统所做的连续测试。它要求应用系统的不同形态的功能能够足够独立以可以在全部系统完成前能分别工作,或当需要时那些测试驱动器已被开发出来; 这种测试可由程序员或测试员来做。

      集成测试:一个应用系统的各个部件的联合测试,以决定他们能否在一起共同工作。部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。这种类型的测试尤其与客户服务器和分布式系统有关。

      功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。

      系统测试:基于系统整体需求说明书的黑盒类测试;应覆盖系统所有联合的部件。

      端到端测试:类似于系统测试;测试级的“宏大”的端点;涉及整个应用系统环境在一个现实世界使用时的模拟情形的所有测试。例如与数据库对话,用网络通讯,或与外部硬件、应用系统或适当的系统对话。

      健全测试:典型地是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够“健全”,目前不具备进一步测试的条件。

      衰竭测试:软件或环境的修复或更正后的“再测试”。可能很难确定需要多少遍再次测试。尤其在接近开发周期结束时。自动测试工具对这类测试尤其有用。

      接受测试:基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。

      负载测试:测试一个应用在重负荷下的表现,例如测试一个 Web 站点在大量的负荷下,何时系统的响应会退化或失败。

      强迫测试:在交替进行负荷和性能测试时常用的术语。也用于描述象在异乎寻常的重载下的系统功能测试之类的测试,如某个动作或输入大量的重复,大量数据的输入,对一个数据库系统大量的复杂查询等。

      性能测试:在交替进行负荷和强迫测试时常用的术语。理想的“性能测试”(和其他类型的测试)应在需求文档或质量保证、测试计划中定义。

      可用性测试:对“用户友好性”的测试。显然这是主观的,且将取决于目标最终用户或客户。用户面谈、调查、用户对话的录象和其他一些技术都可使用。程序员和测试员通常都不宜作可用性测试员。

      安装/卸载测试:对软件的全部、部分或升级安装/卸载处理过程的测试。

      恢复测试:测试一个系统从如下灾难中能否很好地恢复,如遇到系统崩溃、硬件损坏或其他灾难性问题。

      安全测试:测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样。这可能需要复杂的测试技术。

      兼容测试:测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。

      比较测试:与竞争伙伴的产品的比较测试,如软件的弱点、优点或实力。

      Alpha 测试:在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

      Beta 测试:当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。

  • 测试跟踪工具Bugzilla介绍

    2007-08-20 22:41:53

    Buzilla作为一个产品缺陷的记录及跟踪工具,它能够为你建立一个完善的Bug跟踪体系,包括报告Bug、查询Bug记录并产生报表、处理解决、管理员系统初始化和设置四部分。并具有如下特点:

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

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

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

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

     

      Bugzilla操作说明

    1、 用户登录及设置

    1.1用户登录

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

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

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

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

    1.2、修改密码及设置

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

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

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

    2、Bug的处理过程

    2.1、报告Bug

    2.1.1测试人员报告Bug

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

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

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

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

      1) 发现问题的步骤

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

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

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

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

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

      6.帮助: Bug writing guidelines

    2.1.2 开发人员报告Bug.

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

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

    2.2、Bug的不同处理情况

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

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

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

      3 . 填表注意:

      FIXED 描述的问题已经修改

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

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

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

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

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

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

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

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

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

      * Accept bug (change status to ASSIGNED)

      * Reassign bug to

      * Reassign bug to owner and QA contact of selected component

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

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

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

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

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

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

       1. Leave as RESOLVED FIXED

       2. Reopen bug

       3. Mark bug as VERIFIED

       4. Mark bug as CLOSED

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

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

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

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

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

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

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

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

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

    2.3、查询Bug

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

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

      3.查询Bug活动的历史

      4.产生报表。

      5.帮助:点击Clue.

     

    3、关于权限的说明

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

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

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

    4、 BUG处理流程

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

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

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

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

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

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

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

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

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

  • SQA测试过程

    2007-08-20 22:28:11

    测试生命周期

    测试计划→ 测试设计→ 测试开发→ 测试执行→ 测试评估
    测试计划就是定义一个测试项目的过程,以便能够正确的度量和控制测试。

    第一部分:测试计划

    测试计划的问题:


    1、测试计划经常是等到开发周期后期才开始实行,使得没有时间有效的执行计划;

    2、测试计划的组织者可能缺乏Client/Server测试经验;

    3、测试的量度和复杂性可能太大,没有自动化工具,很难计划和控制。

    测试策略:

    测试策略描述测试工程的总体方法和目标。描述目前在进行哪一阶段的测试(单元测试、集成测试、系统测试)以及每个阶段内在进行的测试种类(功能测试、性能测试、压力测试等)。

    测试策略包括

    1、要使用的测试技术和工具;

    2、测试完成标准;

    3、影响资源分配的特殊考虑例如测试与外部接口或者模拟物理损坏、安全性威胁。

    测试计划最关键的一步就是将软件分解成单元,写成测试需求。
    测试需求有很多分类方法,最普通的一种就是按照商业功能分类。把软件分解成单元元件有几个好处:

    1、测试需求是测试设计和开发测试用例的基础,分成单元可以更好地进行设计;

    2、详细的测试需求是用来衡量测试覆盖率的重要指标;

    3、测试需求包括各种测试实际和开发以及所需资源。

    怎样估计测试工作量:

    1、效率假设:即测试队伍的工作效率。对于功能测试,这主要依赖于应用的复杂度,窗口的个数,每个窗口中的动作数目。对容量测试,主要依赖于建立测试所需数据的工作量大小。

    2、测试假设:为了验证一个测试需求所需测试动作数目。

    3、应用的维数:应用的复杂度指标。例如要加入一个记录,测试需求的维数就是这个记录中域的数目。

    4、所处测试周期的阶段:有些阶段主要工作都在设计,有些阶段主要是测试执行。

    测试资源:

    1、人力资源

    测试经理

    为测试项目提供总体方向。开发测试计划、征集并监督测试人员、申请系统资源、监视并汇报工作进程、测试评估、测试需求的分解。
    测试工程师---- 设计和开发

    设计:对被测软件的详细了解、分解测试需求的技能、选择在C/S环境下用来验证测试需求的技术。
    开发:熟悉SQA、VB、和脚本语言。
    测试工程师---- 执行
    负责测试执行和记录结果。需要能够安装系统,网络知识,初始化数据库和其他初始条件。重要的是诊断能力。
    测试系统管理者
    每个测试项目必须指定一个专人负责管理SQA Suite。包括在服务器上安装存储库,安装打印机连接,执行备份,以及其他维护工作。管理者必须高度熟悉SQA,网络工作经验。

    2、系统资源

    安装SQA Suite的硬件和软件环境
    数据库服务器
    该服务器必须专用于 测试工作,能够重置某些初始值,包括系统日期和时间等。

    写测试计划的步骤:

    1、确定工程

    收集下列信息:

    文档 已创建(是/否) 版本/日期

    需求详述

    功能详述

    项目计划

    设计详述

    原型

    用户手册

    定义新的工程,Adminà New Project。

    确定软件的结构,用Assetsà Software Structure选项定义软件结构。

    2、定义测试策略

    测试策略项 例子

    测试阶段 系统测试

    测试类型 功能测试

    测试技术75%用SQA Suite自动测试,25%手工测试

    完成标准95%测试用例通过并且最高级缺陷全部解决

    特殊考虑 测试必须在上午进行

    3、分解软件,写测试需求

    分析各种信息

    反复检查并理解各种信息,和用户交流,理解他们的要求。可以按照以下步骤执行:

    1、确定软件提供的主要商业任务

    2、对每个商业任务,确定完成该任务所要进行的交易。

    3、确定从数据库信息引出的计算结果。

    4、对于对时间有要求的交易,确定所要的时间和条件。这些条件包括数据库大小、机器配置、交易量、以及网络拥挤情况。

    5、确定会产生重大意外的压力测试,包括:内存、硬盘空间、高的交易率

    6、确定应用需要处理的数据量。

    7、确定需要的软件和硬件配置。通常情况下,不可能对所有可能的配置都测试到,因此要选择最有可能产生问题的情况进行测试,包括:最低性能的硬件、几个有兼容性问题的软件并存、客户端机器通过最慢的LAN/WANF连接访问服务器。

    8、确定其他与应用软件没有直接关系的商业交易。包括:

    管理功能,如启动和推出程序
    配置功能,如设置打印机
    操作员的爱好,如字体、颜色
    应用功能,如访问email或者显示时间和日期。

    9、确定安装过程,包括定置从哪安装、定制安装、升级安装。

    10、确定没有隐含在功能测试中的户界面要求。大多界面都在功能测试时被测试到。还有写没有测到,如:操作与显示的一致性,如使用快捷键等;界面遵从合理标准,如按钮大小,标签等。

    把需求组织成层次图

    4、估计测试工作量

    ∑(每个测试的时间*每个需求的测试的数目*测试需求的的数目)(测试设计、开发、….)

    5、确定资源

    人力资源
    职位 姓名 特殊责任/说明
    测试经理
    测试工程师
    设计/开发(可以多人)
    测试工程师
    测试执行(可以多人)
    测试系统管理员
    系统资源
    系统 名称/类型
    数据库服务器
    网络/子网
    服务器名称
    数据库名称
    SQA 测试存储库
    网络/子网
    服务器名称
    客户测试机
    包括专门的配置需求

    列表

    测试开发的PC机 列表

    6、创建工程调度表

    任务 相关工作量(天)

    整个SQA过程38

    测试计划12

    确定项目1

    定义测试策略

    决定测试需求

    估计工作量

    确定资源

    调度测试活动

    生成测试计划文档

    测试设计7

    分析测试需求

    指定测试过程

    指定测试用例

    查看测试需求的覆盖率

    测试开发

    12

    建立测试开发环境

    录制和回放原型过程

    开发测试过程

    测试和调试测试过程

    修改测试过程

    建立外部数据集合

    重新测试并调试测试过程

    测试执行

    6

    设置测试系统

    执行测试

    验证测试结果

    调查突发结果(unexpected result)

    生成缺陷日记

    测试评估1

    回顾测试日记

    评估测试需求的覆盖率

    评估缺陷

    决定是否达到测试完成的标准

    7、书写测试计划

    1、介绍

    目的

    背景

    测试范围

    项目文件列表

    2、测试需求

    3、测试策略

    测试类型

    1、功能测试
    2、用户界面测试
    3、性能测试
    4、压力测试
    5、容量测试
    6、配置测试
    7、安装测试

    工具

    4、资源

    人力资源
    系统资源

    5、调度

    6、文档

    软件元件
    测试特性(Assets)
    测试日记
    缺陷报告

    第二部分:测试设计

    测试设计的问题

    1、不做测试设计,测试过程也是胡乱建立的。

    2、测试设计不详细,不是基于可量度的测试策略,例如测试计划覆盖一个集合或者测试需求的一个子集。

    3、测试过程没有采用最好的技术来检验Windows C/S结构的测试需求

    测试用例的选择规则

    1、选择与测试需求的实质部分最相关的测试用例。
    2、选择的测试用例应该不容易应用程序的改变的影响。

    下面是选择测试用例的几点具体规则:

    1、商业函数

    商业函数一般与数据库有关,要测试数据库的变化,有几种方法:

    1、如果数据库的的改变会反映在一个列表框中,那么就要选择验证列表框内容的测试用例。
    2、还可以检查交易完成后的确认对话框。可以检查对话框的标题。图象比较也可以检查确认对话框,但图象比较容易受其他因素影响。
    3、修改脚本,SQA Basic提供了强大的数据库支持。

    2、域的验证

    各种不同的域选择相应的测试用例。

    3、用户界面测试

    对象状态测试用例

    4、性能标准

    等待状态测试用例

    5、压力下的操作

    6、访问控制

    Object state test case

    7、配置测试

    不能选择图象测试用例(也分辨率有关)和文件测试用例(与驱动器有关)

    8、安装选项和验证

    对象状态用例和窗口存在用例,文件存在用例。

    书写测试设计的步骤

    生成测试需求报告
      ↓
    指定测试过程
      ↓
    指定测试用例(可选)
      ↓
    回顾测试覆盖率

    第三部分:测试开发

    输入:被测软件、基于测试需求的测试设计

    输出:测试过程和测试用例

    目标:

    1、创建可以重用的测试过程和测试用例
    2、维护测试过程、测试用例与相关测试需求的一一对应。

    测试开发的问题:

    1、测试开发很乱,与测试需求或测试策略没有对应性
    2、测试过程不可重复或不可重用
    3、测试过程被作为一个编程任务来执行,导致脚本太长,不能满足软件移植性的要求。

    错误处理

    当测试过程发生错误时,有几种解决办法:

    1、跳转到别的测试过程
    2、调用一个能够清除错误的过程
    3、退出过程,启动另一个
    4、退出过程和应用程序,重新启动启动Windows,在失败的地方重新开始测试

    测试开发的步骤

    1、设立开发环境
    SQA Suite
    连接到SQA存储库
    启动SQA Baisc或VB
    被测软件
    等等

    2、录制和回放原型过程

    原型过程指出所有未知窗口控制,使得他们都能象标准窗口那样动作或者没有特别的动作,把他们都划归为Generic类型。通过这个过程,SQA Robot就知道该怎样处理应用中的特殊控制。

    1、把recording option 中的Define Unknown Object as Type Generic选项设置为off

    2、使用的过程标识符要可以被覆盖,或者能被删掉。因为这只是个原型,用来教SQA Robot 录制的过程

    3、录制测试过程和测试用例

    1、录制模块测试过程和与测试需求最低层对应的测试用例;

    2、录制初始化过程;

    3、录制导航过程,把前面的过程串起来;

    4、测试和调试测试过程

    5、修改测试过程(可选)

    6、建立外部数据集合
    如果测试过程是用来循环一套输入和输出数据,就需要建立数据集合。

    7、重复测试和调试测试过程,回到4

    第四部分:测试执行

    测试执行的问题

    1、自动化测试没有有效的利用,使得手工测试太多。

    2、测试结果的捕获没有系统性,而且没有查看或调查

    3、缺陷报告必须用手工加入缺陷跟踪系统

    错误分类

    1、测试用例失败

    正常错误

    2、脚本命令失败

    当测试过程不能不能执行录制过程中的某个功能时,回产生这种错误,如鼠标单击按钮或选择菜单项等。它也能指示是缺陷还是测试过程的设计问题。

    3、致命错误

    导致测试停止,这种情况最好重起Windows。

    具体步骤:

    1、建立测试系统
    2、准备测试过程
    3、运行初始化过程
    4、执行测试
    5、从终止的测试恢复
    6、验证预期结果
    7、调查突发结果
    8、记录缺陷日记

    第五部分:测试评估

    测试评估的目标

    1、量化测试进程

    2、生成缺陷和测试覆盖率的总结报告

    测试评估的问题

    1、没有把测试覆盖率作为报告测试进程的根据,使得不知测试是否结束;

    2、没有做缺陷评估,缺陷评估是量度软件可行性的重要指标;

    3、不使用专门的软件工具进行数据输入任务和相应的评估活动,使得这些任务变得繁重累人。

    测试覆盖率

    评估测试完成多少的标准
    缺陷评估
    评估软件质量的重要指标,通常评估模型假设缺陷的发现是呈泊松分布的;严格的缺陷评估要考察在测试过程中发现缺陷的间隔时间长短。评估要估计软件当前的可靠性并预测随着测试的继续进行,软件可靠性会怎样提高。

    SQA Suite 提供四种形式进行缺陷评估:

    1、缺陷分布报告可以生成缺陷数量与缺陷属性的函数。如测试需求和状态。
    2、缺陷趋势报告可以看出缺陷增长和减少的趋势;
    3、缺陷年龄报告展示一个缺陷处于某种状态的时间长短
    4、测试结果进度报告展示测试过程在被测应用的几个版本中的执行结果以及测试周期。

    具体步骤

    1、回顾测试日记
    2、评估测试需求的覆盖率
    3、分析缺陷
    4、决定是否达到完成测试的标准,没有满足标准时

    1、再测试
    2、降低标准
    3、确定软件的一个满足标准的子集,看是否可以发布。

  • Web测试方法

    2007-08-20 22:04:39

    Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,InternetWeb媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术

    本文将 web 测试分为 6 个部分

    • 功能测试
    • 性能测试(包括负载/压力测试)
    • 用户界面测试
    • 兼容性测试
    • 安全测试
    • 接口测试

    本文的目的是覆盖 web 测试的各个方面,未就某一主题进行深入说明。

    1 功能测试

    1.1 链接测试

    链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

      链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。

     

    采取措施:采用自动检测网站链接的软件来进行。

    推荐软件:

    Xenu Link Sleuth 免费 绿色免安装软件

    HTML Link Validator 共享(30天试用)

     

    1.2 表单测试

    当用户通过表单提交信息的时候,都希望表单能正常工作。

    如果使用表单来进行在线注册,要确保提交按钮能正常工作,当注册完成后应返回注册成功的消息。如果使用表单收集配送信息,应确保程序能够正确处理这些数据,最后能让顾客能让客户收到包裹。要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

    当用户使用表单进行用户注册、登陆、信息提交等操作时,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

    1.3 数据校验

    如果系根据业务规则需要对用户输入进行校验,需要保证这些校验功能正常工作。例如,省份的字段可以用一个有效列表进行校验。在这种情况下,需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值,确定系统能够接受这个测试值)

    在测试表单时,该项测试和表单测试可能会有一些重复。

    1.21.3的采取措施:第一个完整的版本采用手动检查,同时形成WinRunnerQTP)脚本;回归测试以及升级版本主要靠WinRunnerQTP)自动回放测试。

    1.4 cookies测试

    Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。

      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。如果在 cookies 中保存了注册信息,请确认该 cookie能够正常工作而且已对这些信息已经加密。如果使用 cookie 来统计次数,需要验证次数累计正确。

    采取措施:

           1 采用黑盒测试:采用上面提到的方法进行测试

    2 采用查看cookies的软件进行(初步的想法)

    可以选择采用的软件

    IECookiesView v1.50

    Cookies Manager v1.1

          

    1.5 数据库测试

    Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。

    在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。

    采取措施:暂时没有更好的测试方法

           考虑结合到1.21.3的测试中

     

    1.6 应用程序特定的功能需求

    最重要的是,测试人员需要对应用程序特定的功能需求进行验证。尝试用户可能进行的所有操作:下订单、更改订单、取消订单、核对订单状态、在货物发送之前更改送货信息、在线支付等等。这是用户之所以使用网站的原因,一定要确认网站能像广告宣传的那样神奇。

    采取措施:深刻理解需求说明文档

    1.7 设计语言测试

    Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如JavaJavascrīpt ActiveXVBscrīptPerl等也要进行验证。

    暂时没有方法测试,可以多参考一点讨论组内的更新信息

    2 性能测试

    2.1 连接速度测试

    用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。

      另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。

    2.2 负载测试

     

    负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

    2.3 压力测试

    负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。

      进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。

      压力测试的区域包括表单、登陆和其他信息传输页面等。

     

    负载/压力测试应该关注什么

    测试需要验证系统能否在同一时间响应大量的用户,在用户传送大量数据的时候能否响应,系统能否长时间运行。可访问性对用户来说是极其重要的。如果用户得到系统忙的信息,他们可能放弃,并转向竞争对手。系统检测不仅要使用户能够正常访问站点,在很多情况下,可能会有黑客试图通过发送大量数据包来攻击服务器。出于安全的原因,测试人员应该知道当系统过载时,需要采取哪些措施,而不是简单地提升系统性能。

    瞬间访问高峰
    如果您的站点用于公布彩票的抽奖结果,最好使系统在中奖号码公布后的一段时间内能够响应上百万的请求。负载测试工具能够模拟 X 个用户同时访问测试站点。

    每个用户传送大量数据
    网上书店的多数用户可能只订购 1-5 书,但是大学书店可能会订购 5000 本有关心理学介绍的课本? 或者一个祖母为她的 50 个儿孙购买圣诞礼物(当然每个孩子都有自己的邮件地址) 系统能处理单个用户的大量数据吗?

    长时间的使用
    如果站点用于处理鲜花订单,那么至少希望它在母亲节前的一周内能持续运行。如果站点提供基于 webemail 服务,那么点最好能持续运行几个月,甚至几年。可能需要使用自动测试工具来完成这种类型的测试,因为很难通过手工完成这些测试。你可以想象组织100 个人同时点击某个站点。但是同时组织 100000 个人呢。通常,测试工具在第二次使用的时候,它创造的效益,就足以支付成本。而且,测试工具安装完成之后,再次使用的时候,只要点击几下。

    采取措施:采用测试工具WAS、ACT协助进行测试

    3 用户界面测试

    3.1 导航测试

    导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?

      在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。

      导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。

      Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。

    3.2 图形测试

    Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:

      (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。

      (2)验证所有页面字体的风格是否一致。

      (3)背景颜色应该与字体颜色和前景颜色相搭配。

      (4)图片的大小和质量也是一个很重要的因素,一般采用JPGGIF压缩,最好能使图片的大小减小到 30k 以下

     

    5)最后,需要验证的是文字回绕是否正确。如果说明文字指向右边的图片,应该确保该图片出现在右边。不要因为使用图片而使窗口和段落排列古怪或者出现孤行。

     

    通常来说,使用少许或尽量不使用背景是个不错的选择。如果您想用背景,那么最好使用单色的,和导航条一起放在页面的左边。另外,图案和图片可能会转移用户的注意力。

    3.3内容测试

    内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。

      信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"

    对于开发人员来说,可能先有功能然后才对这个功能进行描述。大家坐在一起讨论一些新的功能,然后开始开发,在开发的时候,开发人员可能不注重文字表达,他们添加文字可能只是为了对齐页面。不幸的是,这样出来的产品可能产生严重的误解。因此测试人员和公关部门一起检查内容的文字表达是否恰当。否则,公司可能陷入麻烦之中,也可能引起法律方面的问题。测试人员应确保站点看起来更专业些。过分地使用粗体字、大字体和下划线可能会让用户感到不舒服。在进行用户可用性方面的测试时,最好先请图形设计专家对站点进行评估。你可能不希望看到一篇到处是黑体字的文章,所以相信您也希望自己的站点能更专业一些。 最后,需要确定是否列出了相关站点的链接。很多站点希望用户将邮件发到一个特定的地址,或者从某个站点下载浏览器。但是如果用户无法点击这些地址,他们可能会觉得很迷惑。

    3.4 表格测试

    需要验证表格是否设置正确。用户是否需要向右滚动页面才能看见产品的价格?把价格放在左边,而把产品细节放在右边是否更有效? 每一栏的宽度是否足够宽,表格里的文字是否都有折行?是否有因为某一格的内容太多,而将整行的内容拉长?

    3.5 整体界面测试

    整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?

    对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

      对所有的用户界面测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。

     

    采取措施:手动测试,参与人员最好有外部人员

    4 兼容性测试

    4.1 平台测试

    市场上有很多不同的操作系统类型,最常见的有WindowsUnixMacintoshLinux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。

      因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

    4.2 浏览器测试

    浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt ActiveX plug-ins或不同的HTML规格有不同的支持。例如,ActiveXMicrosoft的产品,是为Internet Explorer而设计的,JavascrīptNetscape的产品,JavaSun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。

      测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

     

    4.3 分辨率测试

    页面版式在 640x400600x800 1024x768 的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?

    4.4 Modem/连接速率

    是否有这种情况,用户使用 28.8 modem下载一个页面需要 10 分钟,但测试人员在测试的时候使用的是 T1 专线? 用户在下载文章或演示的时候,可能会等待比较长的时间,但却不会耐心等待首页的出现。最后,需要确认图片不会太大。

    4.5 打印机

    用户可能会将网页打印下来。因此网也在设计的时候要考虑到打印问题,注意节约纸张和油墨。有不少用户喜欢阅读而不是盯着屏幕,因此需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样。测试人员至少需要验证订单确认页面打印是正常的。

    4.6 组合测试

    最后需要进行组合测试。600x800 的分辨率在 MAC 机上可能不错,但是在 IBM 兼容机上却很难看。在 IBM 机器上使用 Netscape 能正常显示,但却无法使用 Lynx 来浏览。如果是内部使用的 查看(1817) 评论(16) 收藏 分享 管理

  • Insert,Select,Update和Delete

    2007-06-07 10:11:44

    掌握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 } ] )| *

      FROM table [ { , table} ]

  • SQL常用命令使用方法

    2007-06-07 10:06:48

    |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

301/212>
Open Toolbar