写点什么

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:56980
用户头像

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

关注

评论

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

服务降级的常见套路

松花皮蛋me

Java

基于RocketMQ实现分布式事务 - 完整示例

清幽之地

Java 分布式事务 RocketMQ 微服务

聊聊分心这件事

Jackey

特定系统的Linux的构建

韩超

苏宁云商向江旭:是时候让技术成为新司机了!

TGO鲲鹏会

中台之路,从平台到中台的思考与实践(一)

孤岛旭日

架构 中台 企业中台 企业架构

从西游到武侠——确定性与不确定性

伯薇

个人成长 管理 确定性 不确定性

Gitlab CI/CD 中的 Cache 机制

Chong

DevOps gitlab cicd

Doris 一种实时多维分析的解决方案

迹_Jason

大数据

高手和普通人的差距,不看不知道,一看吓一跳

熊斌

学习

ELF文件格式

韩超

【JAVA】感受下JDK14的空指针提示

遇见

Java jdk jep

中台之路,从平台到中台的思考与实践(二)

孤岛旭日

架构 中台 企业中台 企业架构

人间至味——苦瓜

三只猫

人生 美食 生活

纯技术改造,技术如何驱动需求,我有话说

一叶而不知秋

项目管理 架构 技术

面试官,不要再问我三次握手和四次挥手

猿人谷

面试 TCP 三次握手 四次挥手

微服务架构深度解析与最佳实践-第一部分

kimmking

微服务 最佳实践 深度解析 高可用

百度主任架构师谭待:打造非职权技术管理机制

TGO鲲鹏会

NVidia-Docker2 性能优化

薛磊

Docker gpu nvidia container

[KubeFlow] MPI-Operator深度解读

薛磊

Docker gpu kubeflow Kubernetes

Docker Swarm 踩坑

Steve

Docker Docker Swarm 技术 容器 踩坑

程序员通过哪些方式来赚钱?

一尘观世界

程序员 外包 自由职业 副业 赚钱

redis数据结构介绍-第一部分 SDS,链表,字典

Nick

redis 源码 数据结构 源码分析 算法

Linux的proc文件系统编程

韩超

自动驾驶复苏在2020

陈思

人工智能 自动驾驶

NVidia Docker介绍

薛磊

Docker

字节跳动的增长密码

池建强

字节跳动 张一鸣

3000w人民币的学费——我的决策反思

孤岛旭日

数据中台 架构 中台 企业中台 企业架构

我使用了哪些生产力工具?

Steve

效率工具 软件 Alfred Notion 推荐

开源这件事儿,越来越“声势浩大”了

赵钰莹

Apache GitHub 阿里巴巴 开源 腾讯

Kylin 实时流处理技术探秘.笔记

迹_Jason

大数据

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