51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1740|回复: 0
打印 上一主题 下一主题

Cucumber:Hello World

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-1 16:08:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

##简介##


OSChina 的链接 Cucumber

ruby 的 BDD框架,类似自然语言的DSL,适用于BDD模式和验收测试。

Book

The Rspec Book

The Cucumber Book

##Before Start##

安装,Ruby和RubyGems环境就不说了,那就剩下一句话

  1. <!-- lang: ruby -->
  2. gem install cucumber
复制代码

##Step By Step ##

1: 描述行为

文件 "./features/greeter_says_hello.feature"

  1. <!-- lang: ruby -->
  2. Feature: greeter says hello
  3.    Cucumber的Hello World

  4.   Scenario: 对世界打个招呼吧
  5.     Given 如果我给了你一个测试的hello
  6.     When 当我执行greet的时候
  7.     Then 我应该看到 "Hello Cucumber!"
复制代码

一个Feature 可以理解为一个功能,一个Feature由三部分组成:

  • 标题:greeter says hello
  • 描述:2~4行
  • Scenario(场景): 最后一部分

一个Feature可以有多个场景,标题和描述部分可以使用中文。 一个Scenario是对feature的划分,比如一个登录的feature,scenario可以是不同角色的登录情况。(细节待补) Given When Then 是这种DSL里的关键字 还有And

然后在.目录里运行一下

  1. <!-- lang: ruby -->
  2. $ cucumber features
  3.         Feature: greeter says hello
  4.           Cucumber的Hello World
  5.         
  6.           Scenario: 对世界打个招呼吧             # features/greeter_says_hello.feature:3
  7.             Given 如果我给了你一个测试的hello       # features/greeter_says_hello.feature:4
  8.             When 当我执行greet的时候        # features/greeter_says_hello.feature:5
  9.             Then 我应该看到 "Hello Cucumber!" # features/greeter_says_hello.feature:6
  10.         
  11.         1 scenario (1 undefined)
  12.         3 steps (3 undefined)
  13.         0m0.003s
  14.         
  15.         You can implement step definitions for undefined steps with these snippets:
  16.         
  17.         Given /^如该我给了你一个测试的hello$/ do
  18.           pending # express the regexp above with the code you wish you had
  19.         end
  20.         
  21.         When /^当我给你一个greet的时候$/ do
  22.           pending # express the regexp above with the code you wish you had
  23.         end
  24.         
  25.         Then /^我应该看到 "(.*?)"$/ do |arg1|
  26.           pending # express the regexp above with the code you wish you had
  27.         end
复制代码

2: Write a step definition in Ruby

文件:./features/step_definitions/greeter_steps.rb

(注:这里文件名没有硬性规定 是根据内部的代码来查找的,greeter可以用greeter_says_hello_steps.rb)

把上面输出的内容copy进来

  1. <!-- lang: ruby -->
  2. # -*- encoding : utf-8 -*-
  3.     Given /^如该我给了你一个测试的hello$/ do
  4.       pending # express the regexp above with the code you wish you had
  5.     end
  6.    
  7.     When /^当我给你一个greet的时候$/ do
  8.       pending # express the regexp above with the code you wish you had
  9.     end
  10.    
  11.     Then /^我应该看到 "(.*?)"$/ do |arg1|
  12.       pending # express the regexp above with the code you wish you had
  13.     end
复制代码

运行一下看看结果

  1. <!-- lang: ruby -->
  2. $ cucumber features
  3.     Feature: greeter says hello
  4.       Cucumber的Hello World
  5.    
  6.       Scenario: 对世界打个招呼吧             # features/greeter_says_hello.feature:3
  7.         Given 如该我给了你一个测试的hello       # features/step_definitions/g_steps.rb:2
  8.           TODO (Cucumber::Pending)
  9.           ./features/step_definitions/g_steps.rb:3:in `/^如该我给了你一个测试的hello$/'
  10.           features/greeter_says_hello.feature:4:in `Given 如该我给了你一个测试的hello'
  11.         When 当我给你一个greet的时候        # features/step_definitions/g_steps.rb:6
  12.         Then 我应该看到 "Hello Cucumber!" # features/step_definitions/g_steps.rb:10
  13.    
  14.     1 scenario (1 pending)
  15.     3 steps (2 skipped, 1 pending)
  16.     0m0.004s
复制代码

pending指正在进行中,因为Given是正在pending,所以跳过了when和then

OK,然后写一些真正的Step

文件:./features/step_definitions/greeter_steps.rb

  1. <!-- lang: ruby -->
  2. # -*- encoding : utf-8 -*-
  3. Given /^如该我给了你一个测试的hello$/ do
  4.   @hello = Hello.new
  5. end

  6. When /^当我给你一个greet的时候$/ do
  7.   @message = @hello.greet
  8. end

  9. Then /^我应该看到 "(.*?)"$/ do |greeting|
  10.   @message.should == greeting
  11. end
复制代码

这里需要注意的是then里面的 greeting代表的是前面那个描述里面的双引号扩起来的结果

3: Run and watch it fail

  1. <!-- lang: ruby -->
  2. $ cucumber features
  3.     Feature: greeter says hello
  4.       Cucumber的Hello World
  5.    
  6.       Scenario: 对世界打个招呼吧             # features/greeter_says_hello.feature:3
  7.         Given 如该我给了你一个测试的hello       # features/step_definitions/g_steps.rb:7
  8.           uninitialized constant Hello (NameError)
  9.           ./features/step_definitions/g_steps.rb:8:in `/^如该我给了你一个测试的hello$/'
  10.           features/greeter_says_hello.feature:4:in `Given 如该我给了你一个测试的hello'
  11.         When 当我给你一个greet的时候          # features/step_definitions/g_steps.rb:11
  12.         Then 我应该看到 "Hello Cucumber!" # features/step_definitions/g_steps.rb:15
  13.    
  14.     Failing Scenarios:
  15.     cucumber features/greeter_says_hello.feature:3 # Scenario: 对世界打个招呼吧
  16.    
  17.     1 scenario (1 failed)
  18.     3 steps (1 failed, 2 skipped)
  19.     0m0.003s
复制代码

4: Write code to make the step pass

文件:./features/step_definitions/greeter_steps.rb

(注:为了简单起见我就直接写到这里面了)

  1. <!-- lang: ruby -->
  2. # -*- encoding : utf-8 -*-
  3. class Hello
  4.   def greet
  5.     "Hello Cucumber!"
  6.   end
  7. end
  8. Given /^如该我给了你一个测试的hello$/ do
  9.   @hello = Hello.new
  10. end

  11. When /^当我给你一个greet的时候$/ do
  12.   @message = @hello.greet
  13. end

  14. Then /^我应该看到 "(.*?)"$/ do |greeting|
  15.   @message.should == greeting
  16. end
复制代码

5: Run again and see the step pass

  1. <!-- lang: ruby -->
  2. $ cucumber features
  3.     Feature: greeter says hello
  4.       Cucumber的Hello World
  5.    
  6.       Scenario: 对世界打个招呼吧             # features/greeter_says_hello.feature:3
  7.         Given 如该我给了你一个测试的hello       # features/step_definitions/g_steps.rb:7
  8.         When 当我给你一个greet的时候          # features/step_definitions/g_steps.rb:11
  9.         Then 我应该看到 "Hello Cucumber!" # features/step_definitions/g_steps.rb:15
  10.    
  11.     1 scenario (1 passed)
  12.     3 steps (3 passed)
  13.     0m0.003s
复制代码

6: Repeat 2-5 until green like a cuke

##Summary##

从Hello World可以看出,cucumber还是很强大滴,并且输出和定义对非专业人员(需求啊 Boss啊 客户啊)都很友好,如果是个不爱写文档的程序员,可以考虑用cucumber来代替一下。

BTW:虽然例子是ruby,不过cucumber还支持其他语言的,这就得看自己了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-14 15:15 , Processed in 0.057222 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表