As long as alive, every day is full of hope

发布新日志

  • 安全测试checklist(转载)

    2010-02-01 17:31:36

    也不知道是谁写的,copy 来学习学习,天下文章大家看嘛,呵呵

    1. 不登录系统,直接输入登录后的页面的url是否可以访问
    2. 不登录系统,直接输入下载文件的url是否可以下载,如输入http://url/download?name=file是否可以下载文件file
    3. 退出登录后按后退按钮能否访问之前的页面
    4. ID/密码验证方式中能否使用简单密码。如密码标准为6位以上,字母和数字混合,不能包含ID,连续的字母或数字不能超过n位
    5. 重要信息(如密码,身份证号码,信用卡号等)在输入或查询时是否用明文显示;在浏览器地址栏里输入命令javascrīpt:alert(doucument.cookie)时是否有重要信息;在html源码中能否看到重要信息
    6. 手动更改URL中的参数值能否访问没有权限访问的页面。如普通用户对应的url中的参数为l=e,高级用户对应的url中的参数为l=s,以普通用户的身份登录系统后将url中的参数e改为s来访问本没有权限访问的页面
    7. url里不可修改的参数是否可以被修改
    8. 上传与服务器端语言(jsp、asp、php)一样扩展名的文件或exe等可执行文件后,确认在服务器端是否可直接运行
    9. 注册用户时是否可以以'--,' or 1=1 --等做为用户名
    10. 传送给服务器的参数(如查询关键字、url中的参数等)中包含特殊字符(','and 1=1 --,' and 1=0 --,'or 1=0 --)时是否可以正常处理
    11. 执行新增操作时,在所有的输入框中输入脚本标签(<scrīpt>alert("")</scrīpt>)后能否保存
    12. 在url中输入下面的地址是否可以下载:http://url/download.jsp?file=C:\windows\system32\drivers\etc\hosts,http://url/download.jsp?file=/etc/passwd
    13. 是否对session的有效期进行处理
    14. 错误信息中是否含有sql语句、sql错误信息以及web服务器的绝对路径等
    15. ID/密码验证方式中,同一个账号在不同的机器上不能同时登录
    16. ID/密码验证方式中,连续数次输入错误密码后该账户是否被锁定
    17. 新增或修改重要信息(密码、身份证号码、信用卡号等)时是否有自动完成功能(在form标签中使用autocomplete=off来关闭自动完成功能)

     

  • 回归测试用例的优化选择与覆盖率分析

    2009-07-22 20:53:37

    回归测试对保证软件质量具有重要意义。要实现有效的回归测试,必须解决回归测试中的两个主要问题:(1)测试用例的优化选择;(2)覆盖率分析。前者决定了回归测试的效率,好的测试用例的选择可以用少量的测试用例准确地覆盖新版本中尽可能多的改动。后者是度量测试的重要指标,通过达到良好的测试覆盖率,保证了回归测试的质量。

      本文正是通过讨论如何优化选择测试用例,用最小的代价达到最大的覆盖率,从而找到回归测试的有效解决方案。

      存在的问题

      ● 测试用例的优化选择

      对测试用例的选择,测试人员通常有两种作法。一种是,把相关的或是所有的模块的测试用例都选出来执行一遍;另一种是,仅针对被 Fixed 的 APAR/Defect 进行检验,测试用例很少或是开发新的针对这个 Fixed 的测试用例。这两种方法都存在不足。第一种方法在测试时间有限的情况下,去执行所有的测试用例,会测试到很多无需再测试的测试用例,从而导致测试资源的浪费;第二种是很难确保 APAR/Defect 改动后,被测系统没有受到关联影响,很难保证测试质量。

      由于 Bug Fix 或者功能更新后,在新版本发布之前,我们要确保所作改动不会对已有的功能模块产生负面的影响。用所有的测试用例作回归测试, 存在着人力与时间成本过高的问题;依靠人的经验去挑选回归测试用例,存在着挑选不准确或对程序改动测试覆盖不全的问题。

    图 1. 测试用例优化选择问题

      ● 回归测试覆盖率分析

      测试用例优化选择可以有效地解决现有测试用例的覆盖问题,但在实际测试过程中,我们仍然发现存在着覆盖不全的问题。即新版本中的某些实现并不能被现有的测试用例所覆盖。这样,测试人员需要开发新的测试用例对新的功能进行测试覆盖。然后对于测试人员来说这并不实际,他们很难依靠测试经验将代码中没有被测试的地方找出来。那么如何更好的得到测试过程中的测试覆盖率,及测试结束后整个软件的测试覆盖率呢,从而使得测试人员可以针对未被测试到的地方设计新的测试用例。这里我们特别针对在版本更新过程中,那些发生了更新却没有被覆盖到的地方。

      解决问题

      ● 原理

    图 2. 测试用例优化选择原理

    图 3. 测试用例优化选择举例

      如上图所示,所有的测试用例都会有一个函数调用的路径。我们把这些调用路径一一记下来。对于新版本所作的改动,所有与之相关的上层调用的测试用例都能够准确地选出来,这样我们就能用这些准确的测试用例来覆盖这次改动所产生的影响。毫不相关的测试用例则不会被选出来。从而用较小的成本完成这次改动所需要的回归测试,既省时省力又保证较高的测试质量。

    图 4. 覆盖率分析举例

      如上图所示,在版本更新过程中受到影响的测试用例为 Test Case1, Test Case2, Test Case3 覆盖了 12 个 Node,在版本更新过程中的更新点是 4,其中被覆盖到的为 3,还有 1 个更新点没有被覆盖到,现有测试用例集合的更新覆盖能力为 75% 。这样,我们知道上一个版本的测试用例设计不够充分尚有程序模块没有被任何已有的测试用例所覆盖。由于代码的更新最有可能引起程序的缺陷甚至系统崩溃,所以需要添加新的测试用例以保证对更新的覆盖,以降低程序运行的风险。

      对于软件的节点覆盖率,我们细化到函数粒度。我们是通过软件部署的 Binary 代码分析得知的函数情况。不需要借助源代码,因此对于软件进行测试覆盖率分析来说要求低,用较小的成本完成此次的测试用例覆盖反馈与分析。既省时省力又保证较高的测试质量。

     

    ● 解决方案

      基于对问题 1) 和问题 2) 的原理分析,我们设计并实施了回归测试的解决方案,如下图所示。它包含了 3 个主要步骤。一是测试用例的录入;二是对新旧两个版本的变更分析;三、通过测试用例优化选择和覆盖率分析,得到相应的测试用例优化选择报告,和覆盖率分析报告。

    图 5. 回归测试解决方案

      步骤一, Trace Test Case 负责录制测试用例,并将捕获到的测试用例的 Runtime Trace 存放到数据库中;

      测试用例在后台运行中的 Runtime Trace 是动态分析 (Dynamic Analysis) 中的重要信息。这些实际的运行信息为测试用例的优化选择和覆盖率分析创造了条件。下面是测试用例跟踪的框架图:

    图 6. 测试用例跟踪的框架图

      从上图我们可以看出,测试人员触发 Trigger 之后,会启动 Agent Controller 。 Agent Controller 一直对 JVM 中的 JVMTI 进行监听,以获取部署在 JVM 上的被测应用程序。这些 Agent Controller 还负责将收集到的数据传输给 Data Collector 。又 Data Collector 将这些 Runtime Trace 写入如下表所示的数据库表中。

    Case ID Package Class Method Signature
    001 com.ibm.crl.orts.action DeleteCommodityAction Delete ([Ljava/lang/String;)V
    001 com.ibm.crl.orts.action DeleteOrderAction Delete  
    002 ......      
    003 ...... ...... ...... ......

      注意:函数的 Signature 信息作为函数的参数标识也需要记录下来。以区别同名不同参数的函数。

    步骤二, Change Analysis 用于将新旧两个版本作比较,得到 Change Report,即程序变更报告,可以精确到 Method 粒度。一般来说代码变更有 4 种级别,分别为包级别 (Package),类级别 (Class),函数级别 (Method) 及语句级别 (Statement) 。

      对于包级别和类级别来说,比较的力度过粗,会影响到回归测试优化的质量。而函数级别和语句级别都能起到很好的回归测试的作用。其中语句级别因为粒度最细,等到的分析结果也最精确,回归测试质量最高。但与函数级别的变更分析相比,回归测试的质量相差很有限,但造成了过多的执行时间代价,影响了回归分析的效率。因此我们采用函数级别的变更分析作为回归测试的变更粒度。

      确定比较粒度之后,可以选择分析比较的方法。最简单的常用比较方法就是文本比较。包括源代码和可执行文件 (binary code) 的文本比较。根据 Java 语言面向对象的特点,还可以采用基于面向对象分析的比较方法。后者得到的分析粒度更细,但是所花的代价也越高。

      步骤三, 在通过测试用例录制得到测试用例具体的 Runtime Trace 信息,以及通过 Change 分析得到新旧两个版本的变更信息之后,我们可以对测试用例优化问题及覆盖率分析问题进行求解。

      Test Case Prioritization 中,通过测试用例与运行的 Runtime Trace 进行匹配得到相关的测试用例。并利用测试用例优化排序算法对相关的测试用例进行排序,得到优化结果。现在的优化排序算法有多种,这里不对优化排序算法进行讨论。

      Coverage Analysis 中,通过对已被相关测试用例覆盖的 Method 数量,及未被测试用例覆盖到的 Method 数量的分析,可以得到基于代码更新的覆盖率报告。测试人员得到这份报告之后,可以找到未被覆盖到的 Method,并对其进行针对性的开发新的测试用例。以完成对新功能的覆盖。

      我们可以看到步骤一,二共同服务于测试用例优化选择和覆盖率分析两个模块。有了测试用例的 Runtime Trace 和 Change Report. 我们可以将 Change 结果与 Runtime Trace 进行匹配,找出能覆盖程序更改的测试用例。同样,对于没有被测试用例覆盖到的 Change 部分。由于没有相关测试用例被找出,我们现有的测试用例是不足的,需要针对未被覆盖到的 Change 部分开发新的测试用例。

      而覆盖率作为软件测试的一项重要指标,可以根据已经得到覆盖和未被覆盖的 method 进行求解,即已得到覆盖的 change method 数与总的 change method 之比。

      ● 结果

      基于以上的回归测试解决方案,我们对一个有着 30 个测试用例的程序进行回归测试,得到如下测试用例优化选择分析报表:

      Change Analysis Report

    总函数 变更函数 覆盖数 未覆盖 覆盖率
    108 12 10 2 83.3%

      表 1 优化选择测试用例: 3 (of Total 30)

    Case Name Cover Changed Method
    TestCase001 5 details
    TestCase005 3 details
    TestCase013 2 details

      分析报告显示这次代码变更共有 12 个函数发生了更改。在 30 个测试用例中有 3 个测试用例与这些更改相关,它们覆盖了这次代码更改 12 个中的 10 个。而其它 27 的测试用例则与这 12 个代码改动毫不相关。

      表 2 回归测试结果分析

    全部测试用例 优化选择 函数变更 覆盖率分析
    已覆盖 未覆盖 覆盖率
    30 3 12 10 2 83.3%

      从表中我们可以看到,经过测试用例优化选择之后,我们选出了 3 个和函数变更相关的测试用例,达到了 83.3% 的覆盖率。同时由于 27 个与函数变更无关的测试用例不需要重测,使得 90% 的回归测试资源得到了节省。

      从表中我们可以看到,经过测试用例优化选择之后,我们选出了 3 个和函数变更相关的测试用例,达到了 83.3% 的覆盖率。同时由于 27 个与函数变更无关的测试用例不需要重测,使得 90% 的回归测试资源得到了节省。

    图 7. 覆盖率分析

      从上图,我们可以清楚地看到基于每个函数改动的相关测试用例的数目,以及测试覆盖率。比如 ManageCommodityAction 这个 Class 里面,存在了 2 个 Change Method, 只有 1 个 changed method 被现有的 1 个 Test Case 所覆盖,测试覆盖率为 50% 。

      上面分析报告中总共有 12 个函数发生改动,基中还有 2 个没有被任何测试用例覆盖到。那么未被覆盖的 Change Method 就需要测试人员对之进行分析并且添加新的测试用例以提高我们的测试覆盖率 , 保证测试质量。

      总结

      回归测试用例的优化选择,以最少的测试用例,准确地覆盖所作改动,极大地提高了我们回归测试的测试效率与测试质量。

      自动测试过程中的覆盖率反馈分析,以最小的测试代价,最精确的分析,来获得当前的测试完成情况,为测试人员提高了良好的分析报告,以便测试人员改进和新增新的测试用例。大大提高了回归测试的测试效率与质量。

  • 单元测试常用断言

    2009-07-22 20:52:49

    断言方法有很多,不过,可以很清楚地从其子面看出其功能。

      常用的方法如下:

      assertEquals(a, b)

      Asserts that two primitive values are equal.

      测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

      assertFalse(a)

      Asserts that a condition (a) is false.

      测试a是否为false(假),a是一个Boolean数值。

      assertTrue(a)

      Asserts that a condition is true.

      测试a是否为true(真),a是一个Boolean数值

      assertNotNull(a)

      Asserts that an object isn't null.

      测试a是否非空,a是一个对象或者null。

      assertNull(a)

      Asserts that an object is null.

      测试a是否为null,a是一个对象或者null。

      assertNotSame(a, b)

      Asserts that two objects do not refer to the same object.

      测试a和b是否没有都引用同一个对象。

      assertSame(a, b)

      Asserts that two objects refer to the same object.

      测试a和b是否都引用同一个对象。

  • 简单说说ERP测试(转载)

    2009-06-25 09:36:18

      一般来说国内比较著名的ERP软件供应商主要是用友和金蝶。主要说明一下关于测试用友软件的经验吧(不包括性能测试)。

      一般来说ERP就是一个管理软件。既然是管理软件管理的思路就变得很重要,就是说你首先要知道这个软件的流程也就是我们说的业务知识才能更好的去测试。

      因为我以前测试的是c/s结构的,所以一般来说会将测试分类为三个部分:

      1、功能测试:对界面上的功能按钮进行测试,查看其是否实现相应功能,简单距离就是我们的删除,保存,审核等功能,在什么情况下什么按钮可以使用,按钮是否实现其功能。

      2、业务流程测试:业务流程测试。该部分对业务流程的理解比较重要,例如我们的供销存中,先要从供应商处买入,有了库存将其组合成整件我们才能销售。这里面有订单的扭转结存的。或者说例如我们做资产托管的时候先要有资产,然后根据其资产价值随着市价的浮动而进行重估值行为;如果对业务过程不能很好的理解是不可能完善的进行测试的。

      3、数据测试:管理过程中我们一般会生成各种各样的报表。一般来说我们可以觉得报表是最后的结论。结论是否正确是一个很重要的事情。我们要注意中间每一个过程的结转是否出现错误。对整个报表进行数据核对。一般来说比较建议在开始就对输入数据做一个计划,计划输入什么结果应该是什么。这样对每一个过程进行观察。而不是等到发现了错误的时候再来比对

      说说测试方法在过程中的应用。测试方法是为了让我们更加完善的进行测试的手段之一。例如我们说的边界值,等价类划分还有场景法是我们在做ERP测试中比较常用的方法。对这些方法的了解可以让我们更好的去完善我们的测试用例。但是也并不是说当你不知道这些方法就不能测试。只是可能会陷入纯粹的是否符合需求的测试中。这样的话会有很多的隐藏Bug

     

  • 自动化测试随想(转载)

    2009-06-25 09:34:35

       自动化测试工具不等于自动化测试。相信所有从事过自动化测试和没有做过自动化测试但是有测试经验的人都会认同这一点。用自动化测试工具写脚本并不意味着我们就一定在做自动化测试;自动化测试是什么呢,自动化测试它是一个过程,它有一个完整的生命周期,包括需求分析,用例设计,脚本编写,运行维护等多个环节。而编码还有多种方式,用自动化测试工具只是创建脚本的方式之一。但是这并不是说自动化测试工具不重要,因为无论测试框架搭建的多么完美,最后总是要实现出来的。熟练掌握工具可以提供自动化测试的效率,但是自动化测试工具却不是决定自动化测试效果好坏的关键因素。

      自动化测试一定要重视需求的分析过程。在软件开发过程中,需求重于一切,需求驱动开发,需求驱动管理。在自动化测试也一样,定义合理,正确的自动化测试需求是自动化测试顺利进行的重要基础。在自动化测试过程中,需求决定一切。举个例子,比如我们要测试一个登录功能,如果测试目的是验证正确的用户名和密码可以成功登录即可,那么OK,我们的自动化测试中不会去考虑错误的用户名的情况,也不会考虑登录页面的布局是否合理,是否有错别字等等,为什么我们对这些明显并且简单的功能都不做自动化测试验证呢?理由很简单,我们的测试需求只是验证成功登录,不包括界面布局(其实这是一个不合理的自动化测试需求)和是否有错别字。这是自动化测试与人工测试的区别之一,人工测试时,这些测试点在执行测试时顺便看上一眼就OK了,但是对于测试脚本来说,没有“顺便看上一眼”这种动作,脚本是不会思考的,人让它干什么它就干什么。如果想包括登录页面中所有的验证怎么办?很简单,把所有要验证的功能都加入到自动化测试需求列表中, 然后提交给自动化测试工程师。但是这样做最直接的后果是自动化测试的成本无限扩大,测试时间一天天推迟,自动化测试工程师一次又一次的崩溃。

      以前有人向我提问:“请问自动化测试在需求阶段能做什么,谢谢”。对于这样的问题说实话我无法回答,因为要回答这样的问题之前,我们要先搞清楚这么几个问题:在需求阶段我们有哪些工作?这些工作中是否存在重复性高并且可被量化或可被明确通过标准的工作项?这些工作项是否适合通过自动化测试解决。这些问题搞清楚后我才能回答在XX阶段自动化测试能做什么的问题。这其实是两种自动化测试的思路,前者是希望先了解自动化测试的能力范围,然后再去定义测试需求;但是我一直坚持认为,自动化测试必须首先定义出明确的测试需求,然后我们再去寻找适合我们的测试工具或测试框架。还是那句话,在自动化测试过程中,需求决定一切。也许有人会说了,那我还不清楚在需求阶段有哪些测试工作啊。对不起,那是您测试管理和工作上的问题,自动化测试也帮不了什么忙。

     

     

  • 基础代码

    2009-06-18 17:31:51

    1. 生产随机数列
    第一种方法

    Randomize   '更新返回的数据(Initialize random-number generator)
    Function rand(k)
    n = Int((k-1)* Rnd +1)
    rand = n
    End Function


    第二种方法

    n=randomnumber.value(1,255)
    msgbox n

    2 . 当运行到表中的某一行,自动导出表中的所有数据

    row=datatable.getcurrentrow
    if row="5" then
      datatable.export("d:\data.xml")
    end if

    3.向某一列的单元格赋值:
    datatable.value("column_name",dtlocalsheet)="nanjing"

    4.取得某一行具体值:
    datatable.setcurrentrow(n)
    msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
    或者kk=datatable.Rawvalue("column_name","action1")

    5.在run-time时,动态添加表格与数据

    kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;

    6.   wintreeview一些操作

    选择一个条目:wintreeview.select(item)'根是0
    根的名称:wintreeview.getitem(0)

    7.   数据库检查点模块:
    sub database_check
    set con=createobject("adodb.connection")
    con.open "Description=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_
                     "PWD=123456;APP=Quick Test Pro;WSID=IBM;DATABASE=IBM_table"
    'access方式:con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
    'Orocle方式:con.open "DRIVER={Oracle in OraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"
    set record=createobject("adodb.recordset")
    sql="select*from ibm_one_table"
    record.open sql,con
    DO
    if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
    num=num+1;
    end if
    record.movenext
    loop until record.eof=true
    record.close
    set record=nothing
    con.close
    set con=nothing
    end sub


    8.  由于对象属性原因,无法识别对象
    -----对于对象属性是变化的,可以参数化/或者用正则表达式
    -----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
    -----有时可以删除对象的变化的属性来解决识别问题
    ------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
      (index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
      变化后,原先的所有对象index属性要发生变化,开始是0;如index:=0;
            location:根据对象的位置进行确定,从上到下,从左到右;
      CreateTime:按照对象被浏览器打开的先后标识对象)
    ------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题


    9.   等待某个对象出现方法
    y=......waitproperty("visible",true,10000)


    10.  "is+*"类型function
    isarray'是否是数组
    isconnected'判断QTP是否连接到TD
    isdate'是否是合法的日期类型
    isempty'判断是否初始化
    isNull'判断是否为空值
    isNumeric'判断是否是数字型
    isobject'判断是否一个功能对象
    isready'判断设备是否准备就绪
    isRootFolder'是否是根目录


    11.  获取对象属性名称用法:
    GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
               例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是
          QTP为识别该对象创立的描述属性;
    GetToproperty----从对象库中描述对象的属性,静态值
    GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法


    12. FireEvent的使用可以对一个对象进行更复杂的操作
    如:FireEvent("onfocus")   '使一个控件获取焦点
         FireEvent("ondblclick")  '实现双击/也可以在事件设定中针对该对象事件响应 


    13. 模板的应用
    -----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
     并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
    例如:
    '-------------------脚本说明---------------
    '产品版本:      __Build(  )
    '测试员:
    '编写日期:
    '测试功能:
    '脚本类型:
    '被测试对象初始状态:
    '进展程度:
    '基本思路:
    '主要功能函数:
    '历史修改:
    '没解决的问题:
    '--------------------脚本内容-------------

  • QTP中各种数据库操作

    2009-06-10 17:29:51


    RG?HM0i83470QTP插入数据库检查点,手动指定SQL语句的写法。
    !Q4F!P4K0h)E:q?gC83470一、SQL Server格式(本地无需安装SQL Server)51Testing软件测试网wQ#qLYwZo
    connectionstring(连接字符串):51Testing软件测试网?vQim
    1.本地没有创建数据源的方式
    %i(u#L*Da5q\$H!b?q(k83470DRIVER=SQL Server;SERVER=数据库IP地址;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=本地主机名;DATABASE=数据库名51Testing软件测试网#fU0hN+jw
    51Testing软件测试网%[%P-G/v\C
    实例:
    $C-I4heQ&Y fV#n83470DRIVER=SQL Server;SERVER=10.160.11.10;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJHLJUN;DATABASE=dcwork51Testing软件测试网1@r6IxG~1b
    51Testing软件测试网(a:}H%Gb*]3Uo
    2.本地已创建数据源的方式51Testing软件测试网m5KB#l&bEs e
    DSN=数据源名称;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=数据库的主机名;DATABASE=数据库名51Testing软件测试网ea.u2S!k Mg

    *X^(d)J L'xC83470实例:51Testing软件测试网zr&Z?v}t)k*?
    DSN=LocalServer;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJDCWORKTEST;DATABASE=dcwork51Testing软件测试网 {9i0IhGC!j,D#`V

    Go Ip.R5P uX)]!X_834703.SQL语句实例(从数据库表HR_LANGUAGE_TYPE中,查询字段语言名称LANGUAGE_NAME,条件语言名称=中文,按语言名称升序排序结果)51Testing软件测试网Xd fK ` {(\1f
    source(SQL语句):
    2A&a`\b0}83470SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM dcwork.dbo.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME51Testing软件测试网1_@R^!_.L`kS
    51Testing软件测试网@GSb6H Q1de
    51Testing软件测试网UWg Ou2f.v at+J
    二、DB2格式:(本地至少安装DB2 Run-Time Client Lite)51Testing软件测试网-r%C+I+K6y ]Xm_8Y
    connectionstring(连接字符串):51Testing软件测试网 ~X(_r*x
    1.本地没有创建数据源的方式51Testing软件测试网%?;KIsI8M6S
    DRIVER={IBM DB2 ODBC DRIVER};UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=数据库名;
    d0M H*y {!rJ"@\8347051Testing软件测试网4i%?|}:EKf-W-Jv
    实例:
    d;`YR _83470DRIVER={IBM DB2 ODBC DRIVER};UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;51Testing软件测试网A-LY!YG6N
    51Testing软件测试网?+iK-Okd*K
    2.本地已创建数据源的方式
    BjHRhH.K83470DSN=数据源名称;UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=DCWORK;
    "z[5c:uOV`I83470
    ZPJun:cn83470实例:
    "Hc8{~ m]p'I83470DSN=DWCORKDB2;UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;
    .B5T.Ny"X+tMu9m&J[*h83470
    $gl+dCU*e'z1Z.@:V834703.SQL语句实例
    c+{_&m5]1r83470source:SQL语句51Testing软件测试网]dmBx$W
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM DB2ADMIN.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME
    ;k2@ {~X`P8347051Testing软件测试网g d\oP+gu@ ue
    51Testing软件测试网OX.~{8|p
    三、Oracle格式:(本地需要安装Oracle ODBC DRIVER)
    ?i d_|^%`83470connectionstring(连接字符串):
    8Sxo:A0y4I834701.本地没有创建数据源的方式51Testing软件测试网3~p'i S` M
    DRIVER={Oracle in OraHome92};SERVER=数据库服务名;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;
    0p)S+J g-l+_8347051Testing软件测试网 C9wdW&WZ
    实例:
    s%i"y-B2RQWFB83470DRIVER={Oracle in OraHome92};SERVER=DCWORK;UID=DCWORK;PWD=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;51Testing软件测试网0C?6s_{)O^

    F|,h;Pua+d5_}8r LW8347051Testing软件测试网$Z[ N)j?A3Y%b
    51Testing软件测试网%|OiA$H I3l
    2.本地已创建数据源的方式51Testing软件测试网 |l:Y5B1a h\&L2C
    DSN=数据源名称;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;
    BQL"Zt y/L,Y8347051Testing软件测试网8]{DF|
    实例:
    b0|$ko)Z~83470DSN=dcworkoracle;UID=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;51Testing软件测试网q#F8@Dw D
    51Testing软件测试网YF+Tk QY"P%~
    3.SQL语句实例
    PH%y8JafLy]83470source:SQL语句51Testing软件测试网{#j^\ k
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM DCWORK.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME
    `(C8D(`7I+[p-]8347051Testing软件测试网jN"?c.fox'D&YMy
    51Testing软件测试网a#eH7t"n

    3YuU.XDL\m4A^a4N83470四, mysql
    C8HG5F+eGfK M83470Set Conn = CreateObject("ADODB.Connection" )
    $\&Oc/Ct(C^ MO.R83470str="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.1.100;DATABASE=wp_blog;user id=zzz ; password=123456"51Testing软件测试网m(] `jxaR5K'x n
    Conn.open str51Testing软件测试网'f ??`@jp/{}
    Set Rs = CreateObject ("ADODB.Recordset" )51Testing软件测试网[ L8KTT8\
    sql = "select * from `wp_blog`.`blg_webcategory` limit 0, 5000;"
    a*x[1y^ x83470Rs.open sql,conn,1,351Testing软件测试网3j'SJb m[7_!~
    If (not Rs.eof) then
    5b+bIest83470Rs.MoveFirst
    nU:E%K#e km3}N4]83470MsgBox Rs(0)51Testing软件测试网'W wQu9On9_
    MsgBox Rs(1)
    "{+q9uA0fC83470MsgBox Rs(2)
    3_$?/_X%}83470MsgBox Rs(3)
    t"t%D%z1lN'W83470end if51Testing软件测试网FTq0I!X {

    /fe2j?7K,md0B83470Rs.close51Testing软件测试网$O'UbMDuG D
    Set Rs = Nothing51Testing软件测试网&U6{~ q8i+hBx
    Conn.close
    2F0XPRee4f0~ G83470Set Conn = Nothing51Testing软件测试网#wczj)i+[ I#k8{

    o(D!uMj ~i83470
    XU*jW+x\83470五. access
    bkKJC-y83470
    }@4},uFvR c~nP83470Set Conn = CreateObject("ADODB.Connection" )
    "I+}*b5T ]5t(dT Y83470str="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/db1.mdb"51Testing软件测试网I/j w.B{ rY4\
    Conn.open str51Testing软件测试网zIo%y@
    Set Rs = CreateObject ("ADODB.Recordset" )51Testing软件测试网3M ~Q;]uJ(F
    51Testing软件测试网$d5@$eHQ*m1B.s6Z;H

    /U2s2^9U#y?83470六.*.xml
    ,m}'ZDA n4Jy RY1Y)N83470Environment.LoadFromFile "D:\新建文件夹\a.xml"
    MQ'U+gIbe83470Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set Environment("xxxx")
  • vbs常用函数

    2009-06-10 15:57:36

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

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

    ' ********************************************************************
    ' 函数说明:连接数据库;
    ' 参数说明:(1)strDBType(数据库类型:如ORACEL;DB2;SQL;ACCESS)
    '           (2)strDBAlias(数据库名)
    '           (3)strUID(用户名)
    '           (4)strPWD(密码)
    '           (5)strIP(数据库IP地址:仅SQL SERVER 使用)
    '           (6)strLocalHostName(本地主机名:仅SQL SERVER 使用)
    '           (7)strDataSource(数据源:仅ACCESS使用;如d:\yysc.mdb)
    ' 返回结果:无
    ' 调用方法: ConnectDatabase(strDBType, strDBAlias, strUID, strPWD, strIP, strLocalHostName, strDataSource)
    ' ********************************************************************
    function ConnectDatabase(byval strDBType, byval strDBAlias, byval strUID,byval strPWD, byval strIP,byval  strLocalHostName,byval strDataSource,byval strSQL)
       On error goto 0                      
      
                    Set bjConnection = CreateObject("ADODB.CONNECTION")       '1 - 建立CONNECTION对象的实例
      
        Select Case UCase(Trim(strDBType))

         Case "ORACLE"
          strConnectionString = "Driver={Microsoft ODBC for Oracle};Server=" & strDBAlias & ";Uid="_
           & strUID & ";Pwd=" & strPWD & ";"                           '2 - 建立连接字符串
          objConnection.Open strConnectionString                '3 - 用Open 方法建立与数据库连接
          
         Case "DB2"
          strConnectionString = "Driver={IBM DB2 ODBC DRIVER};DBALIAS=" & strDBAlias & ";Uid="_
           & strUID & ";Pwd=" & strPWD & ";"
          objConnection.Open strConnectionString
                                       
         Case "SQL"
           strConnectionString = "DRIVER=SQL Server; SERVER=" & strIP & "; UID=" & strUID & "; PWD="_
            & strPWD & "; APP=Microsoft Office 2003;WSID=" & strLocalHostName & "; DATABASE=" & strDBAlias & ";"
          objConnection.Open strConnectionString
                                                    
         Case "ACCESS"
          strConnectionString = "provider=microsoft.jet.oledb.4.0;data source=" & strDataSource &_
           ";Jet OLEDB:Database Password=" & strPWD & ";"
          objConnection.Open strConnectionString
                                                        
         Case Else

          MsgBox "输入的数据库类型格式有误" & vbCrLf & "支持的数据库类型格式:ORACLE;DB2;SQL;ACCESS;EXCEL"
          
        End Select
        
      
        If  (objConnection.State = 0) Then
            print "连接数据库失败!"
         else
               print"连接数据库成功!"
        End If


         Call QueryDatabase("select * from sysobjects", "name", "str_Array_QueryResult")
        
        '判断是否有值
        if objRecordSet.BOF = true then
         print "查询数据库失败"
    '     CheckOracle = false
        else
         print"查询数据库成功"
    '     ConnectDatabase = objRecord.getRows()
         
        End If

        Call CloseDatabase()
        
      
    End function

    Call ConnectDatabase("SQL","UPLF","sa","123456","192.168.1.183","yujie","","select * from sysindexes ")


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


    ' ********************************************************************
    ' 函数说明:更新数据库;包括INSERT、DELETE 和 UPDATE操作
    ' 参数说明:(1)strSql:SQL语句
    ' 返回结果:无
    ' 调用方法: UpdateDatabase(strSql)
    ' ********************************************************************
    Sub UpdateDatabase(strSql)

        Dim objCommand
        Dim objField      
         
        Set bjCommand = CreateObject("ADODB.COMMAND")
        Set bjRecordSet = CreateObject("ADODB.RECORDSET")
        objCommand.CommandText = strSql
        objCommand.ActiveConnection = objConnection
        Set bjRecordSet = objCommand.Execute
         
        Do Until objRecordSet.EOF
         
          For Each objField In objRecordSet.Fields
            Debug.Write objField.Name & ": " & objField.Value & "   "
          Next
           
          objRecordSet.MoveNext
          Debug.WriteLine
        Loop      
         
        Set bjCommand = Nothing
        Set bjRecordSet = Nothing
                  
    End Sub

     

     

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


    ' ********************************************************************
    ' 函数说明:关闭数据库连接;
    ' 参数说明:无
    ' 返回结果:无
    ' 调用方法: CloseDatabase()
    ' ********************************************************************
    Sub CloseDatabase()

      objRecordSet.Close
      objConnection.Close
       
      Set bjCommand = Nothing
      Set bjRecordSet = Nothing
      Set bjConnection = Nothing
      
    End Sub

  • 软件测试规范

    2009-06-04 16:20:53

    软件测试规范

     

     

     

    一、目的与适用范围

    1、目的

    软件测试是软件工程的重要组成部分,测试工作的质量直接影响软件产品的生命力。测试工作的标准化是软件质量保证(Quality Assurance)重要而且必须的环节。制定本标准的目的在于使测试流程更标准,测试过程更规范。从而使整个软件生产纳入更系统化、更专业化的轨道。

    2、适用范围

    本标准适用于软件测试流程的管理和测试的具体操作过程。本标准的使用者可以是企业内部的测试人员和开发人员。

     

    二、测试方法

      软件测试的方法和技术是多种多样的。以下将介绍比较常用的一些测试方法:   

    1、静态测试

    静态方法是指不运行被测程序本身,仅通过分析或检查源程序的文法、结构、过程、接口等来检查程序的正确性。静态方法通过程序静态特性的分析,找出欠缺和可疑之处,例如不匹配的参数、不适当的循环嵌套和分支嵌套、不允许的递归、未使用过的变量、空指针的引用和可疑的计算等。静态测试结果可用于进一步的查错,并为测试用例选取提供指导。

    2、动态测试

     动态方法是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率和健壮性等性能,这种方法由三部分组成:构造测试实例、执行程序、分析程序的输出结果。

    3、黑盒测试

           黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盆子,在完全不考虑程序内部结构和内部特性的情况下,测试者在程序接口进行测试,它只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数锯而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分、边值分析、因果图、错误推测等,主要用于软件确认测试。

          “黑盒法着眼于程序外部结构、不考虑内部逻辑结构、针对软件界面和软件功能进行测试。黑盒法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。

    4、白盒测试

           白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。

          “白盒法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。白盒法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。

    5ALAC(Act-like-a-customer)测试

       ALAC测试是一种基于客户使用产品的知识开发出来的测试方法。ALAC测试是基于复杂的软件产品有许多错误的原则。最大的受益者是用户,缺陷查找和改正将针对哪些客户最容易遇到的错误。   

    6、单元测试方法

    6.1单元测试任务

    单元测试任务包括:

           模块接口测试;

           模块局部数据结构测试;

           模块边界条件测试;

           模块中所有独立执行通路测试;

           模块的各条错误处理通路测试。

          模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。

    6.2接口测试

    测试接口正确与否应该考虑下列因素:

           输入的实际参数与形式参数的个数是否相同;

           输入的实际参数与形式参数的属性是否匹配;

           输入的实际参数与形式参数的量纲是否一致;

           调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;

           调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配;

           调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致;

           调用预定义函数时所用参数的个数、属性和次序是否正确;

           是否存在与当前入口点无关的参数引用;

           是否修改了只读型参数;

           对全程变量的定义各模块是否一致;

           是否把某些约束作为参数传递。

                 如果模块内包括外部输入输出,还应该考虑下列因素:

           文件属性是否正确;

           OPEN/CLOSE语句是否正确;

           格式说明与输入输出语句是否匹配;

           缓冲区大小与记录长度是否匹配;

           文件使用前是否已经打开;

           是否处理了文件尾;

           是否处理了输入/输出错误;

           输出信息中是否有文字性错误;

    6.3数据测试

    检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:

           不合适或不相容的类型说明;

           变量无初值;

           变量初始化或省缺值有错;

           不正确的变量名(拼错或不正确地截断);

           出现上溢、下溢和地址异常。

            除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响。

    6.4控制流测试

    在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:

           误解或用错了算符优先级;

           混合类型运算;

           变量初值错;

           精度不够;

           表达式符号错。

         比较判断与控制流常常紧密相关,测试用例还应致力于发现下列错误:

           不同数据类型的对象之间进行比较;

           错误地使用逻辑运算符或优先级;

           因计算机表示的局限性,期望理论上相等而实际上不相等的两个量相等;

           比较运算或变量出错;

           循环终止条件或不可能出现;

           迭代发散时不能退出;

           错误地修改了循环变量。

    6.5出错处理测试

    一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:

           输出的出错信息难以理解;

           记录的错误与实际遇到的错误不相符;

           在程序自定义的出错处理段运行之前,系统已介入;

           异常处理不当;

           错误陈述中未能提供足够的定位出错信息。

    6.6边界条件测试

    边界条件测试是单元测试中最后,也是最重要的一项任务。众的周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。

    [-page-]      

    7、集成测试的基本方法

            某设计人员习惯于把所有模块按设计要求一次全部组装起来,然后进行整体测试,这称为非增量式集成。这种方法容易出现混乱。因为测试时可能发现一大堆错误,为每个错误定位和纠正非常困难,并且在改正一个错误的同时又可能引入新的错误,新旧错误混杂,更难断定出错的原因和位置。与之相反的是增量式集成方法,程序一段一段地扩展,测试的范围一步一步地增大,错误易于定位和纠正,界面的测试亦可做到完全彻底。下面讨论两种增量式集成方法。

           7.1 自顶向下集成

            自顶向下集成是构造程序结构的一种增量式方式,它从主控模块开始,按照软件的控制层次结构,以深度优先或广度优先的策略,逐步把各个模块集成在一起。深度优先策略首先是把主控制路径上的模块集成在一起,至于选择哪一条路径作为主控制路径,这多少带有随意性,一般根据问题的特性确定。

            自顶向下集成测试的具体步骤为:

           以主控模块作为测试驱动模块,把对主控模块进行单元测试时引入的所有桩模块用实际模块替代;

           依据所选的集成策略(深度优先或广度优先),每次只替代一个桩模块;

           每集成一个模块立即测试一遍;

           只有每组测试完成后,才着手替换下一个桩模块;

           为避免引入新错误,须不断地进行回归测试(即全部或部分地重复已做过的测试);

           从第二步开始,循环执行上述步骤,直至整个程序结构构造完毕。

            自顶向下集成的优点在于能尽早地对程序的主要控制和决策机制进行检验,因此较早地发现错误。缺点是在测试较高层模块时,低层处理采用桩模块替代,不能反映真实情况,重要数据不能及时回送到上层模块,因此测试并不充分。解决这个问题有几种办法,第一种是把某些测试推迟到用真实模块替代桩模块之后进行,第二种是开发能模拟真实模块的桩模块;第三种是自底向上集成模块。第一种方法又回退为非增量式的集成方法,使错误难于定位和纠正,并且失去了在组装模块时进行一些特定测试的可能性;第二种方法无疑要大大增加开销;第三种方法比较切实可行。

           7.2自底向上集成

            自底向上测试是从原子模块(即软件结构最低层的模块)开始组装测试,因测试到较高层模块时,所需的下层模块功能均已具备,所以不再需要桩模块。

           自底向上综合测试的步骤分为:

           把低层模块组织成实现某个子功能的模块群(cluster;

           开发一个测试驱动模块,控制测试数据的输入和测试结果的输出;

           对每个模块群进行测试;

           删除测试使用的驱动模块,用较高层模块把模块群组织成为完成更大功能的新模块群;

           从第一步开始循环执行上述各步骤,直至整个程序构造完毕。

               自底向上集成方法不用桩模块,测试用例的设计亦相对简单,但缺点是程序最后一个模块加入时才具有整体形象。它与自顶向综合测试方法优缺点正好相反。因此,在测试软件系统时,应根据软件的特点和工程的进度,选用适当的测试策略,有时混和使用两种策略更为有效,上层模块用自顶向下的方法,下层模块用自底向上的方法。

            此外,在集成测试中尤其要注意关键模块,所谓关键模块一般都具有下述一或多个特征:对应几条需求;具有高层控制功能;复杂、易出错;有特殊的性能要求。关键模块应尽早测试,并反复进行回归测试。

     

    8、确认测试的基本方法

           8.1确认测试标准

                实现软件确认要通过一系列黑盒测试。确认测试同样需要制订测试计划和过程,测试计划应规定测试的种类和测试进度,测试过程则定义一些特殊的测试用例,旨在说明软件与需求是否一致。无论是计划还是过程,都应该着重考虑软件是否满足合同规定的所有功能和性能,文档资料是否完整、准确,人机界面和其他方面(例如,可移植性、兼容性、错误恢复能力和可维护性等)是否令用户满意。

                   确认测试的结果有两种可能,一种是功能和性能指标满足软件需求说明的要求,用户可以接受;另一种是软件不满足软件需求说明的要求,用户无法接受。项目进行到这个阶段才发现严重错误和偏差一般很难在预定的工期内改正,因此必须与用户协商,寻求一个妥善解决问题的方法。

           8.2 配置复审

                 确认测试的另一个重要环节是配置复审。复审的目的在于保证软件配置齐全、分类有序,并且包括软件维护所必须的细节。

           8.3αβ测试

            事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列验收测试。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为αβ测试的过程,以期发现那些似乎只有最终用户才能发现的问题。

            α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的 用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。

     

    9、系统测试的基本方法        

          9.1恢复测试

             恢复测试主要检查系统的容错能力。当系统出错时,能否在指定时间间隔内修正错误并重新启动系统。恢复测试首先要采用各种办法强迫系统失败,然后验证系统是否能尽快恢复。对于自动恢复需验证重新初始化(reinitialization)、检查点(checkpointing mechanisms)、数据恢复(data recovery)和重新启动 (restart)等机制的正确性;对于人工干预的恢复系统,还需估测平均修复时间,确定其是否在可接受的范围内。

          9.2安全测试

             安全测试检查系统对非法侵入的防范能力。安全测试期间,测试人员假扮非法入侵者,采用各种办法试图突破防线。例如,想方设法截取或破译口令;专门定做软件破坏系统的保护机制;故意导致系统失败,企图趁恢复之机非法进入;试图通过浏览非保密数据,推导所需信息,等等。理论上讲,只要有足够的时间和资源,没有不可进入的系统。因此系统安全设计的准则是,使非法侵入的代价超过被保护信息的价值。此时非法侵入者已无利可图。

          9.3强度测试

             强度测试检查程序对异常情况的抵抗能力。强度测试总是迫使系统在异常的资源配置下运行。例如,当中断的正常频率为每秒一至两个时,运行每秒产生十个中断的测试用例;定量地增长数据输入率,检查输入子功能的反映能力;运行需要最大存储空间(或其他资源)的测试用例;运行可能导致虚存操作系统崩溃或磁盘数据剧烈抖动的测试用例,等等。

    查看(757) 评论(4) 收藏 分享 管理

  • Rational Robot 初次使用指南

    2009-06-04 11:05:36

     Rational Robot简单的说是这样一个东西:它能记住你所有的操作(键盘和鼠标),并且不走样的再来一遍。

           我们先来看看传统的手工测试的过程。假设我们测试Windows自带的计算器应用程序。我们要验证“1+2=3”这么个简单的加法运算,看看计算器应用程序是否正确。我们用鼠标依次点击“1”,“+”,“2”,“ =”,然后我们用眼睛看结果栏里面是不是“3”,如果是,就OK,如果不是我们就要分析:是不是自己点错了?是不是别的误会?很有可能我们会重新再来一遍(因为这个操作并不复杂),最后我们确信地给出结论:“这个应用程序不能正确的算出1+2=3”,然后我们要做的事情是填写相关的报告,报告这个BUG。不久之后你得到了一个新的版本,然后你再重复上面的测试过程。不久之后,又来了个集成测试要求,要求你再做一遍,最后,发布前还有一次验收测试,对不起,你再来点一遍。哦,对了还要求对老版本Win95/98的支持,准备环境,再来几遍。。。
    好了,大家已经看到恶果了。但事实上我们要么就正在这么傻傻地做,要么就在偷工减料。随着迭代开发模式被广泛地采纳,测试被更加快速的要求重复着。因此,自动化测试有了它的用武之地。

           现在我们再来看看Rational Robot是怎样帮助我们节省时间的。我们用一次手工测试的时间(数量级的相同),记录一个GUI脚本,然后需要的时候就让它回放(Playback)一次。如果你说开发小组现在逻辑还没有完全实现,没关系,你自己心中肯定知道将来一定会实现1+2=3的,不会是别的东西,因为最原始的需求没有改变,我们就可以手工改写GUI脚本,将预期结果3记录下来。甚者,你说现在开发小组连界面都还没有完成,那你的要求就太过分了,没有办法去测是一个连基本输入输出都不能实现的东西,手工测试也不行啊。除此之外,我们还可以用数据池(Datapool)来给脚本“泵”数据,这样不单单测试了“1+2=3”,还可以测试“2+1=3”,“2+2=4”,如果愿意,我们可以让这个脚本把所有整数范围的加法一个不漏的全部执行一遍,计算机反正不知道累。

           上面的道理看上去很简单,但是这就是自动测试的精髓所在。但是人的活动是很复杂的,也就是说,手工测试有很高的权威性,因为不管什么软件,它最后的运行结果都是靠人来判定正确与否。所以,不管什么自动测试工具都只是一个子集,Rational Robot之所以很有名气,就是因为它比别的工具模仿手工测试模仿得更象一些。再加上Rational家族其它工具的配合,使我们整个的测试工作显得很有序。

           因此,我们学习Rational Robot的自动测试,我建议一切从我们的需求出发,每一个问题,我们都先考虑怎样手工来测试,然后我们去在Rational Robot中找替代物。比如说,例子中我们是用眼睛去看用脑子去判断是不是等于3,那Rational Robot就是靠捕获界面上那个文本框的属性(Object Properties)来判断的,换句话说,将我们手工测试中的每一个动作和每一个思考都“翻译”成Robot的方式。这样很快的我们就能上手用Robot了。再碰到一些棘手的问题,查看帮助也解决后,我们就能慢慢积累一些生僻的经验。你就成为Rational Robot自动测试高手了。最后,你还能用Robot提供的接口进行一些特殊功能的扩展开发,恭喜!你已经是Rational Robot自动测试专家了。

            在安装IBM Rational Robot后,往往很多朋友便急忙的打开Robot,想看看它的界面,可是发现出现的并不是他们实际相要的东西,Robot需要经过一定的配置之后,才能正常的投入到使用中去。本文是作者在一次项目实施中使用的配置,留给自己日后参考。

    在首次安装并倒入Licens后,首先会启动如下界面,但是我们会发现在Project中没有任何项目,而且我们也暂时无法获得admin用户的Password

    1,  首先,我们打开Rational Administrator

    开始- 所有程序- -IBM Rational- - Rational Administrator

    2,  新建一个项目:

    File- -New Project

    项目名称:MyRobotProject

    项目路径:C:\Documents and Settings\Administrator\My Documents\Rational Project\

    3,  点击下一步,弹出如下窗体,点击OK继续,不用理会:

       

    4,  直接点击下一步,暂时务须输入任何密码

    5,  点击完成

    6,  配置项目

    这里我们只对Test Assets做相关配置,其他请参考相关文档。

    因为实验环境,所以选择Microsoft Access作为Robot数据库。开始数据库的配置,请连续点击下一步。

    点击完成。

    Test Datastore成功创建。

    点击OK。Robot Project成功创建。

    7,  运行项目

    打开Robot,因为前面这里的密码设置为空,所以这里不用输入任何密码,你可以在登陆进后在菜单里面进行密码的设置。

    点击OK

    Robot启动界面如下,你就可以开始你的测试了:

    8,  开始一个项目的测试:

  • 黑盒功能测试(转载)

    2009-05-27 14:03:39

    功能测试用例设计积累(一):软件界面


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

      目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。

      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 )在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。

     

     

    功能测试用例设计积累(二):错误推测法分析与实践


    关键字:功能测试、测试用例、错误推测法

      1、方法定义:

      基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法。

      2、思路:

      分析程序中最易出错的场景和情况,在此基础上有针对性的设计测试用例。需要完成的前提条件如下:

      A、深度熟悉被测系统的业务、需求。

      B、对被测系统或类似系统之前的缺陷分布情况进行过系统的分析。包括功能缺陷,数据缺陷,接口缺陷和界面缺陷等等。

      3、测试用例举例

      (1)聊天窗口功能

      A、输入特殊字符(全角,半角)后,窗口是否能够正常显示

      B、输入空格,是否能够过滤,是否会算入长度计算

      C、输入html字符

      D、输入脚本语言函数

      E、在需要密码验证,或者需要二次输入确认的地方,通过复制粘贴第一次的输入内容是否能够通过

      (2)查询功能

      A、无条件查询

      B、是否支持模糊查询

      C、查询的关键字之间是否可用连接符

      D、输入正确的查询条件以前加上空格,看是否能正确地查出相应的数据

      (3)登录功能

      A、输入的数据前存在空格,是否能够正常登录

      B、输入的密码是否能够加密显示

      C、用户在注销之后是否能够再登录成功

      4、优缺点

      优点:充分发挥个人的经验和潜能,命中率高

      缺点:覆盖率难以保证;过多的依赖于个人的经验

     


    功能测试用例设计积累(三):正交表分析与实践


    关键字:功能测试、测试用例、正交表、正交试验法、软件测试方法

      OATS正交表测试策略

      在上面的文章中,Zee已详细讲述了正交试验设计方法的概念、优点以及如何将此方法运用到用例设计当中的具体步骤,这里不再赘述。

      由于在设计测试用例当中经常会用到这个方法,我把搜集到的几个文档放在这里。

      关注点:

      1、运用正交试验法设计测试用例时遇到的几种情况和解决方法:

      1)因素数、水平数与正交表相符

      2)因素数不同

      3)水平数不同

      2、用正交表设计测试用例的步骤:

      1)确定因素(变量)数

      2)确定每个因素的水平数

      3)选择一个合适的正交表,不同的正交表生成的用例数会有很大的差别。需要让正交表尽量和因素数和水平数吻合,因素数肯定是要一致,水平数要考虑出现最多的水平数

      4)将变量的具体取值映射到正交表中

      5)将每一行数据的组合抽取出来,形成测试用例

      6)再次分析(用错误推测法)可能需要测试的数据组合(查漏补缺),添加到测试用例当中

      3、正交表查询地址:

      http://www.york.ac.uk/depts/maths/tables/orthogonal.htm

     

    功能测试用例设计积累(四):在没有需求文档的情况下如何设计测试用例

     

      “测试用例应该依照需求文档来开发,但是我们的项目根本就没有需求文档?那测试用例该如何开发呢?”

      1、根据客户的功能点整理测试需求追朔表:

      一般的客户都要把要开发软件的功能点写成一个表格交给市场部,让市场部门转交研发部。所以客户的功能点是编写测试用例一个最最重要的依据。

      2、根据开发人员的Software Specification List整理我们的功能测试点:

      一般来说,开发人员实现一个功能都要把该功能分成几个子模块来实现,所以Software Specification List也是我们参考的另一个比较重要的依据。

      3、开展项目跨部门讨论会:

      可以抽出时间,叫市场部的项目负责人、产品经理、项目经理、软件开发经理和软件开发人员,分别讲讲他们对整个产品的认识和设计模式,对每个功能点的理解和认识,理顺思路,达成共识,测试人员负责记录,测试Leader负责整理汇总,形成测试的部分参考文档。

      4、测试人员整理用例需求疑问递交项目组和客户代表回复:

      测试人员根据项目讨论会后的理解,测试过程中可能碰到的问题(如:边界值、输入数据类型等等)和需求不明确的问题,整理用例需求疑问,让相关的模块负责人在“用例需求疑问”表格中回复,并给出详细解释和说明。

      5、项目内部用例评审:

      测试人员根据对项目的理解,编写测试用例要点,测试组内部评审修改后,可以召集项目组的成员,帮助Review一下,然后进行修改。经过多次修改和评审以后,测试用例要点可能会更加全面一些。

      6、邮件和客户代表确认部分争议问题:

      测试人员与开发人员、项目组成员,在需求问题上讨论有时候观点不一致,各说各有理,这种情况下最好把争议问题写成邮件,发给客户让客户来拍板,确定那种需求合理,到底如何做?抄送项目组的全体成员,方便大家都了解客户的意见。最后编写测试用例的时候,以客户的邮件内容为准。

      7、项目Demo和部分已开发系统:

      大部分的系统,由于没有需求,为了避免项目风险,开发方一般都要做成Demo,不断让客户确认后签字,不断展现新开发的功能,以达到吸引客户的目的。如果项目中有Demo,Demo也是参考标准。如果什么都没有,那已经开发的部分功能模块,要去随时让用户了解了解,并提出部分修改意见,也可以为我们熟悉系统提供部分依据。

      8、参考同行业和竞争对手的类似产品:

      假如说是做一个网上书店类似的网站,我们编写测试用例的时候,可以看看“当当网”,“China—pub”等等类似成熟相关的网站。很容易发现本公司产品的问题,无意识给产品添加了竞争力。对于竞争对手的了解一定不能够少。

      9、交叉模块的测试,最容易被人忽略:

      一般的产品,功能部分的交叉,即是说在A模块中设置了参数,在B模块和C模块中体现该参数的实际运用。比较难的如我们现在测试的“银行系统”中的交叉模块,还可能牵涉到不同的用户,3个以上的模块之间的调用。即是有了需求也很少写,同时也是需求编写的一个薄弱环节。这样的测试用例编写问题,一般初级测试工程师很难考虑全。对于有这种交叉功能的模块,必须要求项目组中的精兵强将,画出相关的调用关系图,表明调用关系,方便后面编写测试用例。

      10、可以使用电话、MSN、Skype等网络聊天工具咨询部分需求:

      我们做的产品,大多数的客户都在国外,测试经理也可以用这些网络聊天工具和客户确认部分需求疑问。不过要要事先越好时间,并注意异地的“时差”。

     

    功能测试用例设计积累(五):等价类划分法分析与实践


    关键字:功能测试、测试用例、等价类划分法

      1、方法定义:

      从软件测试的角度来说,等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭示程序中的错误都是等效的。等价类划分包含两个部分:有效等价类和无效等价类。

      1) 有效等价类

      是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。主要为了检验程序是否实现了规格说明中所规定的功能和性能。

      2) 无效等价类

      与有效等价类相反,主要为了程序的健壮性与可靠性。

      2、方法运用到用例设计中的思路:

      1) 根据需求说明书,把需要输入的数据划分成若干个子集合。在这里要确保两点:

      A、每个子集中的数据在测试过程中对于发现程序缺陷是有效的。

      B、每个子集中的数据在测试过程中对于发现程序缺陷是等效的。

      C、子集之间数据互不相交。

      2) 然后从每个集合中选择部分代表性数据形成测试用例中的输入数据。

      3) 覆盖所有有效的和无效的等价类

      3、确定等价类的原则

      1) 在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。

      例如:成年人每分钟的心跳60-100之间为正常。

      有效等价类:60-100 无效等价类:<60 和 >100

      2) 在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类。

      例如:用户连续输入错误密码的次数最多为3次。

      有效等价类:<=3次 无效等价类:>3次

      3) 在输入条件是一个布尔量的情况下,可确定一个有效等价类。

      例如:单选的选中与不选中。

      4) 在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。

      例如:输入数据为省份的选择。

      5) 在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。

      例如:规定必须输入非0的正整数。

      这种例子应充分考虑规则是否可以拆分为具有单一的子规则,然后得到从不同角度违反规则的无效等价类。

      该例子起码可拆分为非0、数字、正数、整数4个子规则,至少每个规则对应一个无效等价类,即0、字符串、负数、小数,甚至可挖掘出输入为空的隐含等价类。

      6) 在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。

      例如:核对日期的有效性,初步有效等价类是1<=Month<=12,1<=Day<=31

      可是考虑到2月以及闰年、闰月、长月、短月等,需要进一步细分,当然其中还涉及到了年月日组合的问题。

      4、测试用例举例

      竞猜系统中:投注的金额要求是大于10的正整数。

      根据分析等到以下等价类表。

    输入条件 有效等价类 无效等价类
    >10的正整数 大于10的正整数
    小数
    <10的数
    负数
    字符串

      5、优缺点

      优点:避免了盲目或随机选取输入数据的布完整性和覆盖的不稳定性

      缺点:没有对组合情况进行充分的考虑,需要结合其他测试用例设计的方法进行补充

     


    功能测试用例设计积累(六):在敏捷测试中如何设计用例


    关键字:功能测试、测试用例、敏捷测试

      敏捷宣言:

      个体和交互比过程和工具更有价值;

      能工作的软件比全面的文档更有价值;

      顾客的协作比合同谈判更有价值;

      及时响应变更比遵循计划更有价值。

      并非每个企业都能严格按敏捷的相关开发方法进行项目管理,例如测试驱动、XP、SCRUM等。也并非都需要按这些方式管理才能实现敏捷。只要我们理解了敏捷的原则和精髓,我认为很多方法、很多地方都可以应用敏捷的思想,实现敏捷的管理。测试用例的设计是其中一项。

      1、测试用例的粒度

      测试用例可以写得很简单,也可以写得很复杂。最简单的测试用例是测试的纲要,仅仅指出要测试的内容,如探索性测试(Exploratory Testing)中的测试设计,仅会指出需要测试产品的哪些要素、需要达到的质量目标、需要使用的测试方法等。而最复杂的测试用例就像飞机维修人员使用的工作指令卡一样,会指定输入的每项数据,期待的结果及检验的方法,具体到界面元素的操作步骤,指定测试的方法和工具等等。

      测试用例写得过于复杂或过于详细,会带来两个问题:一个是效率问题,一个是维护成本问题。另外,测试用例设计得过于详细,留给测试执行人员的思考空间就比较少,容易限制测试人员的思维。

      测试用例写得过于简单,则可能失去了测试用例的意义。过于简单的测试用例设计其实并没有进行“设计”,只是把需要测试的功能模块记录下来而已,它的作用仅仅是在测试过程中作为一个简单的测试计划,提醒测试人员测试的主要功能包括哪些而已。测试用例的设计的本质应该是在设计的过程中理解需求,检验需求,并把对软件系统的测试方法的思路记录下来,以便指导将来的测试。

      大多数测试团队编写的测试用例的粒度介于两者之间。而如何把握好粒度是测试用例设计的关键,也将影响测试用例设计的效率和效果。我们应该根据项目的实际情况、测试资源情况来决定设计出怎样粒度的测试用例。

      软件是开发人员需要去努力实现敏捷化的对象,而测试用例则是测试人员需要去努力实现敏捷化的对象。要想在测试用例的设计方面应用“能工作的软件比全面的文档更有价值”这一敏捷原则,则关键是考虑怎样使设计出来的测试用例是能有效工作的。

      2、基于需求的测试用例设计

      基于需求的用例场景来设计测试用例是最直接有效的方法,因为它直接覆盖了需求,而需求是软件的根本,验证对需求的覆盖是软件测试的根本目的。

      要把测试用例当成“活”的文档(Effective Software Testing : 50 Specific Ways to Improve Your Testing – Elfriede Dustin),因为需求是“活”的、善变的。因此在设计测试用例方面应该把敏捷的“及时响应变更比遵循计划更有价值”这一原则。

      不要认为测试用例的设计是一个阶段,测试用例的设计也需要迭代,在软件开发的不同的阶段都要回来重新审视和完善测试用例。

      3、测试用例的评审

      测试用例设计出来了,质量如何,如何提高测试用例设计的质量?就像软件产品需要通过各种手段来保证质量一样,测试用例的质量保证也需要综合使用各种手段和方法。

      测试用例的检查可以有多种方式,但是最敏捷的应当属临时的同行评审。我认为同行评审,尤其是临时的同行评审,应该演变成类似结对编程一样的方式。从而体现敏捷的“个体和交互比过程和工具更有价值”,要强调测试用例设计者之间的思想碰撞,通过讨论、协作来完成测试用例的设计,原因很简单,测试用例的目的是尽可能全面地覆盖需求,而测试人员总会存在某方面的思维缺陷,一个人的思维总是存在局限性。因此需要一起设计测试用例。

      除了同行评审,还应该尽量引入用户参与到测试用例的设计中来,让他们参与评审,从而体现敏捷的“顾客的协作比合同谈判更有价值”这一原则。这里顾客的含义比较广泛,关键在于你怎样定义测试,如果测试是对产品的批判,则顾客应该指最终用户或顾客代表(在内部可以是市场人员或领域专家);如果测试是指对开发提供帮助和支持,那么顾客显然就是程序员了。

      因此,参与到测试用例设计和评审中来的人除了测试人员自己和管理层外,还应该包括最终用户或顾客代表,还有开发人员。

      4、测试用例数据生成的自动化

      在测试用例设计方面最有希望实现自动化的,要当属测试用例数据生成的自动化了。因为设计方面的自动化在可想象的将来估计都很难实现,但是数据则不同,数据的组合、数据的过滤筛选、大批量数据的生成等都是计算机擅长的工作。

      很多时候,测试用例的输入参数有不同的类型、有不同的取值范围,我们需要得到测试用例的输入参数的不同组合,以便全面地覆盖各种可能的取值情况。但是全覆盖的值域可能会不可思议地广泛,我们又需要科学地筛选出一些有代表性的数据,以便减轻测试的工作量。在这方面可利用正交表设计数据或成对组合法设计数据。

      可利用一些工具,例如TConfig、PICT等来产生这些数据。

      在性能测试、容量测试方面,除了设计好测试用例考虑如何测试外,还要准备好大量的数据。大量数据的准备可以使用多种方式:编程生成、SQL语句生成(基于数据库的数据)、利用工具生成。

      工具未必能生成所有满足要求的数据,但是却是最快速的,编程能生成所有需要的数据,但是可能是最复杂、最慢的方式。所以应该尽量考虑使用一些简单实用的工具,例如DataFactory等。


     

  • 功能测试用例的设计方法

    2009-05-27 13:41:20

      软件测试功能测试用例的设计方法:

      1.等价类划分法:

      有效等价类:指输入完全满足程序输入的规格说明,是由有效且有意义的输入数据所构成的集合,利用有效等价类可以检验程序是否满足规格说明所规定的功能和性能。

      无效等价类:和有效等价类相反,即不满足程序输入要求或者由无效的输入数据构成的集合。

      2.边界值分析法:

      指对输入的边界条件进行分析,设计出针对边界值的测试用例

      数值的边界值检验

      字符的边界值检验

      如: ASCII和 Unicode编码方式

      其他边界值检验

      选上所有选项(最大值)

      不选上任何一项(空,零)

      只选一项 (最小值)

      3.因果图法:

      就是利用图解法分析软件输入(原因)和输出条件(结果)之间的关系,以设计测试用例的方法。因果图法适合于检查程序输入条件的多种情况的组合,并最终生成判定表,来获得对应的测试用例。

      4.功能图法:

      功能图是描述程序状态变化、转移的过程,因为软件运行或操作的过程可以看作是其状态不断发生变化的过程。测试用例的设计就是如何覆盖所有软件表现出来的状态,即在满足输入/输出的一组条件下,软件运行是一系列有次序的、受控制的状态变化过程。

      5.错误推测法:

      推测法主要依赖经验、直觉来作出简单的判断甚至是猜测,给出可能存在缺陷的条件、场景等,在找到缺陷后,设计出相应的测试用例。

      6.正交实验设计方法:

      主要步骤是:

      (1)对软件需求规格说明中的功能要求进行划分(层层分解与展开),分解成具体的、相对独立的基本功能。

      (2)根据基本功能的质量需求,找出影响其功能实现的操作对象和外部因素,每个因素的取值可以看作水平,多个取值就存在多个水平。

      (3)确定待测试软件中所有因素及其权值,这是测试用例设计的关键,确保全面、准确。

      权值是依据各因素的影响范围、发生的频率和质量的需求来确定的。

      (4)加权筛选,生成因素分析表。

      (5)利用正交表构造测试数据集,正交表的每一行,就是一条测试用例。考虑交互作用不可忽略的处理因素和不可混杂的原则,有交互作用的组合优先安排。

      利用正交实验设计方法设计测试用例,可控制生成的测试用例数量,覆盖率高且测试效率高。

  • 关于如何提高黑盒测试用例的覆盖度思路

    2009-05-27 13:37:54

     您在做测试设计时是否发现自己写的测试用例超多,但却发现不了几个bug?是否发现经过您的测试之后,还是有较多问题漏测试?本文将大概介绍一下如何避免此类问题的思路。

      当您拿接到一个产品/项目拿到需求后,您需要对这个产品的需求进行分析/分解,写出测试方案,然后根据测试方案写测试用例,这就是测试设计的流程。如何避免上面提到的问题,我们就得从需求-->方案-->用例一步一步来分析。

      拿到需求文档后,我们要分析此次的产品/项目 新增、修改、删除那些功能,修改、删除时对原来功能会有什么影响,此时您需要把功能及影响一条一条的列出。

      列出完之后,在方案时就得考虑各种不同的分析方法的应用了,如下:

      1、首先进行等价类划分,包括输入条件和输出条件的等价类划分,合理设置有效等价类和无效等价类,这是减少工作量和提高测试效率最有效的方法。

      2、必须使用边界值分析,经验表明,这种方法设计出的用例能发现很多程序错误。

      3、可以使用错误推测法追加一些测试用例,这需要依靠您的智慧和经验。

      4、对照程序逻辑检查已设计出的测试用例的逻辑覆盖度,如果没有达到覆盖标准应当再补充足够的测试用例。

      5、如果程序的功能说明中含有输入条件的组合情况,一开始就可选因果图和判定表驱动法。

      6、对于参数配置类的软件,要用正交试验法选择较少的组合方式达到最佳效果。

      7、对于业务流清晰的系统,可以利用场景法贯穿整个测试方案过程,在案例中综合使用各种测试方法。

  • 一个B/S架构的页面性能测试框架(转载)

    2009-04-30 09:21:01

    之前做过一个框架是由一个excel表来控制性能监控的运行以及运行参数,并且把测试结果也保存excel表中。这样做的优点在于框架简单,需要投入的时间少。但是,由于对excel的读写操作有着速度较慢,需要多处定位等问题存在,感觉不是很好,因此进行重新做了这个B/S架构的框架。

      我是这样做的:

      1、获取数据:

      使用ruby调用httpwatch,进行修改,已达到自己需要的需求,获取页面性能的数据(整体页面下载时间,各页面元素的下载时间)。这里的修改是要注意的,我就在这遇到过有些页面要采集数据,有些不需要采集,而ie浏览器是不能改变的,因此需要对其做不少修改。

      首先,由于之后一连串的页面监控都需要在一个ie中实现(涉及到登录权限等操作),因此先新建一个ie_init的方法来初始化ie:

    def ie_init
    @ie = Watir::IE.new
    end

      然后把打开url的方法分为2种,其中1个为需要进行采集页面性能数据及页面元素参数的方法open_page(link),1个位不需要进行采集数据,只是普通操作的方法gotourl(link)。其中,open_page这个方法,需要调用httpwatch控件,同时要加入连接数据库的一个文件oracle(自己写,调用dbi.rb即可,主要内容为往数据库插采集下来的数据),代码很简单:

    def insert1(字段)
    dbh = DBI.connect('DBI:OCI8:SID', 用户名, 密码)
    sql1 = sql
          dbh.do(sql1,字段)
    dbh.commit
    dbh.disconnect

      上面是插入操作,所以需要commit,其他的一些如更新等也需要,其他如select则不需要。

      数据采集是在原有的基础上自己加需要的,我加了很多需要的数据,然后将采集下的数据存入oracle中。

      最后加一个ie_close方法来关闭ie。

      2、数据存储及分析:

      把这些采集到的数据都写入oracle数据库(需要安装oci8,我用的oracle版本是10g),在数据库建立2张关联的表,一张用来存放整个性能点的数据,如url、总体的下载时间、错误数、发送及接收到的字节数等。一张表用来存放每个监控点的页面元素信息(这个量是很大的,往往一个页面一次会下载 60-200个左右的页面元素,一次运行下来,性能点多些的话,就有几千个数据,每5-10分钟自动运行一次,一天下来的量…………嘿嘿,不少吧),主要是些采集时间(这个是和前面一张表关联的字段)、元素链接、元素的下载时间、元素开始下载的时间(在分析性能问题的时候很有用)、httpcode、元素类型(对页面调优、瘦身等意义很大)。

      3、数据展现:

      当ruby与oracle都弄好了,进行调试,需要的数据都进入数据库了,那么接下来就开始做页面客户端了。为什么要用页面客户端呢?在web上,人人都可以访问你的结果页面,鼠标轻点,就可以自动生成自己想要的图表数据。我使用的是tomcat,配置起来超级简单。图表生成我用的是open- flash-chart-1.9.7,这个东东做出来的图表很好看,也比较好用,鼠标垫在曲线上,可以显示出该点数据。总而言子,易用又美观。还有一点要注意的是,数据列表展现的时候,一定要做分页。否则一大堆数据显示出来,你的浏览器要卡死的(特别是现实页面元素,那个恐怖啊,我吃亏过)。

      4、自动执行自动化脚本:

      自动化脚本如何进行自动执行呢?我这里提供了2种方法:

      1)把自动化脚本做成一个exe文件,然后通过页面调用这些exe文件来进行执行,具体方法如下

      Runtime runtime = Runtime.getRuntime();

      runtime.exec("D:/fun2.exe");

      2)将自动化脚本放置在windows自带的计划任务中,设置好后可以循环执行。

     

     

  • 做好测试计划和测试用例的工作的关键(转载)

    2009-04-23 13:07:44

    测试的流程中,测试计划是对整个测试活动的安排,而测试用例则是测试执行的指导,但是,现在仍然有很多的测试人员没有认识到测试计划和测试用例的重要性,在项目时间比较紧张的情况下,计划和用例往往成了形式上的东西,甚至有些测试人员脱离用例,完全凭借自己的经验在执行测试活动,对此,你有什么样的看法?

    OMV r[(bU0

      这个问题问的非常好,也确实是很多人有过切肤之痛的问题,对我来说,我也一直在苦苦追寻这个问题的答案,现在我不能说完全找到了,只能说把自己的心得分享一下,希望大家的测试计划和测试用例不再是一个摆设。51Testing软件测试网:qvbcR&h f9P

    (一)  先说测试计划吧51Testing软件测试网.L vXSH(cb-Z

    诚如magic_zhu所言,现在很多测试人员没意识到测试计划的重要性,很多时候测试计划成为一纸空文,其根本原因在于测试计划缺乏可执行性,也正是因为测试计划缺乏可执行性,导致下一次写计划的时候非常草率,甚至不写,就算写了也是一个花架子应付领导,这样形成了一个恶性循环,久而久之,测试计划纯属一个摆设,我们很多从业者不写测试计划,其理由是反正写了也不能按照计划执行,这种理由真的很荒唐可笑,这是典型的因噎废食,因为你的计划执行性差就不写?这样只能使测试更加失去控制,使你的测试过程彻底无计划,无目标,变成一个放任主流的状态,完全没有受控性。这样的产品质量保证显然是空谈。51Testing软件测试网/Y1YIFQt-s4J:F{5_

    我觉得这个问题的解决方案不是不写,而是想办法写得更好,更有实效性,执行性。这个是问题的关键。

    /TN7F2}eN;a#EI `|q ?0

    一个好的测试计划是用来计划测试的,指导整个测试过程。所以一个好的测试计划一定是可以指导测试的,就是对整个测试过程中的人力,时间,资源,策略,范围的一个说明。51Testing软件测试网0e8VG\aa!sBM

    作为一个测试计划来讲,核心的三个要素是时间,资源,范围。(这句话摘自微软软件测试培训材料),时间就是什么时候做以及要花多久做,资源就是你要调用的人力、机器等资源,范围是你要测试的东西以及测试重点。

    k'N7NBPg0

    除以上提到的3项之外,还有比较重要的项目有策略(具体就是怎么测)、风险控制(一旦有问题采取什么应急措施)等项目。

    F$f | br)Uo6L`0

    要把一个计划做得很有实用性,按照笔者的经验,要注意以下几个方面:51Testing软件测试网-rm{V3}z:y*R

    a.  上面提到的三要素不能少51Testing软件测试网v+Q|3W#}n0Go(c/F'i4C

    b.  测试策略一定要交待清楚,就是大概怎么测试51Testing软件测试网SA:b"K`b'i

    c.  需要其他人员(部门)协调的,要交待清楚51Testing软件测试网'N x.j(ul p;wz

    d.  在估计测试所需的时间、人力及其它资源时,尽量做到客观、准确、留有余地,特别是估计开发时间和debug时间,以及要对自己的执行用例速度,回归速度心里有数51Testing软件测试网 j@ b\D3F

    e.  测试计划中每个阶段要明确表明,并且测试阶段的输入、输出文档要清楚51Testing软件测试网p"~'ge'S7XJ

    f.  测试计划中的时间段不宜太长(最好以day为单位),太长就比较模糊,不好度量,不好check51Testing软件测试网'N-}5a7s7@|*Q

    g.  一定要有风险控制,要不然计划缺乏可执行性51Testing软件测试网.^4EY5| ^ G5w.S-O

    h.  计划写完之后不是装在兜里,要组织PMDev进行评审51Testing软件测试网)us-XO ~ Z2Zbh[

    i.  要不断更新计划,记住:每个计划都是动态的,不是一成不变的51Testing软件测试网5NTu$jL"l2jS S

    (二)  再说测试用例

    Fx(`UYSZW ]U0

    和测试计划一样,测试用例很多时候也沦为形式,这是软件测试的可悲之处,软件测试的依据就是测试用例,如果用例弃之不用,你凭什么做好测试?这个很可笑。但是实际测试过程中很多时候测试用例并没用到实处,笔者认为还是用例实用性问题,有的时候用例洋洋洒洒数万字,到回归测试的时候根本用不上,至于如何选择回归测试用例,我曾经写过另一篇文章,欢迎查阅。51Testing软件测试网G p!`o_Oig D

    下面我就个人体会谈谈做好测试用例的关键。51Testing软件测试网k.n0B1MeU7e

    首先,在做用例之前,要做两件事情。

    .G"z'h+Q t2c9X.|4w0

    第一,  透彻了解程序(需求和架构)。51Testing软件测试网Lv_/xnr(L

    第二,  做一个正式的测试设计(最好文档化)。然后再开始写用例。一般写用例的步骤和建房子一样,先搭框架,然后填材料,填材料的时候,主要根据需求做相关的设计,具体的设计方法就是那几种(郑老的书上写的很清楚)51Testing软件测试网Bu$tn-_1s

    一般来说,设计一个比较实用的测试用例,注意如下几个方面:51Testing软件测试网M)wP&P4}

    a.  选用好的用例管理工具(这个很重要,千万不要用wordexcel

    bX0Y"|cxu0f0

    b.  用例一定要及时更新(补充新的想法,删除过时的需求)

    v:}{"Zl+`;s*ix"i0

    c.  做好用例分级

    "V#sn c2Q)`0

    d.  做好用例评审,写用例之前可以征询相关人员的意见51Testing软件测试网Up_o"Wv XZ

    e.  可以考虑结对编写,这个是不错的主意51Testing软件测试网&uqDFF/Tpp

    f.  要全面,包括功能、性能、兼容性、安全性、易用性、容错性等等

    7L*jX$^4R%n r0

    g.  注意把握适当的颗粒度

  • WEB测试总结(架构、设计)

    2009-01-02 16:09:27

     1、总计架构测试

      1)瘦客户端,业务逻辑规则多数在服务器端执行。如新闻站点、门户网站、信息发布网站等。

      2)胖客户端,安全性要求较高、交互操作频繁、业务逻辑复杂。银行系统、网络游戏、网上办公系统等。

      2、Web架构组成部分是否满足需求

      成本、功能、安全性要求、容量要求、传输实时性。

      3、服务器配置分布是否满足要求

      Web服务器、应用服务器、数据库服务器可以分布在不同物理机器上也可以分布相同的物理机器上,一般优先考虑独立数据库服务器,Web服务器、应用服务器可以在相同的机器上。

      4、客户端设计测试

      1)功能设置测试:信息服务、办公自动化、Internet支持;

      2)信息组织结构测试:线性结构、分层结构、非线性结构;

      3)页面设计测试:

      a) 页面一致性测试

      b) 用户界面友好性及导航直观性测试;、

      c) 是否适合多种浏览器;

      d) 页文件的命名;

      e) 页面布局技术。

      5、服务器端设计测试

      1)容量规划测试:点击率、延迟和流量、服务器资源;

      2)系统安全测试

      a) 常识性安全策略,取消不必要的协议、控制写权限、取消服务器目录浏览属性、记录日志等;

      b) 使用加密技术;

      c) 构造防火墙,网络级、应用级、电路级;

      d) 构建网络防毒体系。

      3)数据库设计测试。

      6、Web开发测试

      1)源代码分析,主要是使用检查工具来完成;

      2)链接测试,主要借助工具来完成;

      3)框架测试:

      a) 自动调整窗口大小;

      b) 是否提供滚动条;

      c) 打开新页面是否正常。

      4)表格测试,随窗体变化自动调整大小;

      5)图形测试:

      a) 颜色饱和度及对比度;

      b) 链接标识;

      c) 图形显示是否正确。

      7、与一般应用软件相比,Web测试有以下区别:

      第一、Web测试的侧重点是性能、安全、易用性、兼容

      第二、测试工具有所不同,如链接测试、表单测试、界面测试

      8、功能测试

      1)客户端的选择,优先测试流行的客户客户端;

      2)客户端浏览器的配置

      3)客户端的显示设置

      4)内容测试

      9、链接测试

      1)该链接将用户带到它所说明的地方

      2)被链接的页面是存在的

      3)保证没有孤立页面

      工具有WEBCHECK、LINKBOT、TESTPARTNER、XENU等

      10、链接测试工具的优势:

      1)简单易用

      2)在实现上采用多线程技术,检查速度特别快;

      3)对断开的链接可以再次测试,可以避免误判;

      4)没有检查链接的数量限制,只受系统资源的约束;

      5)可以分析Web应用的结构;

      6)检查结果可以分类查看,自动生成HTML格式的报告;

      11、Web应用链接主要测试点如下

      1)测试内部链接和外部链接中成功和失败的链接点,以及应用中不被其他链接调用的页面;

      2)测试链接中新网页、老网页、慢网页以及丢失的图象标题标签和属性标签等;

      3)分析Web应用的结构是否合理,包括显示和某个URL相关的链接以及按照标题、描述、作者、大小、最后修改时间、类型为URL链接分类等。

      12、易用性测试

      易用性测试要考虑以下几个方面:

      1)用户的计算机使用经验;

      2)用户对浏览器以及Web的使用经验;

      3)用户的业务专业知识。

      13、Web系统的易用性测试分为三个方面:

      1)界面测试

      2)辅助功能测试

      3)图形测试

      ● 界面测试要考虑以下几个问题

      A.WEB应用系统的最终用户群是谁?

      B.WEB应用界面的设计策略是什么?

      C.页面中各元素布局的协调性

      a) 各元素位置的协调性

      b) 各元素颜色的协调性

      c) 各元素大小比例的协调性

      D.不同页面风格的统一性

      E.用户在界面中操作的便利性

      F.界面动态操作测试

      a) 屏幕分辩率设置的影响

      b) 浏览窗口最大化/最小化的影响

      c) 选定目标元素的置中与缩放

      ● 辅助功能测试

      A.使用说明,这个没有多大意义,WEB网页按F1弹出来的页面都是IE的帮助页面,除非有特定的帮助说明内容

      B.导航功能

      C.站点地图

      D.帮助,这个没有多大意义,WEB网页按F1弹出来的页面都是IE的帮助页面,除非有特定的帮助说明内容

     

  • 数据库测试

    2008-11-21 15:56:40

    数据库测试
       随着软件业的迅猛发展,我们的开发也从以前的单层结构进入了三层架构甚至现在多层架构的设计,而数据库从以前一个默默无闻的后台仓库,逐渐成为了数据库系统,而数据库开发设计人员成为了炙手可热的核心人员。以前我们往往把数据库操作写在应用层,从而提高各个模块的独立性和易用性,而现在越来越多的数据库操作被作为存储过程直接放在数据库上进行执行来提高执行效率和提高安全性。

      数据库开发既然在软件开发的比重逐步提高,随之而来的问题也突出。我们以前往往重视对代码的测试工作,随着流程技术的日益完善,软件质量得到了大幅度的提高,但数据库方面的测试仍然处于空白。我们从来没有真正将数据库作为一个独立的系统进行测试,而是通过对代码的测试工作间接对数据库进行一定的测试。随着数据库开发的日益升温,数据库测试也需要独立出来进行符合自身特点的测试工作。数据库开发和应用开发并没有实质上的区别,所以软件测试的方法同样适用于数据库测试。

      从测试过程的角度来说我们也可以把数据库测试分为:

      系统测试

      传统软件系统测试的测试重点是需求覆盖,而对于我们的数据库测试同样也需要对需求覆盖进行保证。那么数据库在初期设计中也需要对这个进行分析,测试.例如存储过程,视图,触发器,约束,规则等我们都需要进行需求的验证确保这些功能设计是符合需求的.另一方面我们需要确认数据库设计文档和最终的数据库相同,当设计文档变化时我们同样要验证改修改是否落实到数据库上。

      这个阶段我们的测试主要通过数据库设计评审来实现。

      集成测试

      集成测试是主要针对接口进行的测试工作,从数据库的角度来说和普通测试稍微有些区别对于数据库测试来说,需要考虑的是:

      数据项的修改操作;
      数据项的增加操作;
      数据项的删除操作;
      数据表增加满;
      数据表删除空;
      删除空表中的记录;
      数据表的并发操作;
      针对存储过程的接口测试;
      结合业务逻辑做关联表的接口测试;
      同样我们需要对这些接口考虑采用等价类、边界值、错误猜测等方法进行测试。

      单元测试

      单元测试侧重于逻辑覆盖,相对对于复杂的代码来说,数据库开发的单元测试相对简单些,可以通过语句覆盖和走读的方式完成系统测试相对来说比较困难,这要求有很高的数据库设计能力和丰富的数据库测试经验。而集成测试和单元测试就相对简单了。

      而我们也可以从测试关注点的角度对数据库进行分类:

      功能测试
      对数据库功能的测试我们可以依赖与工具进行。

      DBunit
      一款开源的数据库功能测试框架,可以使用类似与Junit的方式对数据库的基本操作进行白盒的单元测试,对输入输出进行校验。

      QTP
      大名鼎鼎的自动测试工具,通过对对象的捕捉识别,我们可以通过QTP来模拟用户的操作流程,通过其中的校验方法或者结合数据库后台的监控对整个数据库中的数据进行测试。个人觉得比较偏向灰盒。

      DataFactory
      一款优秀的数据库数据自动生成工具,通过它你可以轻松的生成任意结构数据库,对数据库进行填充,帮助你生成所需要的大量数据从而验证我们数据库中的功能是否正确。这是属于黑盒测试

      数据库性能

      虽然我们的硬件最近几年进步很快,但是我们需要处理的数据以更快的速度在增加。几亿条记录的表格在现在是司空见惯的,如此庞大的数据量在大量并发连接操作时,我们不能像以前一样随意的使用查询,连接查询,嵌套查询,视图,这些操作如果不当会给系统带来非常巨大的压力,严重影响系统性能。

      性能优化分4部分:

      1.物理存储方面
      2.逻辑设计方面
      3.数据库的参数调整
      4.SQL语句优化

      我们如何对性能方面进行测试呢,业界也提供了很多工具。

      通过数据库系统的SQL语句分析工具,我们可以分析得到数据库语句执行的瓶颈,从而优化SQL语句。

      Loadrunner
      这个不用多说,我们可以通过对协议的编程来对数据库做压力测试。

      Swingbench(这是一个重量级别的feature,类似LR,而且非常强大,只不过专门针对oracle而已)

      数据库厂商也意识到这点,例如:

      oracle11g已经提供了real application test,提供数据库性能测试,分析系统的应用瓶颈。

      还有很多第三方公司开发了SQL语句优化工具来帮助你自动的进行语句优化工作从而提高执行效率。

      安全测试

      软件日益复杂,而数据又成为了系统中重中之重的核心,从以往对系统的破坏现在更倾向于对数据的获取和破坏。而数据库的安全被提到了最前端。自从SQL 注入攻击被发现,冒失万无一失的数据库一下从后台变为了前台,而一旦数据库被攻破,整个系统也会暴露在黑客的手下,通过数据库强大的存储过程,黑客可以轻松的获得整个系统的权限。而SQL的注入看似简单缺很难防范,对于安全测试来说,如何防范系统被注入是测试的难点。业界也有相关的数据库注入检测工具,来帮助用户对自身系统进行安全检测。

      对于这点来说业界也有标准,例如ISO IEC 21827,也叫做SSE CMM 3.0,是CMMISO的集成的产物,专门针对系统安全领域的另外一方面,数据库的健壮性,容错性和恢复能力也是我们测试的要点,我们也可以发现功能测试,性能测试,安全测试,是一个由简到繁的过程,也是数据库测试人员需要逐步掌握的技能,这也是以后公司对数据库测试人员的要求.

  • QuickTest Professional 9.2介绍及下载

    2008-11-20 18:14:03

    Mercury QuickTest Professional™是一款先进的自动化测试解决方案,用于创建功能和回归测试。它自动捕获、验证和重放用户的交互行为。

    Mercury QuickTest Professional为每一个重要软件应用和环境提供功能和回归测试自动化的行业最佳解决方案。

    QuickTest Professional是新一代自动化测试解决方案,采用了关键词驱动(Keyword-Driven)测试的理念,能完全简化测试的创建和维护工作。QuickTest关键词驱动方式独有之处在于,测试自动化专家可以通过一个整合的脚本和纠错环境,拥有对基础测试脚本和对象属性的完全访问权限,这些脚本和纠错环境与关键词视图(Keyword View)可以互为同步。

    QuickTest Professional同时满足了技术型和非技术型用户的需求,让各个公司有能力部署更高质量的应用,同时部署的速度更快,费用更低,风险也更小。QuickTest Professional和我们新的测试自动化系统Mercury Business Process Testing™的紧密结合,可以将非技术型的业务专家(SME, Subject-Matter Experts)引入质量流程,这一意义重大的引入可以将IT和业务更好地融合,最终建立起更出色的应用。

    有了该产品,您的QA机构可以获取多方面的优势:
            用最少的培训赋予整个小组创建成熟测试方案的能力。
            确保跨所有环境、数据包和业务流程的正确功能点。
            为开发人员全面记录和复制缺陷,使他们能更快地修复缺陷,满足最后上线期限。
            对不断变化的应用和环境展开便捷的回归测试。
            成为帮助整个机构实现高质量产品和服务、提高总收入和收益率的关键角色。

    QuickTest Professional是如何工作的
    QuickTest Professional易于操作,即使是初级的测试人员也能在短时间内对其驾轻就熟。您可以使用无需脚本的关键词视图来表现测试的每个步骤,仅由此就可创建一个测试。您还可以通过QuickTest Professional所集成的录制能力来捕获测试步骤。该产品用简单的英语以文档形式记录每个步骤,并通过活动屏幕将文档与一个集成截屏相结合。传统的脚本记录工具所生产的脚本不易修改,与此不同的是,QuickTest Professional的关键词驱动方式能让您便捷地插入、修改、数据驱动(data-drive)和移除测试步骤。

    QuickTest Professional可以自动引入检查点来验证应用的属性和功能点,比如确认输出量或检查链接的有效性。在关键词视图的每一步骤中,活动屏幕可显示被测应用在该步骤中的确切状态。您还可以为任意对象加入几种检查点,仅仅在活动屏幕中点击该对象,就可以验证该组件行为是否达到了期望值。

    然后您可以将测试数据输入数据表(Data Table),它拥有和Excel同样完善的功能特性,是一个集成的电子数据表格。您可以使用数据集并创建多种重复测试,无需编程就可以扩展测试案例的覆盖面。数据可以通过键入的方式输入或从数据库、数据表格或文本文档中导出。

    高级测试人员可以在专家视图(Expert View)中查看和修改他们的测试,在专家视图中显示了由QuickTest Professional自动生成的基于行业标准的基本VBscrīpt语言。在专家视图中所做的任何改动将自动与关键词视图同步。

    一旦测试人员运行了一个脚本,TestFusion报告将显示测试运行各方面的信息,包括:高水平的结果纵览;一个可扩展的测试脚本树状视图(Tree View),其明确指出了应用错误的发生位置;被使用的测试数据;每个步骤的应用截屏,其中并标明了所有的差异;以及通过或未通过每个检查点的详细解释。您可以将TestFusion报告和QuickTest Professional结合,从而与整个QA和开发小组分享这些报告。

    QuickTest Professional处理一些应用的新版本问题。当一个被测应用发生变化时,比如把一个”Login”按钮被改名为”Sign in”,您可以在共享对象容器(Shared Object Repository)中做一次更新,接着此次更新将扩展到所有涉及这个对象的脚本。您可以将测试脚本公布给Mercury Quality Management,使其它的QA小组成员也可以使用您的测试脚本,从而减少了重复工作。

    通过与Business Process Testing的整合,在一个基于Web的系统中,QuickTest Professional被用于实现自动化操作,使非技术型用户可以便捷地在一个完全的无脚本环境中也能够建立起测试。

    QuickTest Professional支持多种企业环境的功能测试,包括Windows、Web、.NET、 Java/J2EE、SAP、Siebel、Oracle、PeopleSoft、Visual Basic、ActiveX、Mainframe terminal emulators和Web services。

    Mercury功能测试
    那些在Mercury WinRunner®测试工具上投入大量资金,并想转入Mercury QuickTest Professional™的用户,可以使用Mercury Functional Testing™来实现这种转变。Mercury Functional Testing将QuickTest Professional和WinRunner结合成一种集成产品,它不仅可以使用WinRunner脚本,也可以使用QuickTest Professional脚本,使测试资源得到极大地利用。质量工程师可以使用Mercury Functional Testing来创建“复合脚本”测试,这些脚本是在WinRunner和QuickTest Professional中建立的。Mercury Functional Testing是WinRunner和QuickTest Professional的集成,产品间可以相互调用脚本,测试结果可以在一个共有的报告界面上呈现。

    Mercury质量中心的组成部分之一
    Mercury QuickTest Professional是Mercury质量中心(Mercury Quality Center™)的组成部分之一,Mercury质量中心集成了一整套软件、服务和最佳实践,用于自动化关键质量活动,包括需求管理、测试管理、缺陷管理、功能测试和业务流程测试。

    特点和优势
            具有行业 Mercury QuickTest Professional™是一款先进的自动化测试解决方案,用于创建功能和回归测试。它自动捕获、验证和重放用户的交互行为。

    Mercury QuickTest Professional为每一个重要软件应用和环境提供功能和回归测试自动化的行业最佳解决方案。

    QuickTest Professional是新一代自动化测试解决方案,采用了关键词驱动(Keyword-Driven)测试的理念,能完全简化测试的创建和维护工作。QuickTest关键词驱动方式独有之处在于,测试自动化专家可以通过一个整合的脚本和纠错环境,拥有对基础测试脚本和对象属性的完全访问权限,这些脚本和纠错环境与关键词视图(Keyword View)可以互为同步。

    QuickTest Professional同时满足了技术型和非技术型用户的需求,让各个公司有能力部署更高质量的应用,同时部署的速度更快,费用更低,风险也更小。QuickTest Professional和我们新的测试自动化系统Mercury Business Process Testing™的紧密结合,可以将非技术型的业务专家(SME, Subject-Matter Experts)引入质量流程,这一意义重大的引入可以将IT和业务更好地融合,最终建立起更出色的应用。

    有了该产品,您的QA机构可以获取多方面的优势:
            用最少的培训赋予整个小组创建成熟测试方案的能力。
            确保跨所有环境、数据包和业务流程的正确功能点。
            为开发人员全面记录和复制缺陷,使他们能更快地修复缺陷,满足最后上线期限。
            对不断变化的应用和环境展开便捷的回归测试。
            成为帮助整个机构实现高质量产品和服务、提高总收入和收益率的关键角色。

    QuickTest Professional是如何工作的
    QuickTest Professional易于操作,即使是初级的测试人员也能在短时间内对其驾轻就熟。您可以使用无需脚本的关键词视图来表现测试的每个步骤,仅由此就可创建一个测试。您还可以通过QuickTest Professional所集成的录制能力来捕获测试步骤。该产品用简单的英语以文档形式记录每个步骤,并通过活动屏幕将文档与一个集成截屏相结合。传统的脚本记录工具所生产的脚本不易修改,与此不同的是,QuickTest Professional的关键词驱动方式能让您便捷地插入、修改、数据驱动(data-drive)和移除测试步骤。

    QuickTest Professional可以自动引入检查点来验证应用的属性和功能点,比如确认输出量或检查链接的有效性。在关键词视图的每一步骤中,活动屏幕可显示被测应用在该步骤中的确切状态。您还可以为任意对象加入几种检查点,仅仅在活动屏幕中点击该对象,就可以验证该组件行为是否达到了期望值。

    然后您可以将测试数据输入数据表(Data Table),它拥有和Excel同样完善的功能特性,是一个集成的电子数据表格。您可以使用数据集并创建多种重复测试,无需编程就可以扩展测试案例的覆盖面。数据可以通过键入的方式输入或从数据库、数据表格或文本文档中导出。

    高级测试人员可以在专家视图(Expert View)中查看和修改他们的测试,在专家视图中显示了由QuickTest Professional自动生成的基于行业标准的基本VBscrīpt语言。在专家视图中所做的任何改动将自动与关键词视图同步。

    一旦测试人员运行了一个脚本,TestFusion报告将显示测试运行各方面的信息,包括:高水平的结果纵览;一个可扩展的测试脚本树状视图(Tree View),其明确指出了应用错误的发生位置;被使用的测试数据;每个步骤的应用截屏,其中并标明了所有的差异;以及通过或未通过每个检查点的详细解释。您可以将TestFusion报告和QuickTest Professional结合,从而与整个QA和开发小组分享这些报告。

    QuickTest Professional处理一些应用的新版本问题。当一个被测应用发生变化时,比如把一个”Login”按钮被改名为”Sign in”,您可以在共享对象容器(Shared Object Repository)中做一次更新,接着此次更新将扩展到所有涉及这个对象的脚本。您可以将测试脚本公布给Mercury Quality Management,使其它的QA小组成员也可以使用您的测试脚本,从而减少了重复工作。

    通过与Business Process Testing的整合,在一个基于Web的系统中,QuickTest Professional被用于实现自动化操作,使非技术型用户可以便捷地在一个完全的无脚本环境中也能够建立起测试。

    QuickTest Professional支持多种企业环境的功能测试,包括Windows、Web、.NET、 Java/J2EE、SAP、Siebel、Oracle、PeopleSoft、Visual Basic、ActiveX、Mainframe terminal emulators和Web services。

    Mercury功能测试
    那些在Mercury WinRunner®测试工具上投入大量资金,并想转入Mercury QuickTest Professional™的用户,可以使用Mercury Functional Testing™来实现这种转变。Mercury Functional Testing将QuickTest Professional和WinRunner结合成一种集成产品,它不仅可以使用WinRunner脚本,也可以使用QuickTest Professional脚本,使测试资源得到极大地利用。质量工程师可以使用Mercury Functional Testing来创建“复合脚本”测试,这些脚本是在WinRunner和QuickTest Professional中建立的。Mercury Functional Testing是WinRunner和QuickTest Professional的集成,产品间可以相互调用脚本,测试结果可以在一个共有的报告界面上呈现。

    Mercury质量中心的组成部分之一
    Mercury QuickTest Professional是Mercury质量中心(Mercury Quality Center™)的组成部分之一,Mercury质量中心集成了一整套软件、服务和最佳实践,用于自动化关键质量活动,包括需求管理、测试管理、缺陷管理、功能测试和业务流程测试。

    特点和优势
            具有行业领先的便于使用的特性,以及支持提前配置环境的功能,确保了快速的投资回报。
            可独立运行,也可以同Mercury Business Process Testing和Mercury质量中心集成。
            引进了QuickTest Professional 8.0中新一代的“零配置”关键词驱动测试技术,从而实现了快速建立测试、测试脚本更易维护,和更强大的数据驱动能力。
            使用独特智能对象识别(Unique Smart Object Recognition)来发现对象,即使对象创建不断在改变,但仍可保证无监控方式脚本执行的可靠性。
            恢复管理器(Recovery Manager)可处理不可预知的应用意外事件,实现24x7的不间断测试,赶上测试项目的最后期限。
            自动文档技术把测试文档的建立与测试脚本的建立同步。
            通过集成的数据表,可数据驱动任意对象、方式、检查点和输出值。
            为QA工程师提供全面的集成开发环境。
            通过使用QuickTest Professional和WinRunner集成的TSL资源,使您在Mercury WinRunner测试脚本上的投资得以保值。
            TestFusion报告可快速隔离和诊断缺陷。
            通过完善检查点,实现应用的全面验证。 
    领先的便于使用的特性,以及支持提前配置环境的功能,确保了快速的投资回报。
            可独立运行,也可以同Mercury Business Process Testing和Mercury质量中心集成。
            引进了QuickTest Professional 8.0中新一代的“零配置”关键词驱动测试技术,从而实现了快速建立测试、测试脚本更易维护,和更强大的数据驱动能力。
            使用独特智能对象识别(Unique Smart Object Recognition)来发现对象,即使对象创建不断在改变,但仍可保证无监控方式脚本执行的可靠性。
            恢复管理器(Recovery Manager)可处理不可预知的应用意外事件,实现24x7的不间断测试,赶上测试项目的最后期限。
            自动文档技术把测试文档的建立与测试脚本的建立同步。
            通过集成的数据表,可数据驱动任意对象、方式、检查点和输出值。
            为QA工程师提供全面的集成开发环境。
            通过使用QuickTest Professional和WinRunner集成的TSL资源,使您在Mercury WinRunner测试脚本上的投资得以保值。
            TestFusion报告可快速隔离和诊断缺陷。
            通过完善检查点,实现应用的全面验证。 
  • 成功的 Web 应用系统性能测试

    2008-11-20 16:36:59

    性能测试是 Web 应用系统的一项重要质量保证措施。在现实中,很多 Web 性能测试项目由于性能测试需求定义不合理或不明确,导致性能测试项目不能达到预期目标或进度超期。本文针对 Web 应用系统的技术架构和系统使用特点,探讨如何有效实施性能测试过程,并重点介绍如何分析获得合理的性能测试需求,最终对 Web 应用系统性能进行科学、准确的评估。
    1 引言
    基于Web服务器的应用系统由于提供浏览器界面而无须安装,大大降低了系统部署和升级成本,得以普遍应用。目前,很多企业的核心业务系统均是Web应用,但当Web应用的数据量和访问用户量日益增加,系统不得不面临性能和可靠性方面的挑战。因此,无论是Web应用系统的开发商或最终用户,都要求在上线前对系统进行性能,科学评价系统的性能,从而降低系统上线后的性能风险。
    在很多性能测试项目中,由于不能合理定义系统的性能测试需求,不能建立和真实环境相符的负载模型,不能科学分析性能测试结果,导致性能测试项目持续时间很长或不能真正评价系统性能并提出性能改进措施。
    本文在总结许多Web应用系统性能测试实践经验和教训的基础上,从与性能测试工具无关的角度介绍Web应用系统性能测试的方法和实施过程,以及如何定义合理的性能测试需求。
    1.1 术语定义
    性能测试:通过模拟大量浏览器客户端同时访问Web服务器,获得系统的性能数据。
    虚拟用户:模拟浏览器向Web服务器发送请求并接收响应的一个进程或线程。
    响应时间:浏览器向Web服务器提交一个请求到收到响应之间的间隔时间。
    思考时间:浏览器在收到响应后到提交下一个请求之间的间隔时间。
    请求成功率:Web服务器正确处理的请求数量和接收到的请求数量的比。
    吞吐量:单位时间内Web服务器成功处理的HTTP页面或HTTP请求数量。
    在线用户:用户通过浏览器访问登录Web应用系统后,并不退出该应用系统。通常一个Web应用服务器的在线用户对应Web应用服务器的一个Session。
    并发用户数:Web服务器在一段时间内为处理浏览器请求而建立的HTTP连接数或生成的处理线程数。当所有在线用户发送HTTP请求的思考时间为零时,Web服务器的并发用户数等于在线用户数。
    1.2 Web应用系统技术架构
    Web应用系统的前端为浏览器,后台为Web服务器(如Apache,Microsoft Internet Information Server),浏览器和Web服务器之间的交互基于HTTP协议。HTTP协议本身是无连接的,Web服务器通过Session机制来建立一个浏览器所发出的先后连接之间的关联。通过实验证明,当浏览器客户端在首次访问Web服务器后,如果该浏览器客户端不发送后续请求,服务器维持该浏览器客户端的Session变量所消耗的系统资源非常小。
    2 Web应用系统性能测试过程
    标准的Web应用系统性能测试过程包括确定性能测试需求,开发性能测试脚本,定义性能测试负载模型,执行性能测试和形成性能测试报告。本章将分别介绍上述过程,并通过举例说明如何完成每一环节。
    2.1 确定性能测试需求
    科学定义Web应用系统性能测试需求对一个成功的性能测试非常重要。通常,Web应用系统的性能测试需求有如下两种描述方法。
    2.1.1 基于在线用户的性能测试需求
    该需求描述方法主要基于Web应用系统的在线用户和响应时间来度量系统性能。当Web应用系统在上线后所支持的在线用户数以及操作习惯(包括操作和请求之间的延迟)很容易获得,如企业的内部应用系统, 通常采用基于在线用户的方式来描述性能测试需求。以提供网上购物的Web应用系统为例,基于在线用户的性能测试需求可描述为:10个在线用户按正常操作速度访问网上购物系统的下定单功能,下定单交易的成功率是100%,而且90%的下定单请求响应时间不大于8秒;当90%的请求响应时间不大于用户的最大容忍时间20秒时,系统能支持50个在线用户。
    2.1.2 基于吞吐量的性能测试需求
    该需求描述方法主要基于Web应用系统的吞吐量和响应时间来度量系统性能。当Web应用在上线后所支持的在线用户无法确定,如基于Internet的网上购物系统,可通过每天下定单的业务量直接计算其吞吐量,从而采取基于吞吐量的方式来描述性能测试需求。以网上购物系统为例,基于吞吐量的性能测试需求可描述为:网上购物系统在每分钟内需处理10笔下定单操作,交易成功率为100%,而且90%的请求响应时间不大于8秒。
    2.2 开发性能测试脚本
    在确定Web应用系统性能测试需求后,就要根据性能测试需求中确定的功能开发性能测试脚本。比如,针对前面定义的网上购物系统的性能测试需求,将开发下定单功能的性能测试脚本。
    性能测试脚本是描述单个浏览器向Web服务器发送的HTTP请求序列。每个性能测试工具(如IBM Rational Performance Tester, LoadRunner)所提供的测试脚本语法是不同的。测试人员利用性能测试工具可从头手工编写测试脚本,也可以通过录制浏览器和Web服务器之间的网络通信数据而自动形成测试脚本。
    任何性能测试工具都不能保证录制形成的性能测试脚本的正确性,测试人员应通过在单用户下运行性能测试脚本对其正确性进行验证。测试脚本不正确的一个重要原因就是脚本的数据关联不正确,也就是并没完全建立一个测试请求和前面的响应内容之间的关联。测试脚本HTTP请求和响应之间的数据关联是否正确的一个重要标准是单用户运行脚本,脚本能完成期望的功能。
    在完成性能测试脚本的数据关联后,需要对脚本进行参数化,也就是把脚本中的某些请求数据替换成变量,变量的值来于一个独立的数据文件,从而保证在多虚拟用户运行脚本的情况下,每个虚拟用户所提交的数据是不同的。
    此外,为了测试Web应用的可靠性,还需要对请求所收到的响应进行验证(比如验证响应的HTTP返回码或验证响应的内容),便于性能测试完成后统计请求成功率。
    2.3 建立性能测试负载模型
    性能测试负载模型定义了测试工具如何向Web应用系统提交请求,包括向Web应用系统发送请求的虚拟用户数,每个虚拟用户发送请求的速度和频率。针对前面介绍的网上购物系统的性能测试需求,在性能测试工具中定义的性能测试负载模型应包括如下信息:
    虚拟用户数:性能测试不仅仅是执行一次,而且每次执行时虚拟用户数也不固定,因此在性能测试负载模型中定义的虚拟用户数将在测试执行时进行设置。
    虚拟用户发送请求的思考时间和迭代次数:虚拟用户发送请求的思考时间长短是决定Web应用系统负载量的重要因素之一,而迭代次数将决定性能测试的执行持续时间。对基于在线用户的性能测试需求,将基于录制脚本时记录的思考时间,而且由于现实中不同用户访问系统的思考时间不同,可把思考时间设置为在一定范围内的随机值。对于基于吞吐量的性能测试需求,将把思考时间设置为零,此时Web应用系统的在线用户数量将等于并发用户数。同时,为了避免性能测试压力的随机性,将增加请求的迭代次数来增加测试执行持续时间,从而获得系统在稳定压力下的性能数据。
    虚拟用户启动模式:在现实中,Web应用系统的用户不太可能同时做相同的操作,因此为了让Web应用系统所承担的压力随时间均匀分布,建议虚拟用户依次启动,同时也避免大量用户同时登录造成系统阻塞。以10个虚拟用户模拟下定单为例,可设置每个虚拟用户间隔30秒启动,这样10个虚拟用户可在5分钟后完成启动,并保证10个虚拟用户不会在同一时刻下定单,从而更符合实际情况。
    2.4 执行性能测试
    执行性能测试是指通过多次运行性能测试负载模型,获得系统的性能数据。在执行过程中,需利用测试工具、操作系统、系统软件(如Web Server或DB Server)提供的资源监控手段对资源进行监控和分析,帮助发现资源瓶颈,并在系统层面进行优化。同时,还需对应用进行性能分析,帮助定位应用代码中的性能问题,切实解决系统的性能问题。
    2.5 形成性能测试报告
    性能测试项目的最后阶段就是向相关人员提交性能测试报告,汇报性能测试结果。在向相关人员汇报性能测试结果时,并不是性能测试报告越丰富、性能数据越多越好。好的性能测试报告是能准确、简单地传递性能测试结论,而不需太多的技术细节。
    针对基于在线用户数的性能测试需求,可通过下图总结性能测试结论。其中横轴是在线用户数,纵轴是响应时间,如40在线用户访问网上购物系统时,90%的下定单请求响应时间不超过10秒。
    图一:在线用户数和响应时间时间的趋势图
    针对基于吞吐量的性能测试需求,可通过下图的曲线来描述性能测试结果。以网上购物系统为例,下图描述下定单的并发用户、下定单响应时间以及吞吐量(服务器每秒处理定单笔数)之间的关系,从而快速判断系统是否能满足性能测试需求。从下图中可看出,并发用户增加,请求的响应时间也增加。服务器的吞吐量是先随并发用户数增加而增加,当吞吐量到达一定峰值后,再增加并发用户数,吞吐量会减少。原因在于当并发用户数少时,向Web服务器提交的请求量不大,服务器处理能力还有富余,所以吞吐量逐步增大;但当并发用户数超过某一值时,由于向服务器提交的请求太多,造成服务器阻塞,反而导致吞吐量减少。
    图二:响应时间、吞吐量和并发用户数的趋势图

    3 如何获取合理的性能测试需求
    前一章介绍了Web应用系统的性能测试过程,确定性能测试需求是整个性能测试的起点和成功的重要因素。性能测试需求定义得过高,虽然确保系统上线后能满足性能需求,但可能会造成硬件资源的浪费;性能测试需求定义得过低,系统上线后可能会出现性能问题。如何通过分析系统上线后可能的用户访问行为,来获得合理的性能测试需求指标呢?
    假设现有一个基于Web的办公自动化系统(简称OA系统),该系统提供公文收发和查询功能。在部署该系统前,将对该系统进行性能测试。下面将详细介绍如何分析该OA系统的使用情况,定义合理的性能测试需求。
    3.1 如何获得OA系统的在线用户数量
    在线用户数量是指在特定时间区间内,有多少用户访问Web应用系统(对应到Web服务器的Session数),根据系统可能访问用户数以及每个用户访问系统的时间长短来确定。
    对于将要部署的OA系统,通过分析获得该系统有8000个注册用户,基本上所有的用户每天(8小时工作时间)都会访问OA系统,平均在线时间(从登录OA系统到退出OA系统之间的时间间隔,也可以是多次在线时间的合计)为12分钟,那么该OA系统的平均在线数(也就是Web应用Session变量数)为200个(8000 * 0.2 / 8),假设峰值在线用户数是平均在线用户数的3倍(该倍数可根据实际情况调整),则性能测试需求的在线用户数为600。
    3.2 如何确定OA系统的性能测试用例
    由于时间和资源限制,不可能对Web应用系统的所有功能进行性能测试,而是从业务的角度(如某一功能操作的用户多)和技术的角度(如某一功能虽然访问用户不多,但内部处理逻辑复杂或处理数据量大)来选择Web应用系统的特定功能作为性能测试用例。
    以OA系统为例,由于所有用户都经常公文查询功能,因此确定的性能测试用例为公文查询。
    3.3 如何确定OA系统的响应时间
    响应时间的快慢直接影响了系统使用用户的满意度,采用平均响应时间来描述系统系统性能测试需求是不科学的,因为无法直接和客户的满意度挂钩。而且,在做性能测试,如果某一请求的响应时间过长或过短,将导致平均响应时间和实际情况偏离。
    以OA系统为例,定义的响应时间需求为:90%(该百分比和要求的系统用户满意度相关)的查询请求响应时间不超过8秒(该时间可根据实际情况确定)。
    3.4 如何确定OA系统的交易吞吐量
    单位时间内Web应用系统需处理多少笔特定的交易可通过统计获得。以OA系统为例,假设每个用户每天(一天按8小时计算)平均会查询公文4次,那OA应用的Web服务器平均每分钟要能处理8000 * 4 / ( 60 * 8 ) = 66.67笔查询公文交易,考虑到峰值因素,要求每分钟能处理66.7 * 3=200笔查询公文交易。
    3.5 OA系统性能测试需求描述
    通过前面的分析,能明确定义合理的性能测试需求。OA系统性能测试需求定义如下:
    基于在线用户数的性能测试需求:600个在线用户按正常操作速度访问OA系统的查询公文功能,所有查询请求的成功率是100%,而且90%的查询请求响应时间不大于8秒。
    基于吞吐量的性能测试需求:OA系统在每分钟内需处理200笔查询公文操作,交易成功率为100%,而且90%的请求响应时间不大于8秒。
    4 总结
    Web应用性能测试项目成功的关键不在于性能测试工具,而在于有效的性能测试分析方法和实践。只有切实掌握性能测试需求分析方法,性能测试实践经验,才能保证一个Web应用性能测试的成功
     
  • Web网站测试技术要领集合

    2008-11-04 14:41:31

       基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。

      本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。

      随着Internet和Intranet/Extranet的快速增长,Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上,电子商务迅速增长,早已超过了国界。范围广泛的、复杂的分布式应用正在Web环境中出现。Web的流行和无所不在,是因为它能提供支持所有类型内容连接的信息发布,容易为最终用户存取。

      Yogesh Deshpande和Steve Hansen在1998年就提出了Web工程的概念。Web工程作为一门新兴的学科,提倡使用一个过程和系统的方法来开发高质量的基于Web的系统。它"使用合理的、科学的工程和管理原则,用严密的和系统的方法来开发、发布和维护基于Web的系统"。目前,对于web工程的研究主要是在国外开展的,国内还刚刚起步。

      在基于Web的系统开发中,如果缺乏严格的过程,我们在开发、发布、实施和维护Web的过程中,可能就  会碰到一些严重的问题,失败的可能性很大。而且,随着基于Web的系统变得越来越复杂,一个项目的失败将可能导致很多问题。当这种情况发生时,我们对Web和Internet的信心可能会无法挽救地动摇,从而引起Web危机。并且,Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。

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

      一般软件的发布周期以月或以年计算,而Web应用的发布周期以天计算甚至以小时计算。Web测试人员必须处理更短的发布周期,测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。

      网站测试流程、要求及测试报告

      一个网站基本完工后,需要通过下面三步测试才可以交活。

      一、 制作者测试,包括美工测试页面、程序员测试功能。在做完后第一时间内有制作者本人进行测试。

      a) 页面 包括首页、二级页面、三级页面的页面在各种常用分辨率下有无错位;图片上有没有错别字;各连接是否是死连接;各栏目图片与内容是否对应等

      b) 功能 达到客户要求;数据库连接正确;各个动态生成连接正确;传递参数格式、内容正确;试填测试内容没有报错;页面显示正确

      二、 全面测试 根据交工标准和客户要求,由专人进行全面测试

      也是包括页面和程序两方面,而且要结合起来测,保证填充足够的内容后不会导致页面变形。另外要检查是否有错别字,文字内容是否有常识错误。

      三、 发布测试 网站发布到主服务器之后的测试,主要是防止环境不同导致的错误

    软件缺陷的原则

      软件缺陷区别于软件bug,它是在测试过程中出现的对系统有影响的,但是在设计中没有的或者对修改后的bug测试和开发人员有不同意见等;
      软件未达到产品说明书标明的功能;
      软件出现了产品说明书指明不会出现的错误;
      软件功能超出产品说明书指明范围;
      软件未达到产品说明书虽未指出但应达到的目标;
      <a href="http://www.51testing.com/" target="_blank">软件测试</a>员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。

      测试的主要方面:

      一、功能测试

      对于网站的测试而言,每一个独立的功能模块需要单独的测试用例的设计导出,主要依据为《需求规格说明书》及《详细设计说明书》,对于应用程序模块需要设计者提供基本路径测试法的测试用例。

      1、链接测试

      链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面:

      1)测试所有链接是否按指示的那样确实链接到了该链接的页面;

      2)测试所链接的页面是否存在;

      3)保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

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

      Xenu------主要测试链接的正确性的工具

      可惜的是对于动态生成的页面的测试会出现一些错误。

      2、表单测试

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

      要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

      B/S结构实现的功能可能主要的就在这里,提交数据,处理数据等如果有固定的操作流程可以考虑自动化测试工具的录制功能,编写可重复使用的脚本代码,可以在测试、回归测试时运行以便减轻测试人员工作量。

      我们对UM子系统中各个功能模块中的各项功能进行逐一的测试,主要测试方法为:边界值测试、等价类测试,以及异常类测试。测试中要保证每种类型都有2个以上的典型数值的输入,以确保测试输入的全面性。

      3、Cookies测试

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

      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作而且对这些信息已经加密。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。

      4、设计语言测试

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

      5、数据库测试

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

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

    二、性能测试

      网站的性能测试对于网站的运行而言异常重要,但是目前对于网站的性能测试做的不够,我们在进行系统设计时也没有一个很好的基准可以参考,因而建立网站的性能测试的一整套的测试方案将是至关重要的。

      网站的性能测试主要从三个方面进行:连接速度测试、负荷测试(Load)和压力测试(Stress),

      连接速度测试指的是打开网页的响应速度测试。负荷测试指的是进行一些边界数据的测试,压力测试更像是恶意测试,压力测试倾向应该是致使整个系统崩溃。

      1、连接速度测试

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

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

    2、负载测试

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

      3、压力测试

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

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

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

      采用的测试工具:

      性能测试可以采用相应的工具进行自动化测试,我们目前采用如下工具

      ab -----Apache 的测试工具

      OpenSTA—开发系统测试架构

    三、接口测试

      在很多情况下,web 站点不是孤立。Web 站点可能会与外部服务器通讯,请求数据、

      验证数据或提交订单。

      1、 服务器接口

      第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器

      记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。

      2、 外部接口

      有些 web 系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行

      为的发生。测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡, 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别,例如 3 表示 American Express,4 表示 Visa,5 表示 Mastercard,6 代表Discover。)通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。

      3、错误处理

      最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错

      误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?

      订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服

      务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果

      用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致

      电用户进行订单确认。

    四、可用性测试

      可用性/易用性方面目前我们只能采用手工测试的方法进行评判,而且缺乏一个很好的评判基准进行,此一方面需要大家共同讨论。

      1、导航测试

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

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

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

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

      2、图形测试

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

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

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

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

      (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。

      3、内容测试

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

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

      4、整体界面测试

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

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

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

    五、兼容性测试

      需要验证应用程序可以在用户使用的机器上运行。如果您用户是全球范围的,需要测试各种操作系统、浏览器、视频设置和 modem 速度。最后,还要尝试各种设置的组合。

      1、平台测试

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

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

      2、浏览器测试

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

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

      采用测试工具:

      通过白盒测试或者黑盒测试导出的测试用例,采用相应的工具进行测试,可以采用OpenSTA进行测试,此测试工具可以采用不同的浏览器进行测试。

      3.视频测试

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

      4.Modem/连接速率测试

      是否有这种情况,用户使用 28.8 modem下载一个页面需要 10 分钟,但测试人员在测

      试的时候使用的是 T1 专线? 用户在下载文章或演示的时候,可能会等待比较长的时间,

      但却不会耐心等待首页的出现。最后,需要确认图片不会太大。

      5、打印机测试

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

      6、组合测试

      最后需要进行组合测试。600x800 的分辨率在 MAC 机上可能不错,但是在 IBM 兼容

      机上却很难看。在 IBM 机器上使用 Netscape 能正常显示,但却无法使用 Lynx 来浏览。

      如果是内部使用的 web 站点,测试可能会轻松一些。如果公司指定使用某个类型的浏览器,

      那么只需在该浏览器上进行测试。如果所有的人都使用 T1 专线,可能不需要测试下载施加。

      (但需要注意的是,可能会有员工从家里拨号进入系统) 有些内部应用程序,开发部门可能

      在系统需求中声明不支持某些系统而只支持一些那些已设置的系统。但是,理想的情况是,

      系统能在所有机器上运行,这样就不会限制将来的发展和变动。

    六、安全测试

      Web应用系统的安全性测试区域主要有:

      1、 目录设置

      Web 安全的第一步就是正确设置目录。每个目录下应该有 index.html 或 main.html 页

      面,这样就不会显示该目录下的所有内容。如果没有执行这条规则。那么选中一幅图片,单击鼠标右键,找到该图片所在的路径"…com/objects/images"。然后在浏览器地址栏中手工输入该路径,发现该站点所有图片的列表。这可能没什么关系。但是进入下一级目录 "…com/objects" ,点击 jackpot。在该目录下有很多资料,其中有些都是已过期页面。如果该公司每个月都要更改产品价格信息,并且保存过期页面。那么只要翻看了一下这些记录,就可以估计他们的边际利润以及他们为了争取一个合同还有多大的降价空间。如果某个客户在谈判之前查看了这些信息,他们在谈判桌上肯定处于上风。

      2.登录

      现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。

      3.Session

      Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。

      4.日志文件

      为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。

      5.加密

      当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。

      6.安全漏洞

      服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。

      目前网络安全问题日益重要,特别对于有交互信息的网站及进行电子商务活动的网站尤其重要。目前我们的测试没有涵盖网站的安全性的测试,我们拟定采用工具来测定,

      工具如下

      SAINT------- Security Administrator’s Integrated Network Tool

      此工具能够测出网站系统的相应的安全问题,并且能够给出安全漏洞的解决方案,不过是一些较为常见的漏洞解决方案。

    七、代码合法性测试

      代码合法性测试主要包括2个部分:程序代码合法性检查与显示代码合法性检查。

      1、程序代码合法性检查

      程序代码合法性检查主要标准为《intergrp小组编程规范》,目前采用由SCM管理员进行规范的检查,未来期望能够有相应的工具进行测试。

      2、显示代码合法性检查

      显示代码的合法性检查,主要分为Html、Javascrīpt、Css代码检查,目前采用

      HTML代码检查------采用CSE HTML Validator进行测试

      Javascrīpt、Css也可以在网上下载相应的测试工具。

      八、 文档测试

      l、产品说明书属性检查清单

      1)完整.是否有遗漏和丢失,完全吗? 单独使用是否包含全部内容

      2)准确.既定解决方案正确吗? 目标明确吗? 有没有错误?

      3)精确、不含糊、清晰.描述是否一清二楚? 还是自说自话?容易看懂和理解吗?

    4)一致.产品功能能描述是否自相矛盾,与其他功能有没有冲突

      5)贴切.描述功能的陈述是否必要?有没有多余信息? 功能是否原来的客户要求?

      6)合理.在特定的预算和进度下,以现有人力,物力和资源能否实现?

      7)代码无关.是否坚持定义产品,而不是定义其所信赖的软件设计,架构和代码

      8)可测试性.特性能否测试? 测试员建立验证操作的测试程序是否提供足够的信息?

      2、 产品说明书用语检查清单

      1)说明。 对问题的描述通常表现为粉饰没有仔细考虑的功能----可归结于前文所述的属性.从产品说明书上找出这样的用语,仔细审视它们在文中是怎样使用的.产品说明书可能会为其掩饰和开脱,也可能含糊其词----无论是哪一种情况都可视为软件缺陷.

      2)总是,每一种,所有,没有,从不.如果看到此类绝对或肯定的,切实认定的叙述,软件测试员就可以着手设计针锋相对的案例.

      3)当然,因此,明显,显然,必然.这些话意图诱使接受假定情况.不要中了圈套.

      4)某些,有时,常常,通常,惯常,经常,大多,几乎.这些话太过模糊."有时"发生作用的功能无法测试.

      5)等等,诸如此类,依此类推.以这样的词结束的功能清单无法测试.功能清单要绝对或者解释明确,以免让人迷惑,不知如何推论.

      6)良好,迅速,廉价,高效,小,稳定.这些是不确定的说法,不可测试.如果在产品说明书中出现,就必须进一步指明含义.

      7)已处理,已拒绝,已忽略,已消除.这些廉洁可能会隐藏大量需要说明的功能.

      8)如果...那么...(没有否则).找出有"如果...那么..."而缺少配套的"否则"结构的陈述.想一想"如果"没有发生会怎样.

      相关的测试工具

      OpenSTA

      主要做性能测试的负荷及压力测试,使用比较方便,可以编写测试脚本,也可以先行自动生成测试脚本,而后对于应用测试脚本进行测试。

      SAINT

      网站安全性测试,能够对于指定网站进行安全性测试,并可以提供安全问题的解决方案。

      CSE HTML Validator

      一个有用的对于HTML代码进行合法性检查的工具

      Ab(Apache Bench)

      Apache自带的对于性能测试方面的工具,功能不是很多,但是非常实用。

      Crash-me

      Mysql自带的测试数据库性能的工具,能够测试多种数据库的性能。

     

  • 281/212>