前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Effective Testing with RSpec 3 (第一部分:入门)

Effective Testing with RSpec 3 (第一部分:入门)

作者头像
不知雨
发布2018-09-06 22:52:50
2K0
发布2018-09-06 22:52:50
举报

欢迎来到RSpec! 在本书的这一部分中,你将在编写前几个工作测试时熟悉该框架。

首先,你将安装RSpec并编写你的前几个specs - RSpec的测试术语。 RSpec的API就是决定你希望代码如何表现并在你的specs中表达该决定。 一旦你掌握了基础知识,我们就无法拒绝向你展示,使RSpec与众不同的一些东西。

在本章中,你将看到:

?如何安装RSpec并编写你的第一个specs

?如何使用describe,和用它来组织你的specs

?如何验证期望的结果

?如何解释测试失败

?如何使你的specs不受重复设置代码的影响

第1章

RSpec入门

RSpec 3是一个高效的Ruby测试框架。 我们说生产效率很高,因为关于它的一切 - 它的样式,API,库和设置 - 都是为了在编写出色的软件时为你提供支持。

编写有效的测试可帮助你实现运送应用程序的目标。 我们在这里有一个特定的有效定义:这个测试是否支付了编写和运行它的成本? 一项好的测试将至少提供以下一项好处:

?设计指导:帮助你将所有这些奇妙的想法提炼成可运行,可维护的代码

?安全网:在客户开始之前在代码中发现错误

?文档:捕获工作系统的行为以帮助其维护人员

当你按照本书中的示例进行操作时,您将练习几种有助于您有效测试的习惯:

?当您准确描述您希望程序执行的操作时,您可以避免过于严格(并且在无关的细节更改时失败)或过于宽松(并且从不完整的测试中获得错误的信心)。

?通过编写规范以在正确的详细程度报告失败,您可以提供足够的信息来查找问题的原因 - 而不会淹没过多的输出。

?通过明确地将基本测试代码与嘈杂的设置代码分开,您可以传达应用程序的实际预期 - 并避免重复不必要的细节。

?重新排序,配置和过滤规范时,您会发现订单依赖性,测试速度慢和工作不完整。

您将在本书的课程中撰写的所有内容都将用于其中一种实践。

安装RSpec

首先,要使用RSpec 3,您需要最新版本的Ruby。 我们已经使用Ruby 2.4在本书中测试了我们的示例,并鼓励您将该版本用于最简单的路径。 在其他版本的Ruby上,您可能会得到略微不同的结果。 如果您使用的是较旧的东西,请转到Ruby下载页面并获取更新的内容

RSpec由三个独立的Ruby宝石组成:

?rspec-core是运行规范的整体测试工具。

?rspec-expectations为检查代码属性提供了可读,强大的语法。

?rspec-mocks可以轻松地将您正在测试的代码与系统的其余部分隔离开来。

您可以单独安装它们,并将它们与其他测试框架,断言库和模拟工具混合使用。 但是他们在一起很好,所以我们将在本书中一起使用它们。

要安装所有RSpec,只需安装rspec gem:

代码语言:javascript
复制
 $ gem install rspec -v 3.6.0
 Successfully installed rspec-support-3.6.0 
 Successfully installed rspec-core-3.6.0 
 Successfully installed diff-lcs-1.3 
 Successfully installed rspec-expectations-3.6.0 
 Successfully installed rspec-mocks-3.6.0 
 Successfully installed rspec-3.6.0
 6 gems installed 
 

你可以看到这里列出的三个宝石,加上一些支持库和rspec包装宝石,共有六颗宝石。

既然RSpec在您的系统上,我们快速检查以确保它已准备就绪:

代码语言:javascript
复制
 $ rspec --version 
 RSpec 3.6 
   - rspec-core 3.6.0
   - rspec-expectations 3.6.0 
   - rspec-mocks 3.6.0   
   - rspec-support 3.6.0
 

完善。 是时候参加试驾了。

1. https://www.ruby-lang.org

你的第一个规范

我们不是测试一些错综复杂的生产系统,而是想象一些更具体的东西:三明治。 是的,这很愚蠢,但它会让这些例子保持简短,我们在写这一章时感到很饿。

三明治最重要的特性是什么? 面包? 条件? 不,关于三明治最重要的是它应该味道好。 让我们用RSpec语言这么说吧。

RSpec使用describe和it来表达会话格式的概念:

?“描述一个理想的三明治”

?“首先,它很美味”

创建一个新项目目录,其子目录名为spec。 在?your_project?/ spec中,创建一个名为sandwich_spec.rb的文件,其中包含以下内容:

代码语言:javascript
复制
01-getting-started/01/spec/sandwich_spec.rb 
RSpec.describe 'An ideal sandwich' do it 'is delicious' do
 end 
end 

开发人员一直以这种方式使用RSpec; 他们从一个轮廓开始,并在他们去的时候填写。 将以下突出显示的行添加到大纲中:

代码语言:javascript
复制
01-getting-started/02/spec/sandwich_spec.rb 
RSpec.describe 'An ideal sandwich' do it 'is delicious' do 
?sandwich = Sandwich.new('delicious', []) 
?
?taste = sandwich.taste
?
?expect(taste).to eq('delicious') end 
end 

在运行此规范之前,让我们稍微破解代码。

组,示例和期望

此文件定义了您的测试,在RSpec中称为您的规范,是规范的缩写(因为它们指定了代码的所需行为)。 外部RSpec.describe块创建一个示例组。 一个示例组定义了您正在测试的内容 - 在这种情况下,三明治 - 并将相关规范保存在一起。

嵌套的块 - 从它开始的'美味' - 是三明治使用的一个例子。 (其他测试框架可能会将此称为测试用例。)在编写规范时,您将倾向于将每个示例都集中在您正在测试的一个特定行为片上。

测试与规格与示例

测试,规格和示例之间有什么区别? 它们都引用您编写的代码来检查程序的行为。 这些术语是半可互换的,但每个都有不同的侧重点:

?测试验证了一些代码是否正常工作。

?规范描述了一些代码的期望行为。

?一个示例显示了如何使用特定的API。

我们将在本书中使用所有这些术语,具体取决于我们要强调的测试方面。

在示例中,您遵循Arrange / Act / Assert模式:设置一个对象,用它做一些事情,并检查它是否按照您想要的方式运行.2在这里,您创建一个三明治,询问它的味道,并验证 结果很美味。

以期望开始的线是期望。 这些就像其他测试框架中的断言一样,但是(正如我们稍后将会看到的)还有更多的技巧。

再看一下我们在这个片段中使用的三种RSpec方法:

?RSpec.describe创建一个示例组(一组相关测试)。

?它创建了一个示例(单个测试)。

?期望验证预期结果(断言)。

这些是您在构建测试套件时一次又一次地触及的构建块。

充分利用RSpec

三明治的规格有两个目的:

?记录三明治应该做什么

?检查三明治是否符合预期

我们认为这个规范非常适合第一个目的。 即使是项目新手也可以阅读这段代码,看看三明治应该很美味。

2. http://xp123.com/articles/3a-arrange-act-assert/

查看期望行。 它读起来几乎就像它的英文等价物:“我们希望三明治的味道很美味。”使用传统的测试框架的断言,你可能会写一个类似下面的一行:

代码语言:javascript
复制
01-getting-started/02/sandwich_test.rb 
assert_equal('delicious', taste, 'Sandwich is not delicious') 

这段代码工作正常,但我们认为它不如RSpec版本清晰。 在本书中,我们将努力保持您的规格可读性。

规范也是工作代码。 您应该能够运行它们并检查三明治是否真的按照设计行事。 在下一节中,您将这样做。

本文系转载,前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系?cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第1章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com