前言
要了解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
上边是一个比较完整的体现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 概述 RSpec 是一个流行的 Ruby 测试框架,主要用于行为驱动开发 (Behavior-Driven Development, BDD)。RSpec 的设计目的是让测试更加自然和易读,使得开发人员能够...
《RSpec Book》不仅是一本深入介绍RSpec和Cucumber的书籍,也是学习BDD开发方法的重要资源。通过这本书,读者不仅可以掌握这两种工具的使用技巧,还能深入了解BDD的核心理念及其对软件开发流程的影响。无论是对于...
以上是Ruby on Rails入门的基础知识,通过学习这些,你可以开始构建自己的Web应用。对于初学者,建议跟随一个详细的教程逐步实践,结合实际案例理解Rails的工作原理。在学习过程中,不断练习和调试代码,加深对框架...
12. **测试驱动开发(TDD)和持续集成**:Ruby社区重视测试,因此学习如何使用Rspec等测试工具,以及如何实施TDD和持续集成实践也是重要的一环。 “Ruby从入门到精通(1).pdf”这本书很可能会涵盖以上所有主题,并...
使用RSpec的样例应用程序进行日常Rails测试(2017版) 请参考博客,以获取有关此版图书的新闻。 您可以在GitHub的找到早期版本的示例源。 谢谢! 进行示例Rails 5.1应用程序: Aaron Sumner进行测试驱动开发的实用...
在Ruby on Rails入门经典中,你将学习到以下核心知识点: 1. **Ruby语言基础**:首先,你需要了解Ruby的基础语法,包括变量、数据类型(如字符串、整数、浮点数、数组、哈希)、控制结构(如条件语句if/else,循环...
本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习Rails的宝贵资源,帮助初学者快速掌握这个强大的框架。 1. **Rails基础知识**: - MVC架构:Rails的核心设计模式,模型负责数据处理,视图负责展示,控制器...
Rails还提供了丰富的内置功能,如测试框架Rspec和Capybara,用于编写自动化测试;以及Asset Pipeline,用于管理CSS、JavaScript和其他前端资源。书中会讲解如何构建和运行测试,确保应用的稳定性和质量。此外,还会...
10. **测试驱动开发(TDD)**:Ruby社区广泛采用TDD,学习如何使用RSpec或其他测试框架编写测试,确保代码的质量和可靠性。 通过这个“Ruby入门中文合集”,你不仅可以掌握Ruby的基本语法和面向对象编程,还能深入...
Ruby的语法结构清晰,易于理解和编写,非常适合初学者入门。 Ruby的核心特性包括: 1. 面向对象:Ruby是一种完全的面向对象语言,每一个数据都是一个对象,包括基本类型如整数、字符串和布尔值。这意味着你可以对...
11. **测试驱动开发(TDD)**:Rails提倡TDD,你将学习如何使用RSpec或MiniTest编写测试,确保代码的质量和稳定性。 12. **Gem管理**:Ruby的包管理系统是Gem,你将学会如何安装、使用和管理第三方库。 通过这个...
- test:测试文件,使用RSpec或MiniTest等工具进行单元测试和集成测试。 通过分析这个“depot”项目,我们可以学习RoR的基本结构、路由配置、数据库交互(ActiveRecord)以及如何使用模板引擎创建动态网页。此外,...
这个"Ruby语言入门教程(中文版)[PDF]"涵盖了Ruby的基础到进阶内容,适合初学者和希望巩固Ruby知识的开发者。通过阅读并实践教程中的例子,读者可以逐步掌握Ruby编程,并开启在Ruby世界中的探索之旅。
Rails支持TDD(测试驱动开发)和BDD(行为驱动开发),提供了RSpec和Capybara等测试工具,读者将学习如何编写测试用例,确保代码的正确性和稳定性。 在实际项目开发中,安全性和性能优化是重要的话题。教程将讲解...
- **测试驱动开发(TDD)**:Ruby的RSpec和Cucumber等库提供了强大的测试支持,鼓励开发者采用TDD的方式编写代码。 - **Gem包管理**:Ruby的Gem系统允许开发者方便地安装、管理和分享第三方库,极大地丰富了Ruby...
以上只是Ruby语言入门的一部分内容,随着你深入学习,将能发掘更多Ruby的魅力,例如它的块、 Proc 和Lambda,元类,以及ActiveRecord这样的ORM工具。Ruby的世界充满了无限可能,祝你在探索的旅程中收获满满。
描述中的“仅仅三分,就可以帮助你搭好框架”,暗示这份资料可能包含快速入门指南,让你在短时间内理解Rails的基本结构和工作流程。“拥有学习手册”则意味着资料中可能有详尽的文档,帮助你深入学习Rails的各种功能...
在开发过程中,Rails还提供了TDD(测试驱动开发)的支持,其内建的测试框架Rspec和MiniTest允许开发者编写单元测试、集成测试和功能测试,确保代码的质量和稳定性。 总之,Rails入门教程一将涵盖Rails的基础知识,...
在“Ruby语言入门教程v1.0.pdf”这个资源中,你可能会学习到以下内容: 1. **安装Ruby**:如何在不同的操作系统上安装Ruby解释器和相关的开发工具。 2. **基础语法**:包括变量、常量、运算符、流程控制(条件语句...
6. **测试驱动开发**:Rails鼓励TDD(测试驱动开发),提供了丰富的测试框架如RSpec和MiniTest,学会编写测试是保证代码质量的重要手段。 7. **部署**:了解如何将Rails应用部署到服务器,如使用Capistrano自动化...