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/。
安装
创建一个文件。
写入下面的内容那个。
describe代表一组测试。
it代表一个测试。
我们首先初始化一个greeter,然后调用greet方法,然后看看预期的结果是否等于"hello, rspec!"。
运行下面的命令看看结果。
结果是
uninitialized constant RSpecGreeter
RSpec告诉我们还没有定义RSpecGreeter类。就让我们在同一个文件中定义一个RSpecGreeter类。
然后再次执行rspec greeter_spec.rb,这次看到了。
这下成功了,这个有点像我们学习编程语言的时候写的helloworld。
在项目下创建两个目录
将刚才创建的greeter_spec.rb文件移动到spec文件夹
在features文件夹中创建greeter_says_hello.feature文件
敲入下面的内容
保存之后,回到项目根目录。
执行
可以看到下面的内容
创建文件夹
新建一个文件
在文件中输入
保存退出。
再次执行
这次看到了我们熟悉一些的信息,一些红色的信息。
uninitialized constant CucumberGreeter (NameError)
好像和之前的是一类的,提示我们没有创建CucumbeGreeter类。好吧,在同一个文件features/step_definitions/greeter_steps.rb中,我们创建它。
再次执行。
这下好了,看到了绿色的东西。
好吧,今天就先到这里,让我们对TDD,BDD,RSpec,Cucumber有了一个初步的认识。
教程参考:The RSpec Book
所有的代码放在
https://github.com/woaigithub/the-rspec-book-with-cucumber
在编写代码之前先编写一个测试,这时候测试是失败的,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
相关文章推荐
- 使用Cucumber+Rspec玩转BDD(7)——测试重构
- 全面接触TDD - 2. Unit Test中的一些基本观点与概念及NUint的初步认识
- 使用Cucumber+Rspec玩转BDD(5)——安全退出
- 使用Cucumber+Rspec玩转BDD(6)——找回密码
- 初步认识TDD
- 使用Cucumber+Rspec玩转BDD(4)——用户登录并“记住我”
- 使用Cucumber+Rspec玩转BDD(3)——用户登录
- 使用Cucumber+Rspec玩转BDD(2)——邮件激活
- 使用Cucumber+Rspec玩转BDD(1)——用户注册
- 处理大并发之三 对libevent的初步认识
- 初步认识Highcharts
- 1.初步认识TypeScript
- Java NIO--初步认识
- 通过三个实例初步认识云计算
- IBM AIX初步认识
- 【驱动笔记14】初步认识MDL
- Handler认识初步(一)
- 初步认识消息中间件
- 初步认识TCP协议——TCP的四种定时器
- thrift初步认识