##簡介##ios
OSChina 的連接 Cucumber程序員
ruby 的 BDD框架,相似天然語言的DSL,適用於BDD模式和驗收測試。express
Bookruby
##Before Start##.net
安裝,Ruby和RubyGems環境就不說了,那就剩下一句話code
<!-- lang: ruby --> gem install cucumber
##Step By Step ##regexp
1: 描述行爲ip
文件 "./features/greeter_says_hello.feature"
<!-- lang: ruby --> Feature: greeter says hello Cucumber的Hello World Scenario: 對世界打個招呼吧 Given 若是我給了你一個測試的hello When 當我執行greet的時候 Then 我應該看到 "Hello Cucumber!"
一個Feature 能夠理解爲一個功能,一個Feature由三部分組成:
一個Feature能夠有多個場景,標題和描述部分可使用中文。 一個Scenario是對feature的劃分,好比一個登陸的feature,scenario能夠是不一樣角色的登陸狀況。(細節待補) Given When Then 是這種DSL裏的關鍵字 還有And
而後在.目錄裏運行一下
<!-- lang: ruby --> $ cucumber features Feature: greeter says hello Cucumber的Hello World Scenario: 對世界打個招呼吧 # features/greeter_says_hello.feature:3 Given 若是我給了你一個測試的hello # features/greeter_says_hello.feature:4 When 當我執行greet的時候 # features/greeter_says_hello.feature:5 Then 我應該看到 "Hello Cucumber!" # features/greeter_says_hello.feature:6 1 scenario (1 undefined) 3 steps (3 undefined) 0m0.003s You can implement step definitions for undefined steps with these snippets: Given /^如該我給了你一個測試的hello$/ do pending # express the regexp above with the code you wish you had end When /^當我給你一個greet的時候$/ do pending # express the regexp above with the code you wish you had end Then /^我應該看到 "(.*?)"$/ do |arg1| pending # express the regexp above with the code you wish you had end
2: Write a step definition in Ruby
文件:./features/step_definitions/greeter_steps.rb
(注:這裏文件名沒有硬性規定 是根據內部的代碼來查找的,greeter能夠用greeter_says_hello_steps.rb)
把上面輸出的內容copy進來
<!-- lang: ruby --> # -*- encoding : utf-8 -*- Given /^如該我給了你一個測試的hello$/ do pending # express the regexp above with the code you wish you had end When /^當我給你一個greet的時候$/ do pending # express the regexp above with the code you wish you had end Then /^我應該看到 "(.*?)"$/ do |arg1| pending # express the regexp above with the code you wish you had end
運行一下看看結果
<!-- lang: ruby --> $ cucumber features Feature: greeter says hello Cucumber的Hello World Scenario: 對世界打個招呼吧 # features/greeter_says_hello.feature:3 Given 如該我給了你一個測試的hello # features/step_definitions/g_steps.rb:2 TODO (Cucumber::Pending) ./features/step_definitions/g_steps.rb:3:in `/^如該我給了你一個測試的hello$/' features/greeter_says_hello.feature:4:in `Given 如該我給了你一個測試的hello' When 當我給你一個greet的時候 # features/step_definitions/g_steps.rb:6 Then 我應該看到 "Hello Cucumber!" # features/step_definitions/g_steps.rb:10 1 scenario (1 pending) 3 steps (2 skipped, 1 pending) 0m0.004s
pending指正在進行中,由於Given是正在pending,因此跳過了when和then
OK,而後寫一些真正的Step
文件:./features/step_definitions/greeter_steps.rb
<!-- lang: ruby --> # -*- encoding : utf-8 -*- Given /^如該我給了你一個測試的hello$/ do @hello = Hello.new end When /^當我給你一個greet的時候$/ do @message = @hello.greet end Then /^我應該看到 "(.*?)"$/ do |greeting| @message.should == greeting end
這裏須要注意的是then裏面的 greeting表明的是前面那個描述裏面的雙引號擴起來的結果
3: Run and watch it fail
<!-- lang: ruby --> $ cucumber features Feature: greeter says hello Cucumber的Hello World Scenario: 對世界打個招呼吧 # features/greeter_says_hello.feature:3 Given 如該我給了你一個測試的hello # features/step_definitions/g_steps.rb:7 uninitialized constant Hello (NameError) ./features/step_definitions/g_steps.rb:8:in `/^如該我給了你一個測試的hello$/' features/greeter_says_hello.feature:4:in `Given 如該我給了你一個測試的hello' When 當我給你一個greet的時候 # features/step_definitions/g_steps.rb:11 Then 我應該看到 "Hello Cucumber!" # features/step_definitions/g_steps.rb:15 Failing Scenarios: cucumber features/greeter_says_hello.feature:3 # Scenario: 對世界打個招呼吧 1 scenario (1 failed) 3 steps (1 failed, 2 skipped) 0m0.003s
4: Write code to make the step pass
文件:./features/step_definitions/greeter_steps.rb
(注:爲了簡單起見我就直接寫到這裏面了)
<!-- lang: ruby --> # -*- encoding : utf-8 -*- class Hello def greet "Hello Cucumber!" end end Given /^如該我給了你一個測試的hello$/ do @hello = Hello.new end When /^當我給你一個greet的時候$/ do @message = @hello.greet end Then /^我應該看到 "(.*?)"$/ do |greeting| @message.should == greeting end
5: Run again and see the step pass
<!-- lang: ruby --> $ cucumber features Feature: greeter says hello Cucumber的Hello World Scenario: 對世界打個招呼吧 # features/greeter_says_hello.feature:3 Given 如該我給了你一個測試的hello # features/step_definitions/g_steps.rb:7 When 當我給你一個greet的時候 # features/step_definitions/g_steps.rb:11 Then 我應該看到 "Hello Cucumber!" # features/step_definitions/g_steps.rb:15 1 scenario (1 passed) 3 steps (3 passed) 0m0.003s
6: Repeat 2-5 until green like a cuke
##Summary##
從Hello World能夠看出,cucumber仍是很強大滴,而且輸出和定義對非專業人員(需求啊 Boss啊 客戶啊)都很友好,若是是個不愛寫文檔的程序員,能夠考慮用cucumber來代替一下。
BTW:雖然例子是ruby,不過cucumber還支持其餘語言的,這就得看本身了。