您的位置:首页 > 编程语言 > Ruby

The RSpec Book笔记《一》初步认识TDD,BDD,RSpec,Cucumber

2012-11-15 00:19 337 查看
TDD(Test-Driven Development)测试驱动开发。

在编写代码之前先编写一个测试,这时候测试是失败的,red,因为还没有写对应的实现代码。然后开始编写实现的代码,然后跑刚才写的测试,直到测试通过,green。

然后我们就重构我们的代码,refactor,然后再次跑我们的测试,green重构成功,red重构失败。失败也没有关系,继续重构。而且有了测试的保证,我们可以很放心的重构。

TDD偏激的做法是,在没有编写测试之前,绝不写一行代码。软件开发,测试先行。用测试来驱动开发。

BDD(Behavior-Driven Development)行为驱动开发。

在应用级别,项目的利害关系人通常不关心数据被持久化到什么地方,什么格式,什么存储类型。当然不是说他们不关心数据,而是说他们更关心他们保存的数据,在他们需要的时候可以获取出来。

软件开发团队面临的主要问题就是沟通问题。BDD旨在通过简单的描述性语言来帮助解决沟通问题,软件就是:给出一个上下文环境,发生事件,然后得到预期的输出。

Given,When,Then是BDD的三个元素。

RSpec

RSpec是一个BDD框架。

Cucumer

BDD that talks to domain experts first and code second

更多的信息可以查看http://cukes.info/。

安装

gem install rspec

gem install cucumber


创建一个文件。

vi greeter_spec.rb


写入下面的内容那个。

describe "RSpec Greeter" do
it "should say 'hello, rspec!' when ti receive the greet() message" do
greeter=RSpecGreeter.new
greeting=greeter.greet
greeting.should == "hello, rspec!"
end
end


describe代表一组测试。

it代表一个测试。

我们首先初始化一个greeter,然后调用greet方法,然后看看预期的结果是否等于"hello, rspec!"。

运行下面的命令看看结果。

rspec greeter_spec.rb


结果是

uninitialized constant RSpecGreeter

RSpec告诉我们还没有定义RSpecGreeter类。就让我们在同一个文件中定义一个RSpecGreeter类。

class RSpecGreeter
def greet
"hello, rspec!"
end
end


然后再次执行rspec greeter_spec.rb,这次看到了。

Finished in 0.00059 seconds
1 example, 0 failures


这下成功了,这个有点像我们学习编程语言的时候写的helloworld。

在项目下创建两个目录

mkdir spec features


将刚才创建的greeter_spec.rb文件移动到spec文件夹

mv greeter_spec.rb spec/


在features文件夹中创建greeter_says_hello.feature文件

vi features/greeter_says_hello.feature


敲入下面的内容

Feature: greeter says hello

In order to start learning RSpec and Cucumber
As a reader of The RSpec Book
I want a greeter to say Hello

Scenario: greeter says hello
Given a greeter
When I send it the greet message
Then I should see "hello, cucumber!"


保存之后,回到项目根目录。

执行

cucumber features


可以看到下面的内容

Feature: greeter says hello

In order to start learning RSpec and Cucumber
As a reader of The RSpec Book
I want a greeter to say Hello

Scenario: greeter says hello           # features/greeter_says_hello.feature:7
Given a greeter                      # features/greeter_says_hello.feature:8
When I send it the greet message     # features/greeter_says_hello.feature:9
Then I should see "Hello Cucumber!" # features/greeter_says_hello.feature:10

1 scenario (1 undefined)
3 steps (3 undefined)
0m0.003s

You can implement step definitions for undefined steps with these snippets:

Given /^a greeter$/ do
pending # express the regexp above with the code you wish you had
end

When /^I send it the greet message$/ do
pending # express the regexp above with the code you wish you had
end

Then /^I should see "(.*?)"$/ do |arg1|
pending # express the regexp above with the code you wish you had
end


创建文件夹

mkdir -p features/step_definitions/

新建一个文件

vi features/step_definitions/greeter_steps.rb


在文件中输入

Given /^a greeter$/ do
@greeter = CucumberGreeter.new
end

When /^I send it the greet message$/ do
@message = @greeter.greet
end

Then /^I should see "(.*?)"$/ do |greeting|
@message.should == greeting
end


保存退出。

再次执行

cucumber features


这次看到了我们熟悉一些的信息,一些红色的信息。

uninitialized constant CucumberGreeter (NameError)

好像和之前的是一类的,提示我们没有创建CucumbeGreeter类。好吧,在同一个文件features/step_definitions/greeter_steps.rb中,我们创建它。

class CucumberGreeter
def greet
"Hello Cucumber!"
end
end


再次执行。

cucumbe features


这下好了,看到了绿色的东西。

好吧,今天就先到这里,让我们对TDD,BDD,RSpec,Cucumber有了一个初步的认识。

教程参考:The RSpec Book

所有的代码放在

https://github.com/woaigithub/the-rspec-book-with-cucumber
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ruby rails bdd tdd rspec