`
jy503160
  • 浏览: 18743 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

RSPEC-入门学习

 
阅读更多

前言

      要了解RSpec,我们首先需要了解什么是行为驱动开发(Behaviour Driven Development,简称BDD),BDD是一种融合了可接受性测试驱动计划(Acceptance Test Driven Planning),域驱动设计(Domain Driven Design)以及测试驱动开发(Test Driven Development,简称TDD)的敏捷开发模型。RSpec为BDD开发提供TDD支持。

      这篇文章遵从TDD思想,但是我们将使用行为(behavior)和样例(example)来代替测试例(test case)和测试方法(test method)。

介绍

 

· textual descriptions of examples and groups (rspec-core)

· flexible and customizable reporting

· extensible expectation language (rspec-expectations)

built-in mocking/stubbing framework (rspec-mocks)

 

安装

      rails new rspec_tutional –T       

      加上-T,创建工程时不会添加测试内容,然后修改Gemfile,添加如下内容

 

1
2
3
4
group :test, :development do
  gem ‘rspec’
  gem ‘rspec-rails’(两者版本最好一致)
end

 

 然后通过下面的命令创建rspec框架

      rails g respec:install

      此命令的作用是为Rails程序安装RSpec框架,使RSpec取代Test::Unit而存在,这条命令会建立’.rspec’文件、’spec’目录和’spec/spec_helper.rb’文件,他们分别的作用是:

   ‘.rspec’文件:存放运行rake spec任务时,RSpec需要加载的配置信息。

   ‘spec’目录:我们的RSpec测试用例的存放空间,针对mvc,我们可以建立models、views和controllers目录分别存放模型、视图和控制器各个层面的测试用例,每一个测试文件以_spec结尾。

   ‘spec/spec_helper.rb’文件:运行测试用例的RSpec配置文件。每一个以_spec结尾的文件都需要引入该文件,即在文件开头添加:require ‘spec_helper’代码。

TDD

describe User do
  it "should be in any roles assigned to it" do
    user = User.new
    user.assign_role("assigned role")
    user.should be_in_role("assigned role")
  end
  it “should NOT be in any roles not assigned to it” do
    user = User.new
    user.should_not be_in_role(”unassigned role”)
  end
end

 

class User
  def in_role?(role)
    role == @role
  end
  def assign_role(role)
    @role = role
  end
end

 

Expectations--- Built-in matchers

Equivalence

actual.should eq(expected) # passes if actual == expected

actual.should == expected # passes if actual == expected

actual.should eql(expected) # passes if actual.eql?(expected)

actual.should equal(expected) # passes if actual.equal?(expected)

actual.should === expected # passes if actual === expected


 

Identity

actual.should be(expected) # passes if actual.equal?(expected)

 

Comparisons

actual.should be > expected

actual.should be >= expected

actual.should be <= expected

actual.should be < expected

actual.should be_within(delta).of(expected)

 

Regular expressions

actual.should =~ /expression/

actual.should match(/expression/)

 

Types/classes

actual.should be_an_instance_of(expected)

actual.should be_a_kind_of(expected)

 

Truthiness

actual.should be_true # passes if actual is truthy (not nil or false)

actual.should be_false # passes if actual is falsy (nil or false)

actual.should be_nil # passes if actual is nil

 

Expecting errors

expect { ... }.to raise_error

expect { ... }.to raise_error(ErrorClass)

expect { ... }.to raise_error("message")

expect { ... }.to raise_error(ErrorClass, "message")

 

Expecting throws

expect { ... }.to throw_symbol

expect { ... }.to throw_symbol(:symbol)

expect { ... }.to throw_symbol(:symbol, 'value')

 

Predicate matchers

actual.should be_xxx # passes if actual.xxx?

actual.should have_xxx(:arg) # passes if actual.has_xxx?(:arg)

 

Ranges (Ruby >= 1.9 only)

(1..10).should cover(3)

 

Collection membership

actual.should include(expected)

 

Examples

[1,2,3].should include(1)

[1,2,3].should include(1, 2)

{:a => 'b'}.should include(:a => 'b')

"this string".should include("is str")

Core

clip_image002

 

 

上边是一个比较完整的体现RSpec组织测试用例的模板,当然这里只是为了说明一个_spec文件如何组织测试用例及基本用法,所以我没有去编写每一个测试用例的体,并且例子出现的字符串内容不针对于具体的系统,没有实际意义。下边依次解释含义:
      require ‘spec_helper’:目的是加载’spec/spec_helper.rb’文件中的RSpec配置,运行时需要。
describe()方法:
      我们用describe()方法定义一个测试用例组,describe()方法的参数可以是我们要测试的对象(如例中的People),可以是一个字符串,用来描述该组,describe方法后的字符串所描述的内容可以对应一个用户故事。
      注意describe()方法是可以嵌套的,两个describe()方法衔接起来可以更细化一个用户故事,如上边的里面的describe()方法内就表示:”People have enough money pay for house”。
it()方法:
      我们用it()方法定义一个具体的测试用例(在RSpec中,称一个测试用例为一个example)。其后的字符串为该方法的参数,用来描述一个具体的场景,it方法体就是我们对系统在该场景下的行为的定义。
      It()方法和describe()方法衔接起来,可以完整的描述一个系统行为,以上边的最后的一个测试用例为:”People have enough money pay for house should travel ”。
context()方法:
      Context()方法和describe()方法的作用一样,不同点在于describe倾向于描述我们的测试对象,而context()方法倾向于用字符串描述用户故事。
before()和after():
      这两个方法很多测试框架都支持,需要说明的是这两个方法的参数,例子中为符号’:each’,表明对于每一个测试用例,先执行 before()方法中的代码,用例完成后执行after()方法中的代码,若参数为’:all’,则表示在所有的测试用例执行之前,先执行 before()方法中的代码,所有的用例完成后执行after()方法中的代码。
      RSpec还提供around()方法,暂不懂其用法,之后的报告中补上。
帮助方法:
      所谓的帮助方法就是把多个测试用例中重复的操作抽出作为一个公用的方法,提高代码重用度。如例子中的work_hard()方法。
共享行为:
      系统的某一个行为是很多场景下都具有的,那么我们可以把它定义为一个共享行为,我们通过share_examples_for()方法 定义共享行为,使用it_behaves_like()方法共享定义过的系统行为,如例子中的share_examples_for “any people”, it_behaves_like “any people”。
pending()方法:
      我们确定系统拥有一个行为,但是还没有具体定义,这时我们可以将该行为使用pending()方法来设置该行为为待定义,其后的字符串参数将在生成的报告中显示。
      pending()方法的另外一种用法就是,当一个测试用例失败时,我们可以利用pending方法设置其为一个待修复的bug,方法体内包含使用例失败的代码。例如最后一个测试用例的内容

分享到:
评论

相关推荐

    rspec 入门者学习

    rspec出入门者学习理解,介绍的非常的详细、清楚; 欢迎下载学习~

    everybay_rails_second:Everyday Rails-RSpecによるRailsテスト入门の学习用2回目

    使用RSpec的样例应用程序进行日常Rails测试(2017版) 请参考博客,以获取有关此版图书的新闻。 您可以在GitHub的找到早期版本的示例源。 谢谢! 进行示例Rails 5.1应用程序: Aaron Sumner进行测试驱动开发的实用...

    rails-engine

    该项目的探索和学习领域包括: 公开API 使用序列化器格式化JSON响应 使用RSpec和Postman测试API暴露 编写高级ActiveRecord查询以分析存储在PostgreSQL数据库中的信息 无需ORM的帮助即可编写SQL语句 实施json:api...

    snapdragon:Jasmine JavaScript 测试运行器,可让您在类似于 RSpec 的命令行上运行测试

    如果您是一名视觉学习者,Brian Miller 和我在了一个免费的。 对于那些喜欢直接进入并开始使用新工具的人,请按照以下步骤开始。 如上所述安装和 。 使用以下内容创建一个简单的规范文件example/spec/hoopty_s

    RoR-Capstone:Ruby on Rails模块的顶点

    实体关系图建于Ruby v2.7.0 Ruby on Rails PostgreSQL设计引导程序HTML CSS经过测试Ruby gem RSpec Ruby宝石Shoulda Matchers Ruby宝石水豚现场演示打开先决条件Ruby:2.6.3 滑轨:5.2.3 Postgres:&gt; = 9.5 纱文本...

    phase-0-html-riyadh-blog-lab

    入门将此课程分叉并克隆到您的本地环境中。 导航到终端中的目录,然后运行code . 在Visual Studio Code中打开文件。 最后,运行bundle安装实验室的依赖项。为现有的模型创建HTML结构过程在index.html文件中,使用...

    phase-0-html-tag-lab

    学习目标 编码一个h1标签 将h1的内部文本设置为Hello, World! 介绍 到目前为止,我们已经了解了如何使用HTML标记内容,如何构建HTML文档以及HTML标签的外观。 现在,让我们集中精力从头开始编写单个HTML标签,并检查...

    hw-ruby-intro:使用Ruby on Rails进行敏捷开发的Ruby简介分配

    Ruby简介 这个由三部分组成的家庭作业提供了Ruby的一些基本练习,并使您习惯于将测试作为工作流程的常规部分。 注意:不要将此仓库克隆到您的工作区。 先叉,然后克隆叉。... 我们已经将“入门代码”放置在lib/ruby

    phase-0-html-link-tag-with-href

    学习目标 写的a标签来创建一个链接 介绍 我们有HTML标记,还有HTML标记属性。 我们如何一起使用它们? 我们还可以通过探索弄清楚a标签,并创建一个链接。 入门 将此课程分叉并克隆到您的本地环境中。 导航到终端中的...

    phase-0-css-rainbow-lab

    在工作时运行rspec以查看测试进度。 回顾HTML基础 超文本标记语言(HTML)是一种结构化具有不同部分的文档的方法。 内容的每个部分都由元素标记(使用标签)。 每个元素都有其自己的特殊含义,浏览器用来呈现HTML...

    Linkw-Href-att

    学习目标 写的a标签来创建一个链接 介绍 我们有HTML标记,还有HTML标记属性。 我们如何一起使用它们? 我们还可以通过探索弄清楚a标签,并创建一个链接。 入门 将此课程分叉并克隆到您的本地环境中。 导航到终端中的...

    css-essentials-css-issue-bot-9000-houston-web-080519

    CSS验证实验室:Issue Bot 9000学习目标将无效CSS更改为有效CSS介绍尽管当今的浏览器变得越来越有能力处理CSS中的错误,但是某些错误并不能总是被很好地捕获。 此变量可能使一致地应用样式或布局变得极为困难。 如何...

    css-essentials-css-issue-bot-9000-midtown-web-071519

    学习目标 将无效CSS更改为有效CSS 介绍 尽管当今的浏览器变得越来越有能力处理CSS中的错误,但是某些错误并不能总是被很好地捕获。 此变量可能使一致地应用样式或布局变得极为困难。 如何快速扫描我们CSS文档中的...

    css-essentials-css-issue-bot-9000-chicago-web-080519

    学习目标 将无效CSS更改为有效CSS 介绍 尽管当今的浏览器变得越来越有能力处理CSS中的错误,但是某些错误并不能总是被很好地捕获。 此变量可能使一致地应用样式或布局变得极为困难。 如何快速扫描我们CSS文档中的...

    css-essentials-css-issue-bot-9000-dc-web-120919

    学习目标 将无效CSS更改为有效CSS 介绍 尽管当今的浏览器变得越来越有能力处理CSS中的错误,但是某些错误并不能总是被很好地捕获。 此变量可能使一致地应用样式或布局变得极为困难。 如何快速扫描我们CSS文档中的...

    expertiza:expertiza是一个Web应用程序,学生可以通过该应用程序提交和同行评审学习对象(文章,代码,网站等)。 Expertiza项目由国家科学基金会资助

    专业化同行评审系统Expertiza是一个Web应用程序,学生可以在其中提交和同行评审学习对象(文章,代码,网站等)。 它在北卡罗来纳州立大学的精选课程中以及其他几所大学和大学的教授中使用。建立NCSU VCL映像在映像...

    css-essentials-css-issue-bot-9000-den01-seng-ft-062220

    学习目标 将无效CSS更改为有效CSS 介绍 尽管当今的浏览器变得越来越有能力处理CSS中的错误,但是某些错误并不能总是被很好地捕获。 此变量可能使一致地应用样式或布局变得极为困难。 如何快速扫描我们CSS文档中的...

    css-essentials-css-issue-bot-9000-nyc03-seng-ft-051120

    CSS验证实验室:Issue Bot 9000学习目标将无效CSS更改为有效CSS介绍尽管当今的浏览器变得越来越有能力处理CSS中的错误,但是某些错误并不能总是被很好地捕获。 此变量可能使一致地应用样式或布局变得极为困难。 如何...

    phase-0-css-graffiti-lab

    CSS涂鸦替代实验室学习目标使用浏览器开发人员工具覆盖现有样式介绍想象一下,当您走在街上时,您会注意到其中有一幅壁画被涂满了各种涂鸦标签。 实际上,清理可能是一项艰巨的任务。 但是,在CSS中,您只需要执行一...

Global site tag (gtag.js) - Google Analytics