本文的例子参考 The Cucumber Book
以前一直做单元测试,虽然不够彻底,但是一直有些坚持。在实践单元测试的过程中,总是会有一种感觉,无法从需要和总体上做程序,流程总是不顺畅。也许是我实践的办法不对吧。总是无法将测试驱动开发进行到底。在追赶的项目进度面前,早点搞定,成了我的座右铭。但是项目快结束后,看着自己的代码,我总有一种欲哭无泪的感觉,总想重构代码。但不敢下手,也无从下手。谁叫我的测试代码不够彻底呢。怕修改代码后,会带来新的bug。 现在实践一下故事驱动开发。其实对故事驱动开发非常有兴趣。因为我特别喜欢故事面板,一个项目,在我看来,无非就是一个一个的故事组成的。
- 工具
rails3.2
cucumber
- 新建项目
rails new squeaker --skip-test-unit
- 修改Gemfile文件
group :test do
gem 'cucumber-rails', '1.3.0'
gem 'database_cleaner', '0.8.0'
gem 'rspec-rails', '2.10.0'
gem 'factory_girl', '3.5.0'
end
bundle install
- create cucumber files for rails
rails generate cucumber:install
- 建立ctags索引
ctags -R --exclude=*.js --exclude=.log * . ~/.rvm/gems/ruby-1.9.2-p320/gems/
- 编写故事用例
Feature: 查看消息
Scenario: 查看其他用户的消息
Given 有一个注册用户A
And 用户A提交了一条信息 "这是我的消息"
When 我访问了该用户的页面
Then 我应该可以看到 "这是我的消息"
- steps 源代码
# -*- encoding: utf-8 -*-
Given /^有一个注册用户A$/ do
Factory(:user)
end
Given /^用户A提交了一条信息 "(.*?)"$/ do |arg1|
User.count.should == 1
Factory(:message, :content => arg1, :user => User.first)
end
When /^我访问了该用户的页面$/ do
User.count.should == 1
visit(user_path(User.first))
end
Then /^我应该可以看到 "(.*?)"$/ do |text|
page.should have_content(text)
end
- factory_girl的支持
require 'factory_girl'
FactoryGirl.define do
factory :user do |f|
f.username 'testuser'
end
factory :message do |f|
f.association :user
f.content 'Test message content'
end
end
- 新建两个model对象
rails g model user username:string
rails g model Message user_id:integer content:string
rake db:migrate db:test:prepare
- controller 和view略
整体结构把握好了,其他的就好做了
Given : context 运行的上下文环境
When : event 事件
Then: 结果 should
- 资源地址:
cucumber rails :https://github.com/cucumber/cucumber-rails
cucumber: https://github.com/cucumber/cucumber
分享到:
相关推荐
2.5 Windows的驱动开发模型 29 2.6 WDK编程中的特殊点 30 2.6.1 内核编程的主要调用源 30 2.6.2 函数的多线程安全性 30 2.6.3 代码的中断级 32 2.6.4 WDK中出现的特殊代码 32 第3章 字符串与链表 35 3.1 字符...
2.5 Windows的驱动开发模型 29 2.6 WDK编程中的特殊点 30 2.6.1 内核编程的主要调用源 30 2.6.2 函数的多线程安全性 30 2.6.3 代码的中断级 32 2.6.4 WDK中出现的特殊代码 32 第3章 字符串与链表 35 3.1 字符...
程序员常刷题TDD、RSpec 和 Learn 介绍 目标 定义代码测试的目的。 阅读 RSpec 测试。...通过learn命令运行测试。...再说一次,您暂时不会编写自己的测试,因此我们将仅简要介绍此过程。 从概念上讲,TDD 很简单: 首先
.NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的实现 .Net Framwork 强类型设计实践 通过反射调用類的方法,屬性,字段,索引器(2種方法) ASP.NET: State Server Gems 完整的动态加载/卸载程序集的解决方案 ...
资源介绍 本资源包是一个基于SSM(Spring、SpringMVC、MyBatis)框架与Vue....总的来说,本资源包是一个集学习、实践、开发于一体的优质资源,无论是对于毕业设计的学生还是对于Web开发爱好者来说,都具有很高的价值。
此项目不仅包含了完整的源代码,还附带了详细的毕业论文,为研究者提供了从理论到实践的全方位指导。毕业论文从项目背景、需求分析、系统设计、实现过程到测试与优化等方面进行了深入阐述,为其他类似项目的开发提供...
假如我们某一天因为某些原因,需要删除或格式化该分区,或者做一些会引起该分区序号变化的操作(比如用 pqmagic 在该分区前添加或删除分区),就需要预先重装一次grub,重新指定存放stage2文件的分区,否则将无法...
一次加密,多种许可形式完美兼容,假如您的用户不希望使用硬件,您可以在加密方案不变更的情况下,迅速切换至云锁或者软锁。 优势6:强悍的硬件性能 精锐 5 拥有精锐系列迄今运行速度最快的芯片,性能格外强劲。采用...
每一次运算操作的结果将影响和改变状态寄存器(SREG)的值。 使用条件转移、无条件转移和调用指令,可以直接访问全部Flash程序存储器空间以及控制程序的执行顺序。大部分AVR指令为单一16位格式,只有少数指令为32位...
//12M,一次6us,加进入退出14us(8M晶振,一次9us) } /******************************************************** * DS18B20初始化 * ********************************************************/ bit Ds18b20_...
游戏设计简洁明了,易于理解,适合初学者作为入门实践项目,也适合有一定编程基础的学生进行二次开发或定制。 论文部分详细介绍了项目的背景、设计思路、技术实现和测试过程,为读者提供了从构思到实现的全过程指导...
大数据需要落地,需要开源技术来驱动新一轮的变革,而HBase作为大数据落地过程中的神兵利器,已经一次又一次证明了其巨大价值。本书不同于其他HBase的翻译版书籍,由来自国内互联网最前沿的实战派资深人士撰写而成,...
而在章的内部,一项大的功能被分解成许多小的步骤,通过完成每个小的步骤,读者可以不断获得阶段性的成果,从而让整个开发过程变得轻松并且有趣。 本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作...
而在章的内部,一项大的功能被分解成许多小的步骤,通过完成每个小的步骤,读者可以不断获得阶段性的成果,从而让整个开发过程变得轻松并且有趣。 本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作...
如果你在安装过程中选定了使用某个开发环境,安装程序会在你安装的目录下生成一个en v-xxx.lnt的文件,例如选择了Source Insight就会有一个env-si.lnt文件。用编辑器打开 该文件,在该文件开始的注释中说明了...
问题在于,随着他们一次次的添加新的应用到这个系统里,系统也变得越来越松散、危险。因为他们并没有发现,在这众多的应用中,是有很多共同之处可以被剥离、被抽象、被统一的。当你将重复的代码按照一定的框架统一...
因此,对软件的维护也可以看成为对软件的再一次开发。在这个时期,对软件的维护主要涉及三个方面的任务,即改正性维护、适应性维护和完善性维护。 2.瀑布模型 瀑布模型诞生于20世纪70年代,是最经典的并获得最广泛...