《Cucumber:行为驱动开发指南》——第6章 Cucumber常见问题及解决之道 6.1感受痛苦

第6章 Cucumber常见问题及解决之道

如果团队是第一次用Cucumber,用不了多久你就会注意到自己写的代码bug比以前少了。你发现自己可以勇敢地重构那些以前碰都不敢碰的代码。看到自己的第一个场景通过时的那种喜悦,鼓舞着你不断添加一项又一项特性。

然而,一段时间后,事情开始变味了。突然间你发现测试运行的时间实在太长;或者你开始注意到有几个场景会随机地失败,而且通常是在紧张的工期已经临近的时候;也可能不懂技术的利益相关人对这种开发过程兴趣渐失,只剩下开发人员还在阅读那些特性。人们甚至开始问这样的问题:

Cucumber是不是妨碍了我们的工作?

好消息是,这些问题都是有办法解决的。我们在教练和顾问咨询工作中曾见过各种各样的团队在学习使用Cucumber时遭遇各式各样的问题。在本章中,我们将描述曾经见过的最常见的问题。我们会帮你理解这些问题的根源,给出应对它们的建议,或者,更理想一点儿,从一开始就避免它们。本章没有太多代码,但有大量有用的建议。

我们首先从问题入手,描述你的团队可能经历的4种不同症状,然后我们会深入分析这些问题背后的原因,最后考察解决的方法。到本章结束时,你应该会对如何帮助团队从长远角度成功运用Cucumber持有更大的信心。

6.1 感受痛苦

我们从Cucumber出现问题时团队可能感受到的痛苦中找出了主要的4种类型。看看其中有没有你熟悉的。

下面我们仔细看看上表中所示的每一种症状。

6.1.1 闪烁的场景
一个场景,同样的源代码同样的环境,昨天还能通过,今天却失败了,我们将这种情形称为闪烁的场景。下面是我们对闪烁的场景的定义。

闪烁的场景
闪烁的场景偶尔失败,随机失败。同一个场景在相同环境的同一套代码库上运行,大多数时候能通过,有时却失败。这些似乎难以控制的失败使团队对测试、代码和自身都失去了信心。

闪烁的场景最让人讨厌的一点是:一旦你尝试重现它以便修复时,它反而不再失败了。修复闪烁的场景是最困难的任务之一,也是最重要的任务之一。一组自动测试套件要想有用,团队必须完全信任它。如果连单个测试都在破坏这种信任,那就会腐蚀团队中各个成员对整个测试套件的信任感。

为修复闪烁的场景,你必须研究代码,努力搞清楚它为什么会发生。这是一种科学过程:对失败原因做出一种假设,设计一个实验来证实或证伪这一假设,然后执行实验看自己是否正确。你可能需要多次重复这一循环才能找到问题的答案,如果闪烁的场景总是间歇地失败,执行一个实验可能需要好几天。如果想法儿用光了,宁可考虑将整个测试删除,也不要由着它自行选择失败的时间再回来折腾你。
6.1.2 脆弱的特性
你感觉测试套件让你几乎无法写代码,因为总会有明显不相关的测试亳无理由地失败,我们将这种情况称为脆弱的特性。下面是我们对脆弱的特性的定义。

脆弱的特性
脆弱的特性极易被破坏。特性脆弱时,在测试套件或主代码库的某个部分做些必要的修改会破坏明显不相关的场景。

遇到脆弱的场景时,通常你是在做其他事情的时候。你被不期而至的失败中断了,只好赶紧花时间去修复这意料之外的测试失败。运气不好的日子里,这种情况会多次发生,害你深陷其中而迟迟不能自拔。脆弱的特性具有自我实现性:当开发人员察觉到自己的测试脆弱不堪时,他们常常就更没有勇气重构或清理测试代码,相反他们会尽量快进快出,以求早一点远离是非之地,于是测试和产品代码便越来越难维护了。
6.1.3 缓慢的特性
每次往测试套件中添加一个新的场景,便在测试运行的总体时间中增加了几秒。对一个用户不断要求新特性的成功应用来说,测试运行的时间只会变得越来越长。长时间的测试正慢慢向你靠近:一开始5分钟已经够让人难耐了;之后,15分钟,虽然糟糕,但你已经习惯了在它运行时去喝杯咖啡;用不了多久,等你喝完咖啡回来它依然没有结束,15分钟变成了25分钟;然后在不知不觉中,你的特性已经需要运行一小时甚至更长时间了。

新的场景一旦通过,继续运行它的主要原因就是获得反馈:如果你不小心破坏了它所检查的功能,你希望场景可以给出警告。可随着测试运行的时间越来越长,这种反馈的价值也就减少了。项目构建太慢时,开发人员在提交代码前便不再运行全部测试,转而依靠持续集成服务器来提供反馈。如果多名开发人员同时这么做,他们所做的全部修改能集成到一起的概率也就不敢指望了,失败的构建于是就成了家常便饭。

测试运行时间长还意味着人们不敢动手对Cucumber测试做重构或其他常规维护。如果某个步骤定义在340个场景中使用,重构其代码是骇人的,因为你需要运行全部340个场景才能确切地知道自己的改动有没有破坏了什么。
6.1.4 厌倦的利益相关人
有的团队尝试使用Cucumber,最终却只把它当做了测试脚本的自动化工具,这样的团队中,最常听到的一句抱怨就是“利益相关人不愿阅读我们写的特性”。但也有许多团队证实Cucumber确实能带来改观,有助于开发团队更加有效地同业务利益相关人协作。这两种不同的体验差别源自哪里呢?

答案的一部分在于要从一开始就同业务利益相关人建立正确的协作关系。如果他们觉得自己太忙,没时间帮你准确理解他们想要的东西,那么你面对的是一个更深层的团队问题,Cucumber爱莫能助。但另一方面,许多团队开始时倒是有热心主动的利益相关人,可团队却浪费了Cucumber带来的建立这种协作关系的机会。如果测试人员或开发人员独自编写特性,他们就难免使用技术术语,这样利益相关人在阅读的时候会觉得自己被边缘化了。这会变成恶性循环:利益相关人本来可以帮助你使用对他们有意义的语言编写特性,但随着兴趣渐失,他们花在这上面的时间会越来越少。不知不觉中,特性就沦为纯粹的测试工具了。
团队中一旦发现这类症状,就需要知道如何处理。这正是调查工作背后存在的问题并考虑应对措施的时机。

时间: 2025-01-19 12:43:15

《Cucumber:行为驱动开发指南》——第6章 Cucumber常见问题及解决之道 6.1感受痛苦的相关文章

“Cucumber行为驱动开发指南”能带给我们什么

介绍 或许你已经了解到了软件开发中一个头疼的事,就是如何产生正确的需求和围绕这些需求如何有效地进行软件开发?但又不知如何着手? 或许你已经了解到了一些相关的理论知识来解决这个难题,如:行为驱动开发(BDD),验收测试驱动开发(ATDD),实例化需求(Specification By Example),但却发现很难消化所有的信息? 或许你已经建立了一套相关的自动化测试,但总觉得在为测试而测试,没有解决实际问题,有点脱钩? 或许你已经开始着手建立自动化测试来做保障,但对那么多的工具无从选择? 也或许

《Cucumber:行为驱动开发指南》——第1章 为何使用Cucumber 1.1自动化验收测试

第1章 为何使用Cucumber 软件始于一个想法. 我们假设这是一个优秀的想法--一个能让世界变得更加美好,或者至少能让一些人赚到一些钱的想法.而软件开发人员所面临的挑战就是要落实这个想法,使其能真正产生效益. 最初的想法是完美.漂亮的.如果拥有该想法的人碰巧是一个天才软件开发人员,那事情就非常简单了:他无须向任何人解释就能直接把想法实现成可工作的软件.然而更常见的情况是,拥有最初想法的人并不具备使其想法变为现实所必需的编程技能,因此这个想法必须从他的脑中传递到另外一些人的脑中.也就是说,相关

jBPM-4.0中文开发指南-第13章 执行模式

第 13 章 执行模式 这里有三种基本的流程执行模式:对象,持久化和嵌入. 对于持久化和嵌入执行模式, 流程执行必 须在一个事务中执行.在那种情况, 流程执行必须放在一个环境的内部. 环境将用来绑定流程执行,更 新到一个应用事务的事务中. 环境可以被用来绑定,比如一个JDBC连接, JTA,BMT,Spring事务等等. 13.1. 对象执行模式 对象执行模式是使用流程虚拟机的最简单形式. 这意味着通过客户端API直接使用流程定义和执行对 象. 让我们通过一个例子演示这个. 我们通过创建一个Cl

jBPM-4.0中文开发指南-第6章 流程剖析

第 6 章 流程剖析 上面我们已经简要的接触了两个主要的流程结构: 活动,转移和活动组合. 这一章研究了流程定义结构的全部可能. 这儿基本有两个流程定义方式:基于图形和组合流程语言. 首先,流程支持这两种情况. 每个基于图形的执行和活动组合可以用来组合一些像UML超级状态的实现. 甚至,自动功能活动可以被实现, 所以它们可以使用转移和活动组合. 开发指南-第6章 流程剖析-jbpm开发入门指南"> 图 6.1. 逻辑流程结构的UML类图 下一步我们会显示一系列的实例图形结构, 这可以组成P

jBPM-4.0中文开发指南-第5章 实现基本活动

第 5 章 实现基本活动 这一章解释了流程定义的基础,流程虚拟机给予的功能 以及活动实现是如何构建的. 同时,客户端 API被用来执行包含了那些活动实现的流程. 5.1. ActivityBehaviour PVM库没有包含完整的流程结构. 作为替代的是,活动的运行时行为被委派给一个 ActivityBehaviour. 换句话讲,ActivityBehaviour是一个接口,它用来在纯java环境实现流程结构的运 行时行为. public interface ActivityBehaviour

jBPM-4.0中文开发指南-第4章 架构

第 4 章 架构 4.1. APIs 流程虚拟机包含4个集成的API,在不同的执行模式下,覆盖完整的流程工作. 每个API都有特定的目的,满足下面的架构. 开发指南-第4章 架构-jbpm开发入门指南"> 图 4.1. 流程虚拟机中的4个API 服务接口用在应用代码中,与流程虚拟机进行交互,它将运行在支持事务的持久化模式下,后端基于数据库. 这是用户将PVM作为一个工作流引擎使用的最常用的方式. 如果不想使用持久化方式执行流程,可以直接使用客户端API来处理流程和执行对象. 客户端API对

jBPM-4.0中文开发指南-第2章 流程虚拟机

第 2 章 流程虚拟机 为了通过插件方式容纳多种流程语言和活动,jBPM基于了流程虚拟机. 本质上,流程虚拟机是一个特定的可执行图形的框架. 一个流程定义表现为一个执行流, 它拥有可以表现为图形的一种结构. 流程虚拟机将流程定义从活动行为中切分了出来. 流程虚拟机从一个活动到下一个获得获取可执行的流程, 并将活动的行为委派给可插拔的Java类. 这里有一个API(ActivityBehaviour)用来作为 流程虚拟机和活动行为代码的接口.像jPDL这类的语言仅仅是 一系列活动行为的实现和解析器

Google Web App开发指南第三章:案例研究

旅程计划应用(Wayfindit: Trip Planner App) 在大多数情况下,Wayfindit的应用必须有很好的易用性.旅行是一件很复杂的事情,不管是商业旅行还是休假旅行,一个顺利的旅程要求从家门到目的都没有意外之忧.Wayfindit的应用要能给旅行者提供所需信息,并且要快而准确.这意味着它需要一个最小的.直观的.响应式界面,能在前端提供有关内容的重要信息--HTML5的地理感知和离线存储特性实现. 一个完美的袖珍指南 它就装在你的口袋里或者包里,即时提供信息.它拥有本地存储和地理

Knockout应用开发指南 第三章:绑定语法(3)

原文:Knockout应用开发指南 第三章:绑定语法(3) 12   value 绑定 目的 value绑定是关联DOM元素的值到view model的属性上.主要是用在表单控件<input>,<select>和<textarea>上. 当用户编辑表单控件的时候, view model对应的属性值会自动更新.同样,当你更新view model属性的时候,相对应的元素值在页面上也会自动更新. 注:如果你在checkbox或者radio button上使用checked绑定