写点什么

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

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

关注

评论

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

LLM 大模型学习必知必会系列(一):大模型基础知识篇

汀丶人工智能

prompt 工程 检索增强技术RAG LLM大模型

Hologres RoaringBitmap在Lazada选品平台的最佳实践

阿里云大数据AI技术

大数据 阿里云 hologres

基于需求文档、设计文档、测试用例的测试答疑助手

测吧(北京)科技有限公司

测试

嘉为蓝鲸WeOps渠道沙龙:携手业界精英共探数字化运维新篇章

嘉为蓝鲸

weops IT 运维

纬湃科技第一季度以稳健业绩开启2024财年

财见

关于Java Chassis 3的契约优先(API First)开发

华为云开发者联盟

华为云 华为云开发者联盟 企业号2024年5月PK榜 Java Chassis 3

LED无线显示屏的特色与优势

Dylan

性能 加密 信息 无线 LED显示屏

Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

王中阳Go

Go golang 微服务 Go进阶 gozero

【GaussDB(for MySQL)】 Big IN查询优化

华为云开发者联盟

数据库 华为云 华为云开发者联盟 华为云GaussDB(for MySQL) 企业号2024年5月PK榜

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

汀丶人工智能

Prompt工程

基于需求文档、设计文档、测试用例的测试答疑助手

测试人

人工智能 软件测试 测试开发

淘宝商品详情API接口:实时更新商品信息与数据

技术冰糖葫芦

API 编排 API 文档 API】 API 策略 pinduoduo API

一文了解基于ITIL的运维管理体系框架

嘉为蓝鲸

ITSM ITIL 运维管理

一图带你解锁数字化运维的建设思路

嘉为蓝鲸

数字化运维 IT 运维

嘉为蓝鲸受邀出席 2024 GOPS 全球运维大会 · 深圳站

嘉为蓝鲸

数字化运维 Ops GOPS大会

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