天天看點

The RSpec Book筆記《一》初步認識TDD,BDD,RSpec,Cucumber

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,如需轉載請自行聯系原作者

繼續閱讀