2010年这样匆匆忙忙,紧紧张张地过去了。这一年里来来去去,变化大的是很多一起工作了多年的同事离开了,很多都去了"更给力”的地方,呵呵!公司里来来往往是很正常的,想想我我近一次换到“更给力”的地方,那都是5年前了。总之,现在的地方还是挺给力的,好好工作,争取2011年有更大的进步,呱唧呱唧!
    测试用例设计的基本要求:覆盖住所要测试的功能。这是在基本不过的要求了,但别看只是简单的一句话,要能够达到切实覆盖全面,需要对被测试产品功能的全面了解、明确测试范围(特别是要明确哪些是不需要测试的)、具备基本的测试技术(如:等价类划分等)等。那么满足了上述这条要求是不是设计出来的测试用例是好的测试用例了呢?答案:在理论上是,但在实际工程中还远远不是。之所以理论和实际会有这样的差别,是因为在理论上不要考虑的东东,而在实际工程中是不得不考虑的 - 成本。这里的成本包括:测试计划成本、测试执行成本、自动化测试用例、测试自动化成本,测试分析成本,以及测试实现技术局限、测试环境的Bug、人为因素和不可预测的随机因素等引入的附加成本等。
    由于成本因素的介入,决定了工程中设计好的测试用例原则不只有“覆盖住所要测试的功能”这一条,下面是我根据自己的工作经验总结出的其它四条原则,在这里抛砖引玉,希望大家拍砖和指正。这些原则特别是针对那些需要被自动化,并且是要被经常执行的测试用例。
    1、单个用例覆盖小化原则。
    这条原则是所有这四条原则中的”老大“,也是在工程中容易被忘记和忽略的,它或多或少的都影响到其它几条原则。下面举个例子来介绍,假如要测试一个功能 A,它有三个子功能点 A1,A2 和 A3,可以有下面两种方法来设计测试用例:
    ● 方法1 :用一个测试用例覆盖三个子功能 -Test_A1_A2_A3,
    ● 方法2 :用三个单独的用例分别来覆盖三个子功能 - Test_A1,Test_A2,Test_A3
    方法1适用于规模较小的工程,但凡是稍微有点儿规模和质量要求的项目,方法2则是更好的选择,因为它具有如下的优点:
    ● 测试用例的覆盖边界定义更清晰
    ● 测试结果对产品问题的指向性更强
    ● 测试用例间的耦合度低,彼此之间的干扰也越低
    上述这些优点所能带来直接好处是,测试用例的调试、分析和维护成本低。每个测试用例应该尽可能的简单,只验证你所要验证的内容,不要“搂草打兔子”捎带着把啥啥啥啥都带进来,这样只会增加测试执行阶段的负担和风险。David Astels在他的著作《Test Driven Development:A Practical Guide》曾这样描述,好一个测试用例只有一个Assert语句。此外,覆盖功能点简单明确的测试用例,也便于组合生成新的测试,在Visual Studio中引入了Ordered Test的概念。
    2、测试用例替代产品文档功能原则。
    通常我们会在开发的初始阶段(Scrum每个Sprint)用Word文档或者OneNote的形式记录产品的需求,功能描述、功能的细节等信息,以描述我们将要实现产品功能样貌,便于团队进行交流、细化并在团队内达成对产品功能在具体细节上的认同和共识。假设我们在这个是达成的共识并描述的是功能A,随着产品开发深入,团队会对产品的功能有更新的认识,产品功能也会被更具体细化,在一个迭代或者Sprint结束的时候终实现的功能很可能是A+。如此往复,在不断倾听和吸收用户的反馈,多个迭代过后,原本被描述为A的功能很可能终变为了Z。这是时候再去看看曾经的Word文档和OneNote页面,它们仍然记录的是A。之所以会这样 ,是因为很少有人会去以及能够去不断地去更新那些文档,以准确地反映出功能当前准确的状态。不是不想去做,而是实在很难!
    那么没有什么东西能够准确描述产品的功能细节了吗?答案是:当然有,那是产品代码和测试用例。产品代码实现了产品动能,它当然肯定准确描述了产品的动能,但是由于各种编程技术,如:面向对象、抽象技术、设计模式、资源文件等等,使得产品代码本身很难简单地能读懂,往往是在知道产品功能的前提下去读代码,而不是反过来看代码来了解功能。那么只有测试用例了,测试也应该忠实反映了产品功能的,否则的话测试用例会执行失败。所以,我们对测试用例的理解应该再上升到另一个高度,它应该是能够扮演产品描述文档的功能。这要求我们编写的测试用例足够详细、测试用例的组织要调理和主次,这些单靠Word、Excel或者OneNote这样通用的工具是远远无法完成的,需要更多专用的测试用例管理工具来辅助,例如 Visual Studio 2010引入Microsoft Test Manager。
    此外,对于自动化测试用例(无论是API或者UI级别的)而言,代码在编写上应该有别产品代码编写风格,可读性和描述性应该是重点考虑的内容。在测试代码中,当然可以引入面向对象、设计模式等的设计思想,但是一定要适度使用,往往面向过程的编码方式更利于组织、阅读和描述。