【IT168 评论】Agile testing(敏捷测试)基本上是伴随着敏捷开发的概念成长起来的,但在受关注程度上,远远不及敏捷开发本身。自然,开发队伍从数量和活跃度上来讲大于测试队伍,是其中的一个原因;除了这个原因之外,“敏捷测试究竟如何在项目中发挥作用”这个问题可能也是导致敏捷测试概念的流行度远远不如敏捷开发的原因之一。
关于敏捷测试,我能找到的较早的比较系统化的描述文档应该是2002年的这份PPT,这份PPT定义了敏捷测试的两个主要特点:“遵循敏捷宣言的测试实践,将开发当成是测试的客户”(Testing practice that follows the agile manifesto, treating development as the customer of testing),以及“在使用敏捷技术的项目中的测试实践”(Testing practice for projects using agile methodologies)。敏捷开发宣言中提到了敏捷开发的四个核心价值观:简明(Simplicity)、沟通(Communication)、反馈(Feedback)、勇气/决断(Courage)─ 如果我的翻译有错,请指正 ─毫无疑问,从开发的角度来说,很容易理解这四个核心价值观对应的行为(敏捷开发的best practice),但从测试的角度来说,“简明”和“勇气”就很难对应到具体的测试行为中。
既然难以清楚的寻找敏捷测试的实践行为,我们先尝试来寻找另一个问题的答案:“敏捷开发究竟会给测试带来哪些改变(相对于传统的测试)?”如果可以找到这个问题的答案,我们应该可以顺藤摸瓜的找到敏捷测试中对应的best practice。这里有一段有趣的视频,是在某个敏捷开发大会上对许多嘉宾的采访,采访的主题就是“How does Agile affect testing”,从回答中你会发现,似乎没有任何人能够准确的回答这个问题。从采访片段中我听到的观点有:
1. 敏捷开发有不同模型,不同的模型会以不同的方式影响测试(废话─我的comment)
2. 敏捷测试需要工具的支持…(貌似卖工具的厂商喜欢隐晦的这么表达)
3. TDD方法要求测试优先,其实除了测试优先外,我认为测试也可以和开发同时进行;
4. 敏捷过程中的测试是一个integration的任务,在不同层面(单元测试,集成测试,系统测试,用户验收测试)均需要按照敏捷的方式组织测试,目的是符合敏捷方法的价值观。
在这些观点中,我最喜欢的是第4个观点,这也是一直以来我的认识,其实敏捷本质上并非是一个过程,而是一种理念。至于敏捷测试这个敏捷开发的同源产物,自然也会继承其中的“目标驱动”而不是“过程驱动”的特性。
个人认为,敏捷测试和传统测试观点最大的不同在这几个地方:
敏捷测试并不倾向于严格区分开发和测试角色,全体工程师对于质量具有同等的责任,测试任务由开发和测试工程师共同完成;
敏捷测试的迭代周期很短,为了在很短的迭代周期中完成测试任务,要求建立“足够好”的验收测试,建立足够的自动化测试;
敏捷测试不严格依赖于文档(需求,设计等),测试角色必须和其他成员以及客户有良好的沟通,以保证建立的质量标准符合用户的需求,以及能够使用项目中的相关知识建立合理的测试框架;
关于底层测试和关于代码质量是敏捷测试中的一个非常好的实践。
其中,对传统测试观点最大的冲击是第1和第3点,打破测试角色和开发角色之间的严格限定,用沟通而不是文档作为建立测试的基础,这些的确会让一个熟悉传统测试环境的测试工程师骤然间不知所措。拿我来说,N年前我自认为对敏捷测试有一定的了解,结果真正进入到一个敏捷测试项目的时候才发现仍然需要一段时间来改变自己的工作方式和习惯。不过一旦习惯了这种方式,我转变成了一个彻底的敏捷测试的鼓吹者 ─ 毕竟,敏捷测试为产品质量产生的价值,让团队成员得到的成就感和喜悦是实实在在能够看得到的。
在本系列的第一部分中,(敏捷测试感悟之一)我们简要回顾了敏捷开发,以及敏捷测试与传统测试的不同。在第一部分中,我们特别提到,敏捷测试的要点之一就是,不依据于角色而是依据于任务来考虑整个开发过程中的测试。
但是,对一个开发组织来说,组织中一定存在开发工程师和测试工程师的角色划分,作为一个敏捷团队中的测试工程师,他的主要工作职责是什么呢?或者说,他可以在哪些工作上发挥自己的作用呢?
敏捷过程中与测试相关的任务很多,概括说来有如下一些:
1. 建立不同级别的测试验收标准(也就是test suite),包括单元测试、集成测试、系统测试等各个层面的验收标准;
2. 推动整个组织的质量文化,保证整个组织的成员在质量责任与目标方面达成一致;
3. 通过技术或是管理的手段,保证产品、代码具有良好的可测试性;
4. 通过自动化测试手段缩短每个产品发布周期中测试所需的时间;
5. 与客户沟通确认客户可接受的软件质量标准,并建立针对此标准的验收测试;
6. 深入了解应用系统和业务需求,通过探索性测试方法设计有效的测试用例,发现产品中的缺陷;
7. 建立对整个团队可见的质量度量体系,保证整个团队能够随时看到产品的质量度量值。
这些工作都可以是敏捷团队中测试工程师角色的工作任务,但显然,在现实中,不太可能要求所有这些工作都由测试工程师来承担─同时,让测试工程师承担全部这些工作任务也并不合理,某些工作由开发工程师角色,或是由开发工程师和测试工程师共同承担更为合理。
接下来,我更详细的把列出的这7项工作中非常成“测试工程师必须完成的工作”,“测试工程师需要去推进的工作”,以及“能为项目带来巨大价值的工作”。
1. 测试工程师必须完成的工作:
与客户沟通确认客户可接受的软件质量标准,并建立针对此标准的验收测试;
深入了解应用系统和业务需求,通过探索性测试方法设计有效的测试用例,发现产品中的缺陷;
建立系统和用户验收级别的测试验收标准;
通过自动化测试手段缩短每个产品发布周期中测试所需的时间;