软件测试工作必须要通过计划测试、设计测试、实现测试、执行测试、评估测试几个阶段来完成。其中计划测试阶段需要制定测试计划、整理测试需求;设计测试阶段要设计测试用例和测试过程,要保证测试用例完全覆盖测试需求;实现测试阶段要根据测试用例实现具体的自动化脚本或者手工的操作步骤;执行测试阶段则通过自动化测试工具或人手工来执行那些自动化或手工脚本;后的评估阶段则要对软件的质量和测试工作自身的质量做出一个客观的评价。RUP中还有详细的工作指南和文档模板呢!
  对,上面所说的这些都没有错,RUP中对于软件测试过程的描述要比笔者上面这段文字详细也生动得多。但是,我们同时也可以看到,RUP中描述到的,更多的是关注于过程的管理,或者更准确的说,RUP是在为我们提供一个大的方向,是一个稳定的、具有指导作用的框架,而不是一些具体的、涉及到操作细节的方法。这也是为什么很多朋友通读了RUP中关于软件测试的部分,但是一旦实际应用仍然找不准方向的原因。笔者希望同大家讨论的,则恰恰是这样一些在实践RUP测试过程时,从实际工作中总结出来的工作方法和经验。
对于测试过程方面的规范和一些基本概念,RUP中已经讲的很详细了,笔者在此也不再赘述,有需要的读者请参照RUP中的相关部分。本文中所关注的内容包括:
1. 在计划测试时,如何确定测试工作的范围和如何整理测试需求;
2. 设计测试用例时,应该如何把握测试用例的粒度;
3. 如何平衡测试用例的可用性和可维护性;
4. 如何通过逆向的测试数据分析方法来保证测试用例的有效性和减少测试工作中资源的浪费;
5. 一个简单的但有实际意义的例子将展示如何将笔者的方法应用到测试过程中。
  这里要事先声明一下,笔者工作三年来,不管是开发还是测试,工作内容始终是围绕着信息管理系统相关业务展开的,而对于测试工作,也一直局限于在系统测试阶段通过手工方法和简单的利用一些测试工具特性进行黑盒测试。因此,在本文下面描述的内容中,难免受到客观环境和笔者个人经验的影响。也正因为如此,笔者不保证本文中方法和观点适合于所有组织和个人的软件开发过程。只是希望能够借此为大家提供一种思路,帮助更多人进行个性化的RUP测试过程实践,共同提高软件测试行业的水平。
另外,本文中使用到的例子,均为笔者的一些假设,如果侵害到任何第三方组织或个人的利益,实属巧合,请通过E-Mail通知笔者,笔者将在今后再次发布本文时做出相应的调整。
如何确定测试工作的范围?
  对于一个存在生命周期的软件产品来说,它的开发和测试往往都不是一次性的,因为随着新的需求的出现,以及对原有版本的改进,新的版本会不断的发布(即使对于一些以客户定制方式运作的项目,在开发过程中以及发布后的维护期内,也会产生众多的内部版本)。随着版本的迭代,我们的测试工作也会一直继续下去。而在每一次迭代时,可能在整个工作阶段的开始受到一些因素的影响,比如市场需求、既定的发布时间、并发的工作导致的资源紧张等等,使我们不得不考虑对软件质量要求的适度,终使得我们在每个阶段的测试工作的要求或者说所涉及到的内容有可能是不同的。这种变化,终将会影响到测试需求的确定。
那么到底该如何确定每次迭代是测试工作的范围呢?
  在笔者的实践中,通常把测试工作范围的确定,等价的认为是软件需求的确定。
不过现在有一个很实际的问题是这样:软件需求在开发过程中不断发生变化,有时候到了后期还会有新的需求添加进来,还有些需求在交付内部测试版本之后又发现原来的需求本身存在缺陷,之后再次返工,在软件终发布之前,怎么可能确定的下来呢。啊,这些都是让我们的开发人员和测试人员极其头痛的事情。到底应该怎样在频繁变更的需求中确定哪些部分是我们在某个阶段要测试的内容呢?或者说通过什么样的方法可以改善我们上面提到的那些问题呢?
一个实际的做法是实现软件需求的版本化控制。
  既然说到了这里,不免要说些题外话。笔者一直都认为软件需求是开发工作和测试工作在制定计划、开展工作时所共同参照的源头和依据,而我们只有在源头上控制好,才能保证下面工作的平稳开展。
  如果希望某个阶段工作的进度和内容可以明确的定义下来,必须要考虑软件需求的版本化控制。这里所提到的“软件需求的版本化控制”,是指在一个软件产品的生命周期中,当要进行一个新版本的迭代时,要尽早的确定这个版本中将要实现的需求,并同上个版本做出比较,哪些内容是新增的,哪些内容是被调整过的。在该阶段工作开始之初的工作会议上,明确的向所有需要了解软件需求的涉众传达这部分信息。而如果在该版本的开发过程中不断的出现需求变更的情况,则应该根据市场策略、已公布的发布时间、客户需求、实现的代价、难易程度以及对现有工作的影响等方面,对需求进行适度划分,严格定义当前版本中需要实现的需求,而其他部分,则作为未来版本的软件需求进行考虑。
  如果有的朋友认为上面的内容还是太理论化,需要一个更实际的、可操作的方法。那么只能说,对于需求的变更,以及因为需求变更而引起的设计的变更,必须要早发现,早讨论,早决定,早调整。这可能更多的要依靠一个团队中相关负责人员的主动工作来保证,而不是依靠一个明确的方法。
注意,这里的一个关键是,对于软件需求,同样需要严格按照版本进行管理,或者说使
用“基线”进行管理。
如何整理测试需求?
  一旦当前阶段测试工作的范围确定下来,我们可以开始考虑测试需求的整理??也是明确的定义现阶段要“测什么”。测试需求的确定将为我们制定进度时间表、分配资源以及如何确定某个阶段测试工作是否完成提供一个可供衡量的标准。当然,还有更重要的一点,已被确定的测试需求是我们进行测试用例设计和考虑测试覆盖的依据。
整理测试需求的第一步,是要“测试需求”。
测试需求?对,不知道您是否想到,这里的“测试需求”中的“测试”是一个动词,指
的是对软件需求本身的检查。
  啊?这不是已经超出了测试工作的范围了吗?测试人员不是应该只关心软件的实现同需求是否相符吗?这样对测试人员要求未免太高了。??这是笔者过去同一些朋友谈到测试人员必须对需求进行检查时听到的一些不同的声音。
在这里,首先要明确一个问题,是软件测试的工作到底做什么?
  在《软件测试》( Ron Patton〔美〕,中文版由机械工业出版社出版,这本书是测试新手入门的经典教材)一书的第10页,有一个明确而简洁的定义:软件测试员的目标是找到软件缺陷,尽可能早一些,并确保其得以修复。
瞧!这里说要“尽可能早”的“找到软件缺陷”。那这“尽可能早”要早到什么时候呢?
  不知道大家对《软件工程》这本书还有什么印象。至少在笔者看过的多个不同版本的软件工程方面的书中,对于软件缺陷都会有一段类似的描述:缺陷发现的越早,则修复这个缺陷的代价越小,在需求、设计、编码、测试、发布等不同的阶段,发现缺陷后修复的代价都会比在前一个阶段修复的代价提高10倍(参见下图)。这样看来,上面问题的答案自然变成了“秃子头上的虱子”:从需求阶段开始!从“测试需求”开始!
 一是对软件需求正确性的检查,也是要保证需求文档中所描述的内容是真实可靠的。在进行这部分工作时,不要迷信所谓的“都是用户提出的真实的需求”,因为我们必须考虑,提出这些需求的涉众,是否真的可以正确的描述自己的需求?我们的需求人员是否真的可以正确的理解用户的需求?有没有一些被用户认为在业务处理上是理所当然、极其平常的事情,而没有作为需求提出来?有没有一些被用户认为他们过去使用的软件已经提供了相应的功能,所以认为我们也应当提供,而没有提出来的?关于这个问题,也曾经有朋友提过不同的看法,认为这样对测试人员的要求太高了??既要熟悉需求人员的工作,又要熟悉软件所涉及的行业的业务。但笔者还是固执的认为,作为测试人员,还是需要对软件产品所涉及的行业的业务有一个全面的、深入的了解??当然,这不是对一个刚刚入门的测试者的要求,但是如果想称为一个的测试者,是难免要付出这部分努力的。
  二是要保证软件需求的可测试性。对于“可测试性”,笔者的概念是:对于一条软件需求或者一个需要实现的特性,必须存在一个可以明确预知的结果,并且可以通过设计一个可以重复的过程来对这个明确的结果进行验证。说的具体一点,是要保证所有的需要实现的需求都是可以用某种方法来明确的判断是否符合需求文档中的描述。如果对于某条需求或某个特性,无法通过一个明确的方法来进行验证,或者无法预知它的结果,那么意味着这条需求的描述存在缺陷,应该请需求人员对需求文档进行修改或补充??我们有理由相信,如果作为测试人员对需求无法产生准确的理解,那么开发人员也同样无法对同一条需求产生准确的理解。对于一条确定的软件需求理解的二义性,是在不规范的开发过程中导致返工的一个主要原因。如果认为有必要,那应该在“需求评审会议”上确认所有涉众对需求的理解是一致的。
  当然,对于如何提高软件需求的质量,在网络上或者已经出版的书刊中都已经有了很多更加具体、实用的方法,如果有兴趣,大家也可以找来参考。不过,如果您是一位测试者,那么上面这部分内容对您仍然是非常有用的。相信您只要在工作中进行尝试,慢慢的体会,一定会发现这种方法给您带来的好处。
  现在当前的测试工作范围已经确定,相应版本的软件需求也通过了评审,我们可以在这个已经确定的范围内进行测试需求的整理。我们手头上可以参考的东西,通常会有软件需求规约(以下简称SRS)和用例(以下简称UC)??当然,也可能是一份包含UC的SRS。通过对SRS和UC的阅读,我们可以从文档对特性和业务流程的描述中获得对软件所涉及的业务的一个基本的认识。比如用户在处理实际业务时都要作些什么,多个业务之间的先后顺序是怎样的,用户在处理业务是对于哪些地方有特别的要求,等等。这部分规则,将成为我们的测试需求中基本的一部分。
  至于测试需求的表现形式,笔者认为大家都可以根据自己的需要进行设计,而没有必要把思路限制在到底使用表格方式还是使用文本方式,只要把握一个原则行了:在一条测试需求中,用容易理解的自然语言,明确的描述一项需要测试的内容。对于多项测试内容,应尽可能的剥离开来,保证一条测试需求只包含一项测试内容。
  另外,大家也可能注意到了,在软件开发过程的这个阶段,通常是没有用户界面(以下简称UI)可供参考的??虽然RUP中对于需求阶段的工作描述包括了UI设计的部分,但很多时候在这个阶段还是无法提供一个确定的UI的??也是说我们这时获得的测试需求,将是完全基于业务的,而并不包括基于UI的那部分规则,是同软件的终具体实现相独立的。