大多数情况下,卓越的测试从两个问题开始:谁是我们的客户?他想知道什么?
然而,如果我们的客户并不了解测试、开发,以及会影响产品工作的其他领域,有可能,他不清楚自己想知道什么。那么,我们从哪儿开始呢?我们可能会尝试看看系统的“地图”,并且询问相关的问题。
假设,我给你一张地铁系统的地图,并且要求你覆盖地铁系统,你会怎么做?
你可能会先选择某一条线路的终点站,乘车到另一个终点。然后,对其他所有线路重复这个操作。当你覆盖完所有线路时,你完成对地图的100%覆盖了吗?
也许没有。大多数地铁线路是双向的,为了覆盖系统,你必须在每一个方向乘坐一次。所以你这样做了。那么现在已经100%覆盖了吗?
也许还没有。在主线路外还有辅线,列车可以绕回,或者跳过某一站。当你乘坐所有的辅线后,你达到100%覆盖了吗?
也许还没有,地铁线并不是孤立的,在不同线路之间还有换乘站。为了覆盖地图,你需要覆盖每一个方向上线路之间的换乘站。现在,已经完整了吗?也许你还需要在每一站都下车,确认无误?
目前为止,我们用一种抽象的、结构化的方式在思考覆盖地图,还没有仔细思考使用系统实际上会发生什么。
我们没有讨论所有类型的列车——客车、维修车、等等;我们也没有讨论基础工程——铁轨、信号系统、电力供应——这些地铁系统运作所必需的支持。
我们还需要看看与其他系统的互连——人行道、巴士、电车、火车以及机场,等等;我们可能还要讨论不同类型的乘客——常客、学生、流浪艺人、障碍人士,等等。
我们也许还需要考虑他们为什么使用系统——在高峰时期上班、上学,在周末去看电影和购物,还是在酒吧打烊后回家。
我们还可以审视地铁的辅助系统——标识、垃圾回收、警卫、报摊以及广告。
我们还应该考虑系统和时间之间的关系——运行时刻表、实际到达时间、上车时间,等等。
我们还没有考虑我们如何观察不同时段——高峰时期、午间、系统关闭前的午夜。
最后,我们还要考虑一些环境的组合,可能导致非线性的影响——在高峰时期,列车拥挤,上车需要花费更长时间,不能像正常情况一样快速驶离,导致系统变慢,这种反馈又导致列车更加拥挤。
我们还没有讨论这些事情,也许是因为我们,或者客户还没有完全认识到测试的动机:为什么测试?然而,地图快速地激发了我们的思考,唤起更多的覆盖可能性。
事实上,对于系统的任何描述都是一张地图——流程图、结构图、UML模型、以及思维导图,等等。通常,我们询问地图上的某一个标记,例如UML模型中的某个动作,来设计测试用例。然而,当我们疑惑:哪些是最重要的?我们同样可以从地图开始,询问问题,可以使用启发式来寻找风险——最简化(Simplest),最普遍(Popular),最严酷(Critical),最复杂(Complex),最病态(Pathological),最挑战(Challenging),错误应对(Error Handling),间歇期(Periodic)。
- 从这里到那里,最简单的线路是什么?
- 标准路线是哪个?
- 哪些是基本路线?
- 哪些地方容易混淆或出现延误?
- 哪些东西会干扰这个任务?
- 如果这条线路不可用会发生什么?
- 地图是否提示了哪些工作区是可用的?
- 这条路线的交通流量有多大?
- 这条路线的速度有多快?
- 是否有出现冲突的可能?
基于这些想法,我们可能会在地图上添加一些细节,但是这样可能会产生另外一个问题。我有一张多伦多的旧地铁图,上面指示了线路,站点,换乘站以及与火车的连接。我还有一张新地图,增加了一些标记,包括地铁站的街道地址、停车场、公共洗手间、供障碍人士使用的电梯、以及地面交通转乘点,但是——它去掉了与火车转乘点的标识!这个状况提醒我们,任何地图可能包括了某些有价值的信息,但也可能丢掉了另外一些有价值的信息。对比两张地图,会帮助我们发现还需要覆盖哪些要素。
有些人建议,地图必须精确地表现地域,但有很多个理由不这样做。地铁图通常展示站点之间的关系,而不是它们之间的实际距离。在Karl Weich的《Sensemaking in Organizations》(组织中的领悟力)一书中,给出了一个不准确但又很有用的实例。
一支匈牙利部队在阿尔卑斯山巡逻时,遇到了一场暴雪。一个排没有返回营地,过了一天,两天,三天,军官感到恐慌和绝望,但是突然,整个排回到了营地。军官在惊喜中问:“我们还以为你们回不来了!你们怎么做到的?”排长回答道:“嗯,当暴雪来临时,我们找到了一个地方躲避。后来天气变好了,我们发现迷路了。不过,幸好有个人带了这张地图,我们查看了地图,然后发现如果我们下山,会遇到一条河,如果我们沿着河走,我们会到达……,最后,我们就在这儿了!”军官拿过地图,看了一下,令他非常惊讶,这张不是瑞士阿尔卑斯山的地图,而是法国比利牛斯山地图。
Weick说:这个故事指出了一种非常有趣的可能性,当你迷路了,任何地图都会有帮助,那么,也许当你困惑时,任何策略也能发挥作用。策略非常类似于地图,它鼓舞和指引人们。一旦人们开始行动,就会产生实际的结果,这些结果帮助他们发现:发生了什么,需要解释什么,以及下一步应该做什么。管理者总是忘记,成功是做了什么,而不是计划了什么。他们总是信任错误的事情——计划,并且不停地这么做,他们花更多时间来做计划,更少时间来行动。于是,当越来越多的计划没带来任何改进的时候,他们被吓坏了。
显而易见,覆盖地图的方法非常重要。从本质上来看,这是人在思考和行动,从而产生差异和新的理解。
分析地图并且规划如何覆盖,这是测试设计,可以发现地图自身还没有覆盖的元素。这会鼓舞我们注解地图,或者创造一个新的地图。
对比地图和地域,这是测试执行,即使地图是有限或不准确的,我们会学习并发现真相。
卓越的测试并非仅仅是覆盖地图,而是探索你的领域,发现地图的“未知”。
注:本文译自Michael Bolton的《Cover or Discover》。参见:http://www.developsense.com