AICon 北京站 Keynote 亮点揭秘,想了解 Agent 智能体来就对了! 了解详情
写点什么

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

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

关注

评论

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

五周 - 总结

水浴清风

go-zero 如何扛住流量冲击(二)

万俊峰Kevin

microservice Go 语言

和同事交流不会kafka怎么行,API奉上,不是大神也能编

小Q

Java 学习 架构 面试

架构师训练营第 10 周学习总结

netspecial

极客大学架构师训练营

Python进阶——什么是上下文管理器?

Kaito

Python

阿里要求其内部程序员必须精通的并发编程笔记:原理+模式+应用

Java架构追梦

阿里巴巴 编程 面试 并发 java架构

多线程源码明白了吗?不明白的话来看腾讯大牛给你画的面试重点

小Q

Java 学习 架构 面试 线程

Linux IO模式及 select、poll、epoll详解(含部分实例源码)

linux大本营

c++ Linux 后台开发 异步IO epoll

tcp/ip协议栈——epoll的内部实现原理

Linux服务器开发

后端 TCP/IP epoll 网络协议栈 服务器开发

Week 10 作业

黄立

白皮书丨关于工业互联网,你想知道的都在这儿

华为云开发者联盟

工业互联网 华为云 白皮书 ICT 智能

讲真,你知道Python咋来的吗?

华为云开发者联盟

Java Python 编程语言 C语言 代码

如何应对Spark-Redis行海量数据插入、查询作业时碰到的问题

华为云开发者联盟

数据库 redis spark 开源 数据

精心整理MySQL基本使用(数据库的操作、数据类型、MySQL的常用命令)

ShenDu_Linux

c++ MySQL 程序员 数据类型

《具有算法和程序的离散数学基础》PDF免费下载

计算机与AI

算法 离散数学

Redis面试受阻?阿里P8架构师整理出的核心笔记+实战+面试题+脑图送你

比伯

Java 编程 程序员 面试 计算机

架构师训练营第 1 期 - 第十周总结

Todd-Lee

极客大学架构师训练营

数仓搬迁:从方法到实践,带你解决数据一致性对比

华为云开发者联盟

数据仓库 数据 存储 数据校验 搬迁

区块链技术赋能信息通信行业信用监管

CECBC

区块链 信用

学习工作即游戏:游戏化生存的现实物语

脑极体

深入浅出Spark

大数志

大数据 spark 数据科学

一张图彻底理解Spring如何解决循环依赖!!

冰河

spring aop ioc 源码解析 循环依赖

我是如何在五年阿里面试官的连珠炮问下三面斩获Java岗offer,最后定级P6的呢?

Java~~~

我就不信2W字把源码拆的这么碎,你还不明白mybatis缓存

996小迁

Java 源码 架构 面试 mybatis

架构师训练营第十周课后作业

Gosling

极客大学架构师训练营

让“数字鸿沟”变为“数字通途”

CECBC

数字化时代 支付产品

清华大佬马士兵告诉你从阿里P5级一直学到P8架构师的成长路线+视频教程!

比伯

Java 编程 架构 面试 计算机

架构师训练营第 1 期 - 第十周作业

Todd-Lee

极客大学架构师训练营

食堂就餐卡系统UML设计

简简单单

WSL2:我在原生的Win10玩转Linux系统

梁桂钊

iOS 项目避坑:多个分类中方法重复实现检测

iOSer

ios 项目管理 编程语言 iOS Document

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