文档章节

[每周软件]:Cucumber:Hello World

j
 jerrytao
发布于 2013/01/21 23:18
字数 1171
阅读 3820
收藏 19

##简介##


OSChina 的链接 Cucumber

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

Book

The Rspec Book

The Cucumber Book

##Before Start##

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

<!-- lang: ruby -->
gem install cucumber

##Step By Step ##

1: 描述行为

文件 "./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还支持其他语言的,这就得看自己了。

© 著作权归作者所有

j
粉丝 7
博文 11
码字总数 7047
作品 0
沈阳
私信 提问
cucumber之hello world

万事开头难,万事hello world起! 这里给出maven项目步骤,添加依赖 <dependency> </dependency> 我这里 给出的例子是基于IDEA插件的 先创建hello.feature文件 然后对于step的实现直接快捷键...

健哥大人
2016/09/01
21
0
[每周软件]:Cucumber:Second Day

OSChina 的链接 [Cucumber][1] ruby 的 BDD框架,类似自然语言的DSL,适用于BDD模式和验收测试。 Book [The Rspec Book][2] [The Cucumber Book][3] [1]: http://www.oschina.net/p/cucumber......

jerrytao
2013/01/22
435
0
Swift 就像 Kotlin?看看 Swift 与 Kotlin 的简单对比

一位国外的程序员认为 Swift 的语法与 Kotlin 相似,并整理了一些 Swift 和 Kotlin 的对比,下面是一些例子,大家不妨也看看。 BASICS Hello World Swift Kotlin 变量和常量 Swift Kotlin 显...

局长
2017/05/20
10.9K
34
你知道 Python 这五个有趣的彩蛋吗?

当一门编程语言是开源的时候,往往会有产生一些搞笑和有趣的东西。通常,这意味着社区的贡献者会为该语言添加一些有趣和特别的彩蛋以及隐藏的特性(当然前提是不会增加在生产环境中使用的风险...

局长
2017/05/24
5.3K
13
linux 中 crond的使用

cron定时任务 linux 中用于定时执行某些特定能操作, 如定时备份文件, 定时更新/删除文件, 都会使用到定时任务. cron 是服务命令 crond 是用来执行执行服务的守护进程, crond 每分钟会检查是否...

Fc丶
2018/11/22
42
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部