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
本文轉自 virusswb 51CTO部落格,原文連結:http://blog.51cto.com/virusswb/1060201,如需轉載請自行聯系原作者