##简介##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还支持其余语言的,这就得看本身了。