发布新日志

  • V模型,还是X模型?

    2008-09-22 22:23:03

    软件测试:V模型,还是X模型?

    软件测试:V模型,还是X模型?

    X模型的目标是弥补V模型的一些缺陷。X模型真的能解决测试过程各方面的问题,例如交接、经常性的集成?

    在软件测试方面,V模型是最广为人知的模型,尽管很多富有实际经验的测试人员还是不太熟悉V模型,或者其它的模型。V模型已存在了很长时间,和瀑布开发模型有着一些共同的特性,由此也和瀑布模型一样地受到了批评和质疑。

    V模型中的过程从左到右,描述了基本的开发过程和测试行为。V模型的价值在于它非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各阶段的对应关系。

    图1--V模型示意图


    Cv$v| I.oA#n,q130745在V模型中,单元测试是基于代码的测试,最初由开发人员执行,以验证其可执行程序代码的各个部分是否已达到了预期的功能要求;

    集成测试验证了2个或多个单元之间的集成是否正确,并有针对性地对详细设计中所定义的各单元之间的接口进行检查;

    在所有单元测试和集成测试完成后,系统测试开始以客户环境模拟系统的运行,以验证系统是否达到了在概要设计中所定义的功能和性能;

    最后,当技术部门完成了所有测试工作后,由业务专家或用户进行验收测试,以确保产品能真正符合用户业务上的需要。

    尽管很多人对V模型表示了否定,但很少有人真正详细地讨论这些问题。Brian Marick(《The Craft of Software Testing (Prentice Hall, 1995)》一书的作者)曾如此表示。在STAR2000 (Software Testing Analysis and Review) 东部会议上,Marick曾经和Dorothy Graham(本系列文章的另一位作者)进行过一场论争,并在其个人网站www.testing.com上对V模型提出过一些中肯的反对意见。

    51Testing软件测试网V[kjh ~ j6q(f@
    X模型

    51Testing软件测试网Vjoz)c pe[,@b
    Marick曾提出过一些观点和意见,其中首先是Marick不建议要建立一个替代模型。这里我很冒昧地引用了一些Marick的想法,并重新经过组织,形成了“X模型”。其实并不是为了和V模型相对应而选择这样的名字,而是由于其它一些原因:X通常代表未知,而Marick也认为他的观点并不足以支撑一个模型的完整描述,但其中已经有一个模型所需要的一些主要内容,其中也包括了象探索性测试(exploratory testing)这样的亮点。我还需要在使用文字方面也向Marick道歉,因为认同Marick观点的无疑大多属于X一代(X一代)。另外,我勾画了一张X形状的示意图,我相信该图能够很好地以另一种表达形式来体现Marick的观点。

    51Testing软件测试网8R"gJ.s[c6Z5p@
    图2--X模型示意图


    f8},M {cX8K\130745由于X模型从没有被文档化,其内容一开始需要从在V模型的相关内容中进行推断,这在Marick的相关文章中已有体现。这里关于X模型的论述比较简短,因为它还没有完全从文字上成为V模型的全面扩展,而且我不想在这里重复在《软件测试:不可忽略的阶段》文章中所提到的很多测试技术的概念。

    Marick对V模型的最主要批评是V模型无法引导项目的全部过程。他认为一个模型必须能处理开发的所有方面,包括交接,频繁重复的集成,以及需求文档的缺乏等等。

    51Testing软件测试网)rv kb;c-a0|
    解决交接和频繁集成的周期的问题

    51Testing软件测试网$A ` w9s/bZ
    Marick认为一个模型不应该规定那些和当前所公认的实践不一致的行为。我也很认同这一点。X模型的左边描述的是针对单独程序片段所进行的相互分离的编码和测试,此后将进行频繁的交接,通过集成最终合成为可执行的程序。(右上半部分),这些可执行程序还需要进行测试。已通过集成测试的成品可以进行封版并提交给用户,也可以作为更大规模和范围内集成的一部分。多根并行的曲线表示变更可以在各个部分发生。

    由上图中可见,X模型还定位了探索性测试(右下方)。这是不进行事先计划的特殊类型的测试,诸如“我这么测一下结果会怎么样?”,这一方式往往能帮助有经验的测试人员在测试计划之外发现更多的软件错误。Marick虽然没有对此进行明确的说明,但一定很乐意看到该方法的界定。

    然而,关注于这样的低级别的行为可能会引起不同的议论。一个模型和一个单独的项目计划有所不同。模型不应该描述每个项目的具体细节,模型应该对项目进行指导和支持。当然,代码的交接也可以简单地认为是一种集成的形式。而V模型也并没有限制各种创建周期的发生次数。

    Marick和Graham都一致认同,应该在执行测试之前进行测试设计。Marick建议:“在你掌握相关知识时进行设计,在你手头有交付内容时进行测试。”X模型包含了测试设计的步骤,就象使用不同的测试工具所要包含的步骤一样,而V模型没有这么做。但是,Marick的例子提示,X模型在这层意义上看也并不是一个真的模型,取而代之的是,应该允许在任何时候选择使用测试设计步骤。


    3MTL`8NYC130745事先计划

    51Testing软件测试网js M6|8[!s.zv#R4\-\c
    Marick对V模型提出质疑,也因为V模型基于一套必须按照一定顺序严格排列的开发步骤,而这很可能并没有反映实际的实践过程。

    尽管很多项目缺乏足够的需求,V模型还是从需求处理开始。V模型提示我们要对各开发阶段中已经得到的内容进行测试,但它没有规定我们要取得多少内容。如果没有任何的需求资料,开发人员知道他们要做什么吗?我主张在X模型和其它模型中都需要足够的需求并至少进行一次发布。虽然在没有模型的情况下也必须正常工作,但一个有效的模型,可以鼓励很多好的实践方法的采用。因此,V模型的一个强项是它明确的需求角色的确认,而X模型没有这么做,这大概是X模型的一个不足之处。

    Marick也质疑了单元测试和集成测试的区别,因为在某些场合人们可能会跳过单元测试而热衷于直接进行集成测试。Marick担心人们盲目地跟随“学院派的V模型”,按照模型所指导的步骤进行工作,而实际上某些做法并不切合实用。我已经尽自己的努力把Marick的关于需要很多具有可伸缩性的行为的期望结合进了X模型,这样,X模型并不要求在进行作为创建可执行程序(图中右上方)的一个组成部分的集成测试之前,对每一个程序片段都进行单元测试(图中左侧的行为)。但X模型没能提供是否要跳过单元测试的判断准则。


    \,i#up4y6v130745在“阶段”之外


    :g.NKEri ^ {3i130745一个模型的主要目标应该是描述如何把某件事情做好。当一个模型所规定的基本要求还不完整的时候,模型可以帮助我们认识到这些不足,这也是其价值所在。虽然我们承认,在没有足够多的需求的前提下,系统开发还可以继续下去,X模型可能会提倡付出额外的努力来进行更多的实践行为。同样的,也可以因为喜欢集成测试而选择跳过单元测试,但其价值可能有一些虚幻的成分在,因为一般来说,在单元测试中发现问题进行解决的代价较小,而在集成测试中发现问题所付出的代价要大得多。

    一个代表落后的实践的模型,其存在仅仅是因为它是普通的、常见的,这样的模型只能简单地保证以后我们可以维持落后的实践的重复,而不对改进作出变化。人们甚至还认为落后的实践不但是难以避免的,而且还是必然的,并终于拒绝把改进作为一种美德。

    例如,开发者有时并不真正去研究如何更好地定义用户的业务需求,而是简单地认为这样的工作是不现实的,因为“用户并不真正知道他们要什么”,或者认为“需求始终是要变化的”。于是,这些开发人员可能进一步宣称不了解需求的做法是合理可行的,因为他们可以使用一些更高级的做法,例如原型法。虽然这样的技术对确认需求,达成理解上的一致是有用的,但实际上这不是一条直接通向编码的捷径。这种情况下,编码是非常低效的、要耗费很多工作量来发现真正的用户业务需求。从项目总体计划方面来看,采用迭代方法以及一些更直接的发现需求的方法会显得更有价值。

    同样的,X模型及其探索性测试的提倡也是为了避免把大量时间花费在测试文档编写上面,那样的话,真正用于测试的时间就减少了。(不知道为什么,有些测试专家似乎并不把撰写测试计划视为一种美德。我可能是最后一个鼓励写文档和填写一些表格的人,我认为这其中自有价值。我曾经看到过很多存在大量冗余的测试计划文档的例子,这些计划并不值得花那么多时间来写。但这并不说明写测试计划是一件不好的行为,应该说写很糟糕的测试计划才是一件不好的行为。在另一方面,把重要信息写下来,可以取得数倍的回报。这可以使我们更加全面了解,避免遗忘,实现更多的共享。

    在此后的2篇文章中,我将揭示合理的结构是如何在实际项目中使软件开发变得更快,成本更低,效果更好的,并将展示我称之为“前置测试”的模型,我的客户、学生和我本人都觉得该模型具有实用价值。我相信该模型填补了V模型和X模型的缺陷,并可为测试人员和开发人员带来明显的帮助。

  • 软件生命周期模型

    2008-09-22 22:20:11

    软件生命周期模型

    我们把软件的开发过程分成了这样几个阶段:需求规格阶段,概要设计阶段,详细设计阶段,代码阶段,单元测试阶段,集成测试阶段,以及系统测试阶段。也就是 说,在实际的开发过程中,我们要逐一完成每个阶段的工作,当完成最后一个阶段的工作后也就完成了整个软件项目。像这样组织软件开发过程的规则,就可以称为软件生命周期模型。一个定义良好的软件生命周期模型,可以很好的指导我们的开发工作,使漫长的开发工作易于控制。事实上,我们可以任意定义自己喜欢的软件生命周期模型。但是,如果生命周期模型定义不合理,却会制约我们的开发过程。软件开发人员在长期开发过程已经总结出了几种常用的软件生命周期模型,我们可以根据项目的特点来选择一个合适的模型,然后在此基础上再加以裁减。这些生命周期模型是:
            1)瀑布模型,
            2)快速原型模型,
            3)渐增模型,
            4)演进模型。
            下面我们重点阐述前3种常用的生命周期模型。
     
    2.1瀑布模型
            顾名思义,该模型就是像瀑布一样。这是一个最传统的生命周期模型,是一种顺序的模型,自顶向下把一个软件开发过程分为:系统定义、需求分析、设计、编码、测试和维护等阶段。在开发过程中这些阶段顺序进行,就像是一个飞流直下的瀑布,因此得名。该模型可以用下面的图形来表示。
            系统定义
              \|/
            需求分析
              \|/
             设计
              \|/
             编码
              \|/
             测试
              \|/
             维护
            有时,根据项目的特点,设计又可分为概要设计和详细设计。
            上图中各阶段所要完成的工作在一般的论述软件工程的书籍中都有描述,这里就不再细述。
            虽然上面的阶段是顺序进行的,但是这并不是限定我们的软件项目必须在完成了上个阶段的工作后才能进行下个阶段的工作。在实际的开发过程中,我们常常会遇到这样的情况:阶段反复和重叠。
            在前面的需求管理部分我们曾经阐述过需求变更管理。也就是说,在软件开发的某个阶段可能发生需求变更,而一旦软件需求发生变化,就势必会造成软件设计的改变,因此,如果该软件项目已经进行到了测试阶段,那么我们就必须回过头来重新进行需求分析、概要设计、详细设计和编码。像这种在后面的阶段又返回来做前面阶段工作的情形,就成为阶段反复。当然,也有可能因为开发人员前面的工作做得不够准确而导致阶段反复。阶段反复常常会造成进度延迟,但是,只要严格控制好每个阶段的输入和输出,我们还是可以有效的控制软件项目的开发过程。
            在实际的开发过程中我们还会遇到这种情况:如果一个软件项目规模较大,而且各功能模块相对独立,那么,我们就没有必要要求所有模块的进度都一致,也就是说,模块1可能很快就能完成概要设计和详细设计,而模块2由于太复杂概要设计可能就需要很长的时间。对于这种情况,只要控制好模块1各阶段的输入和输出,完全可以让模块1先行,直到完成或者必须停下来等待其他模块。像这种情况, 一个软件项目的各模块可能处于不同的阶段,就成为阶段重叠。出现这种情况,必须是某些模块比较独立,否则就不可能比其他模块先行。
            虽然阶段的重叠和反复是允许的,但是我们却不能允许这种情况随意发生。比如说,需求分析和设计可以重叠,但是如果需求分析和编码也重叠就很难说代码会写成什么样了;编码阶段可以因为需求变更回过头来进行需求分析和设计,但是如果已经进行系统测试了还在进行阶段反复,这就等于又开发一个新项目了。因此,为了更好的控制软件开发过程,要尽量减少阶段重叠和反复,如果实在不可避免,应该对所有的变更进行严格控制,这样才能保证我们的开发过程陷入无序状态。
            另外,在该模型的基础上,还衍生出了强调测试活动的V模型。它把瀑布模型的测试阶段进行细分,并于前面的阶段进行对应。细分出来的这些阶段分别为:单元测试阶段、集成测试阶段和系统测试阶段。V模型的结构图如下。
     
         系统定义                           维护
    ------\------------------------------/------------
     
             需求分析       .....       系统测试
                  \                      /
                概要设计    .....   集成测试
                     \               /
                   详细设计  ...  单元测试
                          \       /
                            编码
     
            与需求分析对应的是系统测试。因为需求分析的工作是分解用户的功能和性能需求并规格化,所以系统测试的工作主要就是测试这些功能和性能指标是否都在软件中正确实现。
            该测试把软件作为一个黑盒,针对每个需求规格组织各种输入并根据软件输出来判断该需求规格是否正确实现,因此系统测试属于黑盒测试。与概要设计对应的是集成测试。因为概要设计的工作主要是根据功能把大的系统进行模块分解,所以集成测试的工作主要是,把各模块逐步集成在一起,来测试数据是否能够在各模块间正确流动,以及各模块能否正确同步。因为这种测试依赖于软件的架构但又不关心每个函数的实现细节,所以该测试又常称为灰盒测试。与详细设计对应的是单元测试。它主要是详细设计中的每个功能单元(通常是函数或过程)进行逻辑覆盖测试,因此这种测试属于白盒测试。与从需求到设计、统测试,于是就形成了一个V字形的 结构。
            与在瀑布模型中描述的一样,这些测试活动也是顺序进行的,并遵循一定的输入和输出规则(具体的测试在以后的章节中会详细描述),但是这些阶段也同样可以重叠和反复。
     
            瀑布模型的优点是清楚地标识出了软件开发的阶段。它采用自顶向下逐步求精的方式把整个开发过程分成不同的阶段,每个阶段的工作都很明确,因此便于控制开发过程。当所有的阶段都完成之后,该软件的开发过程也随之结束。
            瀑布模型的缺点正是它自身的顺序性所导致的。实际的开发过程中,在需求阶段很难把用户的需求完全明确下来,因此,当需求变更时将会导致阶段反复,而且都要重复需求、设计、编码、测试等过程。
            实际的开发过程中,用得较多的就是瀑布/V模型,只是可以根据实际需要进行阶段合并与裁减。

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

    2008-09-21 23:57:46

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

       Beta 测试:当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,最终上报给程序员或测试员完成.
  • 软件测试管理和测试流程

    2008-09-21 23:34:18

    软件测试管理和测试流程

    软件测试管理
    正确的方式对公司的测试工作进行管理。而“正确的方式”就是在工作中不断摸索和改进后的管理方式,探索并发现这些方式也是测试管理工作的重要任务之一。
    软件测试管理还要评估风险、规划资源、不断地提高团队能力,最终形成一个高效的团队来完成对质量的管理。
    测试管理的目标是在进度、成本、质量三者之间做出平衡,使产品能够符合客户需求。
    软件测试流程
    第一步:对要执行测试的产品/项目进行分析,确定测试策略,制定测试计划。该计划被审核批准后转向第二步。测试工作启动前一定要确定正确的测试策略和指导方针,这些是后期开展工作的基础。只有将本次的测试目标和要求分析清楚,才能决定测试资源的投入。
    第二步:设计测试用例。设计测试用例要根据测试需求和测试策略来进行,进度压力不大时,应该设计的详细,如果进度、成本压力较大,则应该保证测试用例覆盖到关键性的测试需求。该用例被批准后转向第三步。
    第三步:如果满足“启动准则”(EntryCriteria),那么执行测试。执行测试主要是搭建测试环境,执行测试用例。执行测试时要进行进度控制、项目协调等工作。
    第四步:提交缺陷。这里要进行缺陷审核和验证等工作。
    第五步:消除软件缺陷。通常情况下,开发经理需要审核缺陷,并进行缺陷分配。程序员修改自己负责的缺陷。在程序员修改完成后,进入到回归测试阶段。如果满足“完成准则”(ExitCriteria),那么正常结束测试。
    第六步:撰写测试报告。对测试进行分析,总结本次的经验教训,在下一次的工作中改。

我的存档

数据统计

  • 访问量: 4166
  • 日志数: 7
  • 建立时间: 2008-09-21
  • 更新时间: 2008-09-23

RSS订阅

Open Toolbar