本文的例子参考 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