[每週軟件]:Cucumber:Hello World

##簡介##ios


OSChina 的連接 Cucumber程序員

ruby 的 BDD框架,相似天然語言的DSL,適用於BDD模式和驗收測試。express

Bookruby

The Rspec Book框架

The Cucumber Book測試

##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由三部分組成:

  • 標題:greeter says hello
  • 描述:2~4行
  • Scenario(場景): 最後一部分

一個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還支持其餘語言的,這就得看本身了。

相關文章
相關標籤/搜索