写点什么

RSpec 增加了众所翘首以待的 RBehave 功能以供集成测试所需

  • 2007-10-31
  • 本文字数:2396 字

    阅读完需:约 8 分钟

RSpec 是 一个为 Ruby 编写的基于行为驱动开发(简称 BDD,即 Behaviour-Driven Development)的验收测试框架,同时也可用于 Java(事实上它一直都可以运行于 JRuby 中),它提供了一种机制,即由开发人员从业务中获取 验收标准并将它们转换为可读、可运行的示例,以此替代文档、测试和适用于业务的构建报告。

尽管 RSpec 对单元级测试很有用,但它在集成测试中一直存在一个盲点。Dan North 创建了一个独立的扩展, RBehave ,它用 Given…With…Then…这样的格式以一系列的步骤从故事级别来描述行为。(North 最早是在 JBehave 中描述了这种用于获得需求故事的模式)

David Chelimsky 现在已经向 RSpec trunk 中合并了一个纯文本故事运行器(Plain Text Story Runner),它给 RSpec 添加了 RBehave 功能,就像他 他的 博客中描述的那样。

现在看看North 的经典RBehave 示例:

So, North’s classic RBehave example:

require ‘rubygems’<br></br>require ‘rbehave’<br></br>require ’spec’ # for "should" method<p>require ‘account’ # the actual application code</p><p>Story "transfer to cash account",</p><br></br>%(As a savings account holder<br></br>  I want to transfer money from my savings account<br></br>  So that I can get cash easily from an ATM) do<p>  Scenario "savings account is in credit" do</p><br></br>    Given "my savings account balance is", 100 do |balance|<br></br>      @savings_account = Account.new(balance)<br></br>    end<br></br>    Given "my cash account balance is", 10 do |balance|<br></br>      @cash_account = Account.new(balance)<br></br>    end<br></br>    When "I transfer", 20 do |amount|<br></br>      @savings_account.transfer_to(@cash_account, amount)<br></br>    end<br></br>    Then "my savings account balance should be", 80 do |expected_amount|<br></br>      @savings_account.balance.should == expected_amount<br></br>    end<br></br>    Then "my cash account balance should be", 30 do |expected_amount|<br></br>      @cash_account.balance.should == expected_amount<br></br>    end<br></br>  end<p>  Scenario "savings account is overdrawn" do</p><br></br>    Given "my savings account balance is", -20<br></br>    Given "my cash account balance is", 10<br></br>    When "I transfer", 20<br></br>    Then "my savings account balance should be", -20<br></br>    Then "my cash account balance should be", 10<br></br>  end<br></br>end<br></br>

在新的 RSpec 中它可以变成这样,由一个 Ruby 文件定义可用的步骤:

class AccountSteps < Spec::Story::StepGroup<br></br>  steps do |define|<br></br>    define.given("my savings account balance is $balance") do |balance|<br></br>      @savings_account = Account.new(balance.to_f)<br></br>    end<p>    define.given("my cash account balance is $balance" do |balance|</p><br></br>      @cash_account = Account.new(balance.to_f)<br></br>    end<p>    define.then("my savings account balance should be $expected_amount" do |expected_amount|</p><br></br>      @savings_account.balance.should == expected_amount.to_f<br></br>    end<p>    define.then("my cash account balance should be $expected_amount" do |expected_amount|</p><br></br>      @cash_account.balance.should == expected_amount.to_f<br></br>    end<br></br>  end<br></br>end<p>steps = AccountSteps.new do |define|</p><br></br>  define.when("I transfer $amount") do |amount|<br></br>    @savings_account.transfer_to(@cash_account, amount.to_f)<br></br>  end<br></br>end<br></br>

在一个纯文本文件中按照那些步骤定义故事的行为: > Story: transfer to cash account<br></br>  As a savings account holder<br></br>  I want to transfer money from my savings account<br></br>  So that I can get cash easily from an ATM<p>  Scenario: savings account is in credit</p><br></br>    Given my savings account balance is 100<br></br>    And my cash account balance is 10<br></br>    When I transfer 20<br></br>    Then my savings account balance should be 80<br></br>    And my cash account balance should be 30<p>  Scenario: savings account is overdrawn</p><br></br>    Given my savings account balance is -20<br></br>    And my cash account balance is 10<br></br>    When I transfer 20<br></br>    Then my savings account balance should be -20<br></br>    And my cash account balance should be 10<br></br>

由一个 Ruby 文件将他们粘在一起,并运行这些故事:

require 'spec'<br></br>require 'path/to/your/library/files'<br></br>require 'path/to/file/that/defines/account_steps.rb'<p># assumes the other story file is named the same as this file minus ".rb"</p><br></br>runner = Spec::Story::Runner::PlainTextStoryRunner.new(File.expand_path(__FILE__).gsub(".rb",""))<br></br>runner.steps << AccountSteps.new<br></br>runner.run<br></br>

纯文本文件中的那些步骤描述,必须与 StepGroup 中定义的步骤相匹配,这些描述可能会随着步骤数量的增加变得难以理解。Aslak Hellesøy 正在为一个基于浏览器的编缉器工作,它将提供步骤的自动补全,并可以在恰当的位置对参数进行编辑,从而使这一问题得以简化。

查看英文原文 RSpec Trunk Now Includes RBehave-like Story Runner

2007-10-31 09:561279
用户头像

发布了 90 篇内容, 共 15.5 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

回“疫”录(22):我以为结束了,其实才开始

小天同学

疫情 回忆录 现实纪录 纪实

JVM源码分析之Java对象头实现

猿灯塔

JVM源码分析之synchronized实现

猿灯塔

JavaScript 基础拾遗(一)

hq

Java 学习 文章收集

为提升网点业务员效率,我们做的事情。

黄大路

商业

万字长文带你看懂Mybatis缓存机制

程序员小岑

Java 源码 技术 mybatis

我的编程之路-4(进阶)

顿晓

进阶 看书 编程之路

Redis6.0 多线程源码分析

代码诗人

redis 源码 技术 线程模型

竟然有人想看我的「日记」,满足一下大家

非著名程序员

学习 程序人生 提升认知

职场“潜”规则

L3C老司机

个人成长 职场 新人 人才培养 能力模型

推动敏捷,就是推动软件业变革

盛安德软件

敏捷 推动软件业变革

kotlin 200行代码开发一个简化版Guice

陈吉米

Java kotlin guice ioc mynlp

2020年全球经济萎缩,火花国际PLUS逆袭而来闪耀数字经济

极客编

关于架构的几件小事:System context

北风

系统架构 系统性思考 架构师 系统上下文 极客大学架构师训练营

SpringBoot瘦身

JFound

Spring Boot sprnig

当我们持续感觉很糟糕要怎么办

董一凡

写作 生活质量 情感

Django的ListView超详细用法(含分页paginate功能)

BigYoung

Python django ListView 分页

天天都是520

Neco.W

爱情 表白日

nginx 概念及上手

HelloZyjS

程序员需要了解的硬核知识大全

苹果看辽宁体育

Java c 计算机基础

Enhanced Github:一个 GitHub 专用的好插件

非著名程序员

GitHub 程序员 效率工具

Redis 命令执行过程(下)

程序员历小冰

redis 源码分析

Elastic Stack 系列专辑

Yezhiwei

elasticsearch Logstash Kibana ELK Elastic Stack

识别代码中的坏味道(四)

Page

敏捷开发 面向对象 重构 CleanCode 代码坏味道

如何做好 To B 的 SAAS 服务

路边水果摊

SASS 企业 服务

企业数字化转型:用 SpreadJS 打造互通互链的电力系统物联网

葡萄城技术团队

数字化转型 SpreadJS 电力

SQLite是什么

山楂大卷

sqlite 数据库 RDBMS 存储

Android | Tangram动态页面之路(五)Tangram原理

哈利迪

android

深入剖析ThreadLocal原理

JFound

Java

敏捷为什么会失败之「PA-SA-WAKA-DA」理论

易成研发中心

Scrum 敏捷开发 Agile

ARTS_20200520

凌轩

Java ARTS 打卡计划

RSpec增加了众所翘首以待的RBehave功能以供集成测试所需_研发效能_Sean Miller_InfoQ精选文章