《Cucumber:行为驱动开发指南》——2.5 运行程序

2.5 运行程序

接下来我们实现下一个步骤,编辑 features/step_definitions/calculator_ steps.rb,修改第二个步骤定义如下:

下载first_taste/04/features/step_definitions/calculator_steps.rb
When /^the calculator is run$/ do

 @output = `ruby calc.rb #{@input}`
 raise('Command failed!') unless $?.success?
end

这段代码试图运行我们的计算器程序calc.rb,同时传入上一个步骤保存下来的输入,并用另一个实例变量保存输出。接下来它检查一个名字很特别的(实际上是很隐晦的)Ruby变量$?,来核实命令是否成功运行了,如果运行失败则抛出一个错误。记住,如果步骤定义抛出一个错误,Cucumber就会将步骤标记为失败,这就是实现这个目的最简单的方法。

这时我们运行Cucumber,应该就能看到它真正去尝试运行计算器了:

Feature: Adding

 Scenario: Add two numbers   
  Given the input "2+2"    
ruby: No such file or directory -- calc.rb (LoadError)
  When the calculator is run  
   Command failed! (RuntimeError)
   ./features/step_definitions/calculator_steps.rb:10
   features/adding.feature:5
  Then the output should be "4" 

Failing Scenarios:
cucumber features/adding.feature:3 

1 scenario (1 failed)
3 steps (1 failed, 1 skipped, 1 passed)
0m0.026s

这次步骤失败了,因为我们还没有可运行的calc.rb程序。你应当看到Cucumber在步骤下面将抛出错误所产生的输出都用红色标亮了,这能帮助你定位问题。

你可能会想,明知calc.rb这个文件还不存在,却依然编写代码试图去运行该程序,这样做有点奇怪。我们是故意这么做的,因为我们想确保在深入到解决方法的实现之前拥有一个功能完备的测试。基于这条纪律编写测试意味着我们可以信任测试,因为我们看到这些测试失败了,当测试通过时我们就可以满怀信心地认为任务真的完成了。对于我们所谓的由外向内开发,这种优雅的节奏是其中的重要部分,初看起来这好像有点奇怪,我们希望通过本书展现这种开发方式的一些显著的益处。

由外向内开发还有另外一个好处:在未花任何精力实现计算器之前,我们就有机会从用户角度考虑计算器的命令行接口。而在这个阶段,如果我们意识到接口的一些问题,是非常容易做出改变的。

时间: 2024-10-26 16:31:37

《Cucumber:行为驱动开发指南》——2.5 运行程序的相关文章

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

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

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

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

基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南

原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南    5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或者外部数据库的查询,根据具体地需要,有几种做法: 1.使用Asterisk的通道变量.Goto函数.Gotoif函数等实现某些简单跳转,通过几个这样的函数的组合,实现简单的业务. 2.对终端接入用户的呼叫请求中的某些属性,进行简单的数据库增删改查,在Asterisk官方发布的asterisk-

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

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

《Cucumber:行为驱动开发指南》——2.7 添加一个断言

2.7 添加一个断言 继续遵照Cucumber的指示,我们需要为计算器程序创建一个Ruby文件.让我们暂时先创建一个空的Ruby文件,这样在转入解决方案之前,我们可以继续停留在外部并完成测试.Linux/Mac用户可以用如下命令创建空文件: $ touch calc.rb 如果用的是Windows,就无法使用touch命令了,可以用编辑器创建一个名为calc.rb的空文本文件,或者使用如下技巧: C:\> echo .> calc.rb 当我们再次运行cucumber的时候,就可以看到第二个步

《Cucumber:行为驱动开发指南》——1.4 Cucumber如何工作

1.4 Cucumber如何工作 在深入本书的核心内容之前,我们先简要介绍一个典型的Cucumber测试集,以帮助你了解Cucumber是如何工作的. Cucumber是一个命令行工具.运行时它会从普通语言编写的称为特性(feature)的文本文件中读取你的规格说明,解析需要测试的场景(scenario),然后针对你的系统运行这些场景以达到测试的目的.每个场景由一系列步骤(step)组成,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.3 照管好你的测试

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

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

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