一旦所有的人都同意了写字板上有关衡量指标的内容,我们就可以开始制定项目测试希望达到的目标了。我们谈论了一些有关实践和工具的内容,后者可以帮助我们提高效率,并与我们当前的资源(人力和财力)水平相符合。同时,我们意识到,很可能不能再扩大测试组的规模了,这样我们会设法让开发人员为测试提供帮助,而谈论的关注点也随之开始围绕在此问题上。当然,我们也可以把关注点放在我们所经历的那些关键问题上。(还记得前面我所罗列的那些问题吗?)
在第六届IEEE关于Web Site发展的国际研讨会上,Hung Nguyen为我们描述了一种制定测试策略的技术—-获得一个“bug centric”。他的方法是查看产品中已发现的问题,然后将这些具体问题视为目标,反向地创建策略。他的关注点是设法添加可见性,以此确定成本,来提高产品的发布速度。无论你的上下文背景是什么,都要确保自由讨论的小组能够了解到他们所要解决的问题。如果你的测试策略没有一个明确的完成目标,那么就后退一步,先建立一个清晰的目标。最糟的莫过于你的测试策略具有一个错误的目标—-这个策略注定会以失败告终。它会产生新的问题,也会把现有的问题变得更糟。最好的情况,它偶尔可能会解决一些问题,但同时,会让我们更加的难于解决剩余的问题(实际没有如此困难)。
在我们自由讨论的时候,商定了许多问题,并得到了一些结论:
· 利用单元测试和集成测试,我们可以尽早地发现更多的问题,并准备好自动化测试的初始级别,同时,它们为我们提供了一些衡量指标,这些指标让我们可以更好的跟踪开发过程,这样,我们可以做出决定—-何时移动我们的代码。(多数情况下,我们使用J2EE和Oracle来构建应用程序,同时,也使用一些其他的技术补充。但不论J2EE或Oracle,它们都具有非常健壮和自由的单元和集成测试工具。)
· 系统测试中,我们以每次发布用户基线为结束,用户基线会增长,同时他们也会逐渐地要求一些更为精确的性能测试—-尽管我们对此还只是略知皮毛。
· 我们不能再依赖于需求验证,不能再继续将其作为我们主要的测试类型了。尽管那是非常重要的事情,因为我们不能忽略安全性测试、可用性测试、配置测试和数据完整性测试,以及上百种其他类型的测试。
· 我们决定进行一些基于session(session-based)的探索性测试,而最初是以成对的方式执行该测试的,直到我们更为适应这种类型测试的过程,同时,也发展了我们快速学习和解决问题的能力。一旦我们适应了探索性测试的工作,那么我们可以开始执行更多的sessions。
· 我们发觉,需要建立一个正规的且自动化的烟雾测试,它适用于所有的环境,它和自动化回归测试的脚本集一起被用来测试那些高风险的功能,以及高容量的事务处理。
· 我们知道,用户的接受测试(UAT)远远达不到它应有的效果。因此,我们提出要制定更为详细的UAT测试计划,将其与测试脚本和培训材料一起提供给用户,以帮助他们快速地提高。然而,这并不意味着我们希望能够全权负责UAT的工作,由我们提供更多的指南、资源和培训来帮助用户进行接受测试,我们的目的只是希望UAT执行的更为顺利。
· 我们商定了代码何时可以在环境之间移动的衡量指标。无论是单元测试,还是集成测试,90%的测试通过率对代码而言已经足够了,甚至可以从中了解到一些还会出现的bug—-只要不存在长期影响系统正常运行的bug就行。
· 我们决定要执行严格的代码复查,以保证在早期(更可取的是在写完或接近完成代码时)就发现问题,而不是在代码发布之后。我们创建了烟雾测试之后,代码必须100%的通过这些测试,这样才能前进入下一个级别。
· 系统测试中,我们无论如何都不能让任何严重或高级别的缺陷遗留到下一个过程中,但是也存在这样的一些缺陷,是我们所能容忍的,我们可以和用户进行交流,以此来确定他们的期望:问题现在就被修复,还是放在后面解决。
我们使用了代码覆盖的测试工具,根据它添加了一些相关的衡量指标,同时根据工具的缺陷趋势分析,来帮助我们衡量系统测试工作的效果。
我在写字板上记录了会议内容,如图3所示,分别用不同的颜色进行了标注。

图3 写字板—-添加的测试类型和衡量指标
第4步:组织计划
这个时候,我询问了会议室中的每一个人,一起来检查我们刚才所达成的(写在写字板上)共识,这种感觉就像是我们已经成功地执行了这个计划。下一步,划分职责和活动的实际区域范围。我们花了几分钟时间在写字板上做了相应的标注,如图4所示的蓝色方括号和箭头。
