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
轉載于:https://blog.51cto.com/virusswb/1060201
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的The RSpec Book笔记《一》初步认识TDD,BDD,RSpec,Cucumber的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。