使用 Ruby 构建测试:基础知识
我在训练营期间,学习环境都是基于测试构建的,这意味着我通过运行测试、查看错误以及调试代码来学习,了解哪些代码有效、哪些无效。最大的问题是,我们这些学生从来没有学过如何构建这些测试。我知道它们是什么样子的。我大概知道每行代码在做什么,但我从来不明白后台到底发生了什么。
直到最近,我才决定接受挑战,学习如何构建自己的测试。在找工作和参与 Twitter 科技圈的过程中,我了解到测试驱动开发 (TDD) 是开发人员必须掌握的一项重要技能。TDD 是我作为软件工程师 (SWE) 的第一个职位上最有可能要学习的技能,所以我想趁着找工作的时候,大胆地自学一下。
在学习构建自己的测试的过程中,我遇到了不少有用的教程,但很少有教程能够详细解释每一行代码背后的真正含义。正因如此,我才写下了这个博客系列——《用 Ruby 构建测试》。我希望为初学者提供 RSpec 测试的幕后知识。作为本系列的第一篇文章,我将介绍 RSpec 测试的基本结构。让我们开始吧!
什么是 TDD?
在我们直接深入构建 RSpec 测试之前,让我们首先定义 TDD。
测试驱动开发 (TDD) 是一种依赖于重复非常短的开发周期的软件开发过程:首先,开发人员编写一个(最初失败的)自动化测试用例,定义所需的改进或新功能,然后生成通过该测试的最少代码,最后将新代码重构为可接受的标准。
TDD 遵循的一般步骤是
TDD 允许开发人员测试他们对正在构建的特定功能的功能预期。例如,如果开发人员想要创建一个用户模型,他们可以构建一个测试来检查用户是否使用所需的参数创建。开发人员首先构建测试,运行这些测试,然后构建用户模型,再次运行测试直到通过,最后重构代码。TDD 就是这么简单!
什么是 RSpec?
RSpec 是一款领域特定语言 (DSL) 工具,用于用 Ruby 编写单元测试。需要注意的是,RSpec 属于行为驱动开发 (BDD),它是作为 TDD 的一个子类别创建的。您可以点击此处了解更多关于 BDD 的信息。
构建测试
步骤 1
构建 RSpec 测试时需要做的第一件事就是将rspec gem添加到您的Gemfile
测试文件中,然后在您要编写测试的文件中使用它。
第 2 步:describe
阻止
现在开始实际编写测试……我们需要编写的第一件事是describe
代码块,它允许我们将测试分组为一个集合。该describe
代码块允许我们告诉 RSpec 我们将测试哪个类,它接受类名或字符串作为参数。
该describe
块是我们在 Ruby 中进行测试的父块,这意味着我们所有其他块和测试组件都将成为该块的子块。
步骤 3:context
阻止
describe
我们块中的第一个子块是context
block,它也接受类名或字符串作为参数。虽然context
block 不是 RSpec 测试的必需组件,但它们非常有用,有助于添加更多有关测试的详细信息。该context
块允许您创建子组。这使得测试具有不同上下文的组变得更加容易,例如当用户登录或用户未登录时。
步骤 4:it
阻止
该块的基本子块describe
是it
块。it
用于定义测试/测试用例的具体行为。与前两个块一样,它也接受类名或字符串作为参数,但通常只将字符串传递给块参数。通常,使用的字符串参数应包含“should”一词来描述测试的行为。
换句话说,该it
块描述了预期的结果,这让我想到了下一个主题,expect
关键字。expect
用于定义测试的期望并验证预期条件是否已经满足。
注意:本文我将介绍两个最常见的与 相关的关键词expect
。在后续文章中,我将更详细地介绍其他可以在这里使用的关键词。
to
和eql
to
和关键字eql
一起使用expect
是为了验证测试是否输出了预期值。to
的用法是,我们期望响应/消息是某个值。eql
此时发挥作用,因为它帮助我们完成预期语句的其余部分。我们期望响应等于某个值。
to
并使eql
语句expect
易于阅读,就像正常的句子一样流畅。在这种情况下,expect(message).to eq “Hello World!”
它听起来就像“期望消息等于 hello world!”
注意:要确定相等性是否为假而不是真,可以使用关键字not_to
代替to
。
最后的想法
好了,我们讲解了构成 RSpec 测试的最基本组件。我们讨论了构建 RSpec 测试的三个重要模块:describe
、context
和it
,以及可以在其中使用的关键字。
我希望读完本文后,您能更好地理解为什么我们在测试中使用不同的块和关键字。在本系列的后续文章中,我将介绍与expect
关键字一起使用的其他方法以及其他 RSpec 方法,敬请期待。
注意:本周的封面图片来自爱尔兰康尼马拉(我的家人/家族的故乡)。
来源
RSpec 教程
权威的 RSpec 教程,包含示例,
介绍测试驱动开发 (TDD),
Ruby 的行为驱动开发。让 TDD 高效有趣。