《Cucumber:行为驱动开发指南》——6.4 停掉生产线和缺陷预防

6.4 停掉生产线和缺陷预防

在团队的所有活动中,哪一件是你觉得最重要的:为新特性编写代码?修复测试中发现的bug?修复生产环境中发现的bug?加速新特性的开发?

令人遗憾的是,在大多数软件团队的优先级列表中,测试的维护都不会出现在靠前的位置。如果办公室大楼里的升降梯坏了,可以确信立刻会有人给设备团队的人打电话。而当测试变得缓慢或脆弱时,除了依赖于它的程序员和测试人员,其他人都不会看到问题的存在。如果你多少还做些测试维护的工作,通常也只在事情坏到令你无法继续忍受,或者因为测试被严重破坏以致产品无法直接发布的时候才做。似乎总是有更重要的事情等着你做。

对测试采取这种思路的团队成员是完全错误的。对依赖于自动测试的团队来说,自动化测试就是团队的心跳,团队需要用一丝不苟的小心和关注来维持它的健康。

丰田的“停掉生产线”
在丰田的制造厂里,每次出现问题时,车间的每位工人都有权力和职责停掉整条生产线。问题马上会得到经验丰富的员工给予的全力关注,且只有等问题得到解决生产线才会重新启动。生产线重新启动之后,会有一个小组负责对问题实施根源分析(root-cause analysis),弄清发生的原因,从而从根源上解决问题。

大野耐1先生第一次提出这一想法时,生产经理们认为他疯了。那时,人们觉得在制造行业最重要的事情当然是让装配线保持运行,必要时每日每夜都不间断。

大野耐先生第一次向经理们提出实现这种新的系统时,有的人听从了,有的人根本不听。一开始,实施了这一策略的经理们发现他们的生产率下降了。每次遇到问题都马上停下来处理降低了它们的产量,而且当他们将产出数字同那些无视老板想法的经理们进行比较时,看上去似乎是老板错了。

然而,慢慢地那些允许生产线停下来处理每个问题的经理们开始发现他们的生产线上停工的情况越来越少了。因为每个问题都以缺陷预防的策略得到处理,这些生产线开始不断为改善机器的质量和运营的过程提供投入。很快,这些生产线的产量便大大超过了那些对貌似发疯的老板阳奉阴违的经理们所控制的生产线。那些经理们的生产线仍然沿着旧时的频率定期地哐啷罢工,被同样的老问题反复地折磨着。

缺陷预防
丰田反直觉却又取得巨大成功的“停掉生产线”策略之所以有效,是因为它是一种更全面的策略——缺陷预防——的一部分,缺陷预防关注于持续改善生产系统。若没有这种更全面的过程,“停掉生产线”的效果将微乎其微。缺陷预防过程分为以下4步。

(1)检测异常情况。

(2)停下手边的工作。

(3)修复或纠正眼下的问题。

(4)调查根源并实施对策。

这4个步骤非常重要,因为它能抓住手边的问题所提供的机会,从而理解过程中一些更为根本的东西。它也意味着让修正问题成为一种习惯,而不是可以推到日后不忙时的一件事情。

举个例子,假设构建被一个失败的测试破坏了。调查原因,发现有个家伙在提交代码之前没有运行所有测试,就是他提交了导致测试失败的代码。他为什么不运行所有测试呢?好吧,是因为他觉得运行测试需要太长的时间,他只运行了自认为覆盖他的改动的那部分测试,然后双手合十祷告一下便直接提交了代码。所以,底层的原因的是特性运行得太慢。理解了问题的根源之后,我们就可以着手修复它了。

有些团队维护一份构建失败的日志,其中记录着每次失败的根源。当有足够的证据证明某个特定的根源有必要处理时,他们便会集中精力来妥善处理它。

把你的团队想象成一条生产线,它为用户生产有价值的特性。如果你发现有个问题在降低它的产出速度,那就停掉生产线,把问题永久修复。实现“停掉生产线”这一策略意味着你决定把获得一套快速、高质量且可靠的测试列为整个团队的头等大事,仅次于处理影响客户的生产问题。当测试出现问题——不论是测试失败这种紧迫的问题,还是闪烁的场景这种无休止的烦恼——都要把最佳的人选推上去,永久地修复它。

时间: 2024-11-22 20:18:02

《Cucumber:行为驱动开发指南》——6.4 停掉生产线和缺陷预防的相关文章

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

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

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

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

《Cucumber:行为驱动开发指南》——1.2 行为驱动开发

1.2 行为驱动开发 行为驱动开发(Behaviour-Driven Development,BDD)1建立于测试驱动开发的基础之上,它标准化了那些优秀TDD实践者的良好习惯.优秀的TDD实践者以自外向内的方式开发软件,最初他们会编写一个失败的客户验收测试,该测试从客户的视角描述系统的行为.作为BDD实践者,我们细心编写验收测试,作为所有团队成员都能读懂的实例.我们使用这个编写实例的过程来获取业务人员的反馈,以便在开始实现软件之前,我们就知道自己是否是在编写正确的软件.在此过程中,我们会主动开发

《Cucumber:行为驱动开发指南》——6.5 我们学到了什么

6.5 我们学到了什么 Cucumber特性对公司来说是一笔宝贵的财富.我们曾见过有团队将他们系统中大块大块的部分推倒重写,知道自己有一组准确的.可执行的规范来确保新的方案会运行得跟原来一样好,他们自不必担心什么.对这些团队来说,特性比产品代码本身更有价值.如果你打算在编写Cucumber特性上面做些投入,那就要照管好这些特性,让他们为整个团队带来尽可能多的益处,从而保护好这笔投入.不要迁就于缓慢的特性.间歇失败的特性或者团队中只有一部分人阅读的特性:问题一旦出现立该将其消除,让每个问题成为一个

《Cucumber:行为驱动开发指南》——2.8 让测试通过

2.8 让测试通过 既然已经有了可靠的失败场景,那就是时候让这个Cucumber场景指导我们编写解决方案了. 有一个非常简单的方案能让测试通过,但该方案其实不会有实际的帮助,不管怎样我们先试一下,哪怕为了好玩儿: 下载first_taste/08/calc.rb print "4" 试试运行cucumber,你会看到场景最终通过了: ... 1 scenario (1 passed) 3 steps (3 passed) 0m0.025s 很好!不过这个方案有什么问题呢?毕竟我们说过希

《Cucumber:行为驱动开发指南》——6.2 同心协力

6.2 同心协力 6.2.1 偶然细节考虑下面这个为在线邮件客户端编写的场景: Scenario: Check inbox Given a User "Dave" with password "password" And a User "Sue" with password "secret" And an email to "Dave" from "Sue" When I sign in

《Cucumber:行为驱动开发指南》——6.3 照管好你的测试

6.3 照管好你的测试 自动化特性的好处在于你可以把它们作为活文档来长期信赖,因为你会将每一个场景都用于检查产品代码,以确保它们仍然有效.对于同代码打交道的程序员来说,这还有另一件好处:在他们开发系统的时候,那些测试可以充当安全网,对任何破坏已有行为的错误都给出警告. 因此,你的特性可以充当一种反馈机制,对整个团队来说提供关于系统行为的反馈,对程序员来说还能提供是否破坏已有行为的反馈.想让这些反馈循环带来好处,测试需要执行迅速,还需要可靠.我们首先来看看影响测试可靠性的问题.6.3.1 渗露的场

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

第6章 Cucumber常见问题及解决之道 如果团队是第一次用Cucumber,用不了多久你就会注意到自己写的代码bug比以前少了.你发现自己可以勇敢地重构那些以前碰都不敢碰的代码.看到自己的第一个场景通过时的那种喜悦,鼓舞着你不断添加一项又一项特性. 然而,一段时间后,事情开始变味了.突然间你发现测试运行的时间实在太长:或者你开始注意到有几个场景会随机地失败,而且通常是在紧张的工期已经临近的时候:也可能不懂技术的利益相关人对这种开发过程兴趣渐失,只剩下开发人员还在阅读那些特性.人们甚至开始问这

《Cucumber:行为驱动开发指南》——2.1 理解我们的目标

第2章 Cucumber初体验 我猜你已经等不及要立刻试试自己的"新玩具"了,下面我们通过一个简单的例子来体会一下使用Cucumber工作是怎样的感觉.在此过程中你也许无法完全理解其中的某些部分,但不必担心,接下来的几章我们会回过头来补充相应的细节. 我们将以由外向内的方式构建一个简单的命令行应用程序,整个开发过程由Cucumber驱动.注意我们是如何小步前进的,每次修改之后我们都会回头运行一下 Cucumber.这种不厌其烦的节奏对于有效使用Cucumber非常重要,关于这一点,实际