发布新日志

  • 软件测试级别

    2012-05-01 13:44:47

      不同的软件开发生命周期的测试级别有所不同,典型的V型模型中涉及的测试级别有组件测试、集成测试、系统测试、验收测试。
    一、组件测试:
      1、含义:针对单个软件单元的测试都可以称为组件测试(根据开发人员和编程语言不同,软件单元可以是模块、单元、程序或功能)。
      2、在组件测试过程中,经常会用到桩、驱动器、模拟器。
         桩:一个软件组件框架的实现或者特殊目的的实现,用于开发和测试另一个调用或依赖于该组件的组件,它代替了被调用的组件。桩用来模拟被测试模块工作过程中所调用的模块,它们一般进行很少的数据处理。
         驱动器:代替某个软件组件了模拟控制和/或调用其他组件或系统的软件或测试工具。驱动器用来模拟或被测模块的上级模块,它接收测试数据,把相关数据传送给被测试模块,启动被测试模块,并打印相应结果。
         模拟器:测试时所使用的设备,计算机程序或者系统,当提供一套控制的输入集时,它们的行为或运行于给定的系统相似。
      3、组件测试包括功能测试和特定的非功能测试,例如:资源行为测试(内存泄露)、健壮性测试、基于结构的测试(如分支覆盖)等。组件测试的设计输入主要是单元详细规格说明、软件设计规格说明或数据模型等。
      4、在写代码之前就开始准备测试和自动化测试用例是组件测试常用的一种方法,称之为测试驱动的方法或测试驱动开发。
      5、组件测试的任务包括:模块局部数据结构测试,模块参数边界值测试,模块中所有独立执行路径测试,以及模块的各条错误处理路径测试等。
      6、测试环境:当程序代码编写完成并通过评审和编译检查后,便可开始组件测试。对于这个测试级别,测试是在于开发紧密合作的情况下进行的,通常有开发人员自己来执行组件测试。组件测试主要采用白盒测试方法,通常从程序内部结构出发设计测试用例。
         由于测试残垣模块可能并不能形成一个完整的可测试系统,因此在组件测试过程中,可能需要为测试模块开发驱动器和桩模块。驱动器和桩模块式测试过程中使用的软件,不是软件产品的组成部分,也是需要开发费用的。
      7、组件测试中需要考虑各方面的因素,如下:
        第一、检查单元模块自己的接口相关的参数,是组件测试的基础。
        第二、检查局部数据结构,用来保证临时存储在模块内的数据在程序执行过程中的完成、正确。
        第三、在模块中应对每一条独立执行路径进行测试,组件测试的基本任务是保证模块中每条路径至少执行一次。
        第四、比较、判断与控制流常常紧密相关。
        第五、好的软件设计应能预见各种出错条件,并预设各种出错处理路径,出错处理路径同样需要认真测试。
    二、集成测试
      1、定义:集成测试也叫组装测试、联合测试,是一种旨在暴漏接口以及集成组件/系统间交互时存在缺陷的测试。是组件测试的逻辑扩展,其关注点是对组件之间的接口进行测试,以及检查与系统其它部分相互作用的测试。如操作系统,文件系统,硬件或系统之间的接口。
      2、根据不同的测试对象规模,可分为组件集成测试和系统集成测试。
         组件集成测试对不同的软件组件之间的相互作用进行测试,一般在组件测试之后进行。
         系统集成测试对不同系统之间的相互作用进行测试,一般在系统测试之后进行。系统集成测试的范围越大,对缺陷的定位越困难,从而增加了系统的风险,为了降低在软件开发生命周期后期发现严重缺陷而产生的风险,集成程度应该逐步增加。
      3、集成测试感兴趣的应该是两个模块的接口,而不是两个模块本身的功能,黑河测试和白盒测试的方法都可以应用在集成测试上。
      4、测试对象:应该是已经经过组件测试的软件单元,集成测试的一句是软件的概要设计规格说明。
      5、测试目的:集成测试的主要测试内容有功能性、可靠性、易用性、效率、可维护性和可移植性。
      6、集成策略:非渐增式集成测试模式和渐增式基层测试模式,具体包括自底向上集成,自顶向下集成,核心系统先行集成,随意集成。
    三、系统测试
      1、含义:将已经集成好的软件系统作为计算机系统的一部分,与计算机系统硬件、某些支持软件、数据和人员等系统元素结合起来,在实际运行环境下对计算机系统进行一系列严格有效的测试。
      2、测试环境:在集成测试完成后,系统已经完全组合起来后进行,应该在尽可能和目标运行环境一致的情况下进行。
      3、测试目的:是确认整个系统是否满足了系统需求规格说明中的功能和非功能需求,以及满足程度。
      4、常见系统测试包括:压力测试、容量测试、性能测试、安全测试、容错测试等。
    四、验收测试
    1、基本含义:通常有使用系统的用户来进行测试,目的是确保系统功能、系统的某部分或特定的系统非功能特征满足验收准则,发现缺陷不是验收测试的主要目标。
    2、验收测试主要类型:根据合同的验收测试、用户验收测试、运行(验收)测试、现场测试。
    五、维护测试
      1、含义:软件被市场接受后,在运行一段时间后,需要做某些修正、改变或扩展的情况下进行的维护测试,维护测试是在一个运行的系统上进行的。
     
  • 软件测试基础之软件生命周期模型中的测试

    2012-05-01 13:32:58

        对于测试而言,不管采用何种软件开发生命周期的模型,一个好的测试都应该具备以下特点:
        1、每个开发活动都用对应的测试活动
        2、每个测试级别都有其特有的测试目标
        对于每个测试级别,需要在对应的开发活动过程中进行对应的测试分析和设计
     
       
  • 软件测试基础之软件生命周期模型之增量迭代模型

    2012-05-01 12:42:33

    增量迭代模型
    一、特点
    1、允许需求的变化
    2、集成不是在项目后期进行的“大动作”
    3、早期的迭代可以降低风险
    4、对产品的管理能够采取战术性的变化
    5、重用更加容易
    6、在每一个迭代中发现并更正错误
    7、更好地利用项目的人力资源
    8、团队成员技能得到不断提高
    9、不断改进开发过程
     
    二、常见的增量迭代模型包括:螺旋模型、RUP(Rational Unified Process)和敏捷开发。
    1、螺旋模型:兼顾了快速原型迭代的特征以及瀑布模型的系统化与严格监控。
       1.1 特点:在于引入了其它模型不具备的风险分析,使软件在无法排除重大风险时有机会停止,以减小损失。在每个替代阶段构建原型是螺旋模型用以减小风险的途径。螺旋模型更适合大型的系统级的应用软件。
       1.2 一个典型的迭代包括以下步骤:
           明确本次迭代的目标、备选方案以及应用备选方案的限制。
           对备选方案进行评估,明确并解决存在的风险,建立原型。
           当分先得到很好的评估与解决后,应用瀑布模型进行本次迭代的开发与测试。
           对下一次迭代进行计划于部署。
           项目利益相关者对本次迭代的交付物进行评审,同时检查下一阶段的计划。
        1.3 优点
           风险低
           可以演化成瀑布模型
           可以在项目前期考虑对已经存在的软件进行重用
           在软件产品开发过程中考虑了软件质量目标
           关注于缺陷预防,并能够尽早地发现缺陷
           更好地控制项目活动的资源和相关成本
        1.4 缺点
           过分依赖风险评估,一旦在风险管理过程中出现偏差,讲造成重大的损失
           过于灵活的开发过程不适合开发者与客户之间有明确合同约定的情况
           该模型本身的文档和推广需要大量的工作量
    2、RUP模型:是有IBM开发和维护的过程产品
        2.1 整个开发过程可以用二维结构来表达,横轴代表了制定开发过程的时间,体现了过程的动态结构,纵轴表示九个核心工作流程,代表了所有角色和活动的逻辑分组情况。 
        2.2 将整个软件开发生命周期划分为四个阶段
            初始阶段:目标是为系统建立商业案例和确定项目的边界。
            精化阶段:目标是分析问题领域,建立健全的体系结构基础,编制项目计划,淘汰项目中最高风险的元素。
            构建阶段:所有涉及的构件和应用程序功能被开发集成为产品,并想尽测试所有的功能。
            产品化阶段:是将软件产品交付给用户群体
    3、敏捷开发
        3.1 开发宣言
            个体和交互胜过过程和工具
            可以工作的软件胜过面面俱到的文档
            客户合作胜过合同谈判
            响应变化胜过遵循计划
        3.2 特征
            最优先要做的是通过尽早地、持续地交付有价值的软件来使客户满意
            即使到了开发的后期,也欢迎需求的变更,敏捷开发利用变化为客户创造竞争优势。
            不断地交付可以工作的软件,交付的间隔可以从几周到几个月,交付的时间间隔越短越好。
            在整个项目开发生命周期,业务人员和开发人员必须天天都在一起工作
            围绕被激励起来的个人来构建项目,给他们提供所需要的环境和支持,并且信任他们能够完成工作
            在团队内部,最具有效果并且富有效率的传递信息的方法就是面对面的交谈
            能够工作的软件是首要的进度度量标准
          敏捷开发提倡可持续的开发速度,责任人、开发者和用户应该能够保持一个长期的、恒定的开发速度
            简单是根本
            不断地关注优秀的技能和好的设计会增强敏捷能力
            最好的构架、需求和设计出自于组织的团队
            每个一定时间,团队会在如何才能跟有效地工作方面进行反省,然后相应的对自己的行为进行调整。 
  • 界面测试经验总结(引用)

    2009-08-30 23:02:01

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 软件测试用例设计应该避免的几个误区

    2009-08-30 22:59:22

    1、能发现到目前为止没有发现的缺陷的用例是好的用例

    其实这句话是十分有道理的,但我发现很多人都曲解了这句话的原意,一心要设计出发现“难于发现的缺陷”而陷入盲目的片面中去,忘记了测试的目的所在,这是十分可怕的。我倾向于将测试用例当作一个集合来认识,对它的评价也只能对测试用例的集合来进行,测试本身是一种“V&V”的活动,测试需要保证以下两点:

    * 程序做了它应该做的事情
    * 程序没有做它不该做的事情

    因此,作为测试实施依据的测试用例,必须要能完整覆盖测试需求,而不应该针对单个的测试用例去评判好坏。

    2、测试用例应该详细记录所有的操作信息,使一个没有接触过系统的人员也能进行测试

    不知道国内有没有公司真正做到这点,或者说,不知道有国内没有公司能够将每个测试用例都写得如此详细。在我的测试经历中,对测试用例描述的详细和复杂程度也曾有过很多的彷徨。写得太简单吧,除了自己没人能够执行,写得太详细吧,消耗在测试用例维护(别忘了,测试用例是动态的,一旦测试环境、需求、设计、实现发生了变化,测试用例都需要相应发生变化)上的时间实在是太惊人,在目前国内大部分软件公司的测试资源都不足的情况下,恐怕很难实现。但我偏偏就能遇到一些这样的老总或者是项目负责人,甚至是测试工程师本身,全然不顾实际的资源情况,一定要写出“没有接触过系统的人员也能进行测试”的用例。

    在讨论这个问题之前,我们可以先考虑一下测试的目的。测试的目的是尽可能发现程序中存在的缺陷,测试活动本身也可以被看作是一个Project,也需要在给定的资源条件下尽可能达成目标,根据我个人的经验,大部分的国内软件公司在测试方面配备的资源都是不足够的,因此我们必须在测试计划阶段明确测试的目标,一切围绕测试的目标进行。

    除了资源上的约束外,测试用例的详细程度也需要根据需要确定。如果测试用例的执行者、测试用例设计者、测试活动相关人对系统了解都很深刻,那测试用例就没有必要太详细了,文档的作用本来就在于沟通,只要能达到沟通的目的就OK。

    在我担任测试经理的项目中,在测试计划阶段,一般给予测试设计30% - 40%左右的时间,测试设计工程师能够根据项目的需要自行确定用例的详细程度,在测试用例的评审阶段由参与评审的相关人对其把关。

    3、测试用例设计是一劳永逸的事情

    这句话摆在这里,我想没有一个人会认可,但在实际情况中,却经常能发现这种想法的影子。我曾经参与过一个项目,软件需求和设计已经变更了多次,但测试用例却没有任何修改。导致的直接结果是新加入的测试工程师在执行测试用例时不知所措,间接的后果是测试用例成了废纸一堆,开发人员在多次被无效的缺陷报告打扰后,对测试人员不屑一顾。
    这个例子可能有些极端,但测试用例与需求和设计不同步的情况在实际开发过程中确是屡见不鲜的,测试用例文档是“活的”文档,这一点应该被测试工程师牢记。

    4、测试用例不应该包含实际的数据

    测试用例是“一组输入、执行条件、预期结果”、毫无疑问地应该包括清晰的输入数据和预期输出,没有测试数据的用例最多只具有指导性的意义,不具有可执行性。当然,测试用例中包含输入数据会带来维护、与测试环境同步之类的问题,关于这一点,《Effective Software Test》一书中提供了详细的测试用例、测试数据的维护方法,可以参考。

    5、测试用例中不需要明显的验证手段

    我见过很多测试工程师编写的测试用例中,“预期输出”仅描述为程序的可见行为,其实,“预期结果”的含义并不只是程序的可见行为。例如,对一个订货系统,输入订货数据,点击“确定”按钮后,系统提示“订货成功”,这样是不是一个完整的用例呢?是不是系统输出的“订货成功”就应该作为我们唯一的验证手段呢?显然不是。订货是否成功还需要查看相应的数据记录是否更新,因此,在这样的一个用例中,还应该包含对测试结果的显式的验证手段:在数据库中执行查询语句进行查询,看查询结果是否与预期的一致。

  • 从Excel中取值(借鉴他人的)

    2008-09-23 13:09:12

    TestCompleteExcel取值实例

    qiguojie的51testing原创文章,转载请注明出处,非常感谢!

    因为曾经使用过Winrunner 7.6,对其自动的数据驱动测试功能印象非常深刻(独立的一个功能模块,可以方便的从Excel中读取数据进行参数化的输入),非常的方便。刚开始接触TestComplete时就记得2点:一个是WR支持鼠标操作录制但很不好用,TestComplete对其支持就非常好;另外一个就是WR的数据驱动功能比TC的强太多。

    但是数据驱动测试是自动化测试的一个应用非常多的测试类型,因此我查询了TC的帮助文件,写了一个实例出来,描述怎么才能从Excel文件中获取对应的数据。

    TestComplete的简单使用步骤:
    1、打开TestComplete
    2、选择菜单 File - New - New Project创建一个新项目
    3、选择General - Purpose Test Project,然后选择Language为Delphiscrīpt后OK
    4、Select Project Items中默认,然后Finish即可
    5、在Project Workspace的Project Explorer中点击脚本对应的Unit1单元文件
    6、复制下面的代码到单元文件
    7、保存,然后F9执行

    //========================
    //Author:qiguojie
    //Date:2008-05-05
    //scrīpt Type: Delphiscrīpt
    //========================

    //定义全局变量
    var
         MSExcel : OleVariant;
         ExcelFile;

    //声明读取值的函数
    function ReadExcel(i,j):string;forward;

    Procedure MyTest;
    var
        i,j : Integer;
        FileName : String;
    begin
        FileName := 'E:\1.xls';
        j := 1;

    //检查Excel是否启动
        ExcelFile := Sys.WaitProcess('EXCEL');
        if ExcelFile.Exists then
            ExcelFile.Terminate();
        try
            MsExcel := Sys.OleObject('Excel.Application');
        except
            Log.Warning('Unable to initialize MS Excel.', '', pmHigher);
            Exit;
        end;

    //打开对应Excel文件
        MsExcel.Workbooks.Open(FileName);

    //循环取出10个值
        for i := 1 to 10 do
        begin
            log.message(ReadExcel(i,j));
        end;
    end;

    //读取值的函数实现
    function ReadExcel(i,j):string;
    begin   
        Result := MsExcel.Cells(i,j).Value;
    end;


     

Open Toolbar