写点什么

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

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

关注

评论

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

架构实战营 - 模块 7- 作业

泄矢的呼啦圈

架构实战营

碳中和的未来版图里,区块链如何“往上走”

CECBC

Protobuf与Json的相互转化

DoneSpeak

json protobuf serialization

SpringBoot解决CORS问题

DoneSpeak

springboot

LeetCode | 13. 罗马数字转整数

DoneSpeak

LeetCode algorithm

如何做好架构设计?

king

模块7作业 王者荣耀商城异地多活架构设计

高亮

架构训练营

Spring Event初步讲解

DoneSpeak

spring

架构训练营模块1作业

慕溶枫

#架构实战营

2021 年第 26 周 ARTS 打卡

Bryan

redis 网络 ARTS 打卡计划 归并排序 epoll

1.4如何做好架构设计

Lemon

区块链到底是什么?解读区块链的4大核心组件

CECBC

Java 工具箱 | 图片-Base64 互转

DoneSpeak

模块7作业

杨彬

#架构实战营

推荐系统的UI交互与视觉展示(二十七)

Databri_AI

人工智能 算法 推荐系统

快手处置多个违规账号:自媒体行业需要净化和规范

石头IT视角

模块7作业-王者荣耀商城异地多活架构设计

En wei

架构实战营

Protobuf与POJO的相互转化 - 通过Json

DoneSpeak

json protobuf serialization

Spring Security认证流程

DoneSpeak

spring security springsecurity

Go 并发编程-共享变量

Rayjun

Go 语言

架构设计方法论

king

王者荣耀商城异地多活架构设计

Vincent

架构训练营

送给正在迷茫的你!极其重要

欢喜学安卓

android 程序员 面试 移动开发

Hadoop知识点总结

五分钟学大数据

hadoop 7月日更

为easyexcel设置TimeZone

DoneSpeak

Excel Apache POI

架构训练营模块七作业

Geek_e0c25c

架构实战营

1.3面向复杂度的架构设计

Lemon

架构设计 架构设计原则

业务架构模块 7 作业

冬天的树

实现自己的Protobuf Any

DoneSpeak

protobuf

我用一个例子疏通“路由器漏洞&复现”【建议收藏!!】

网络安全学海

运维 网络安全 信息安全 漏洞分析 代码复现

建立区块链证据采信新规则

CECBC

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