使用RSpec编写具有可读性的功能测试

 Chris Zetter是FutureLearn产品组的一名开发者,他为我们讲述了自己的小组为了使功能测试兼具可维护性与可读性,在把Cucumber替换为RSpec之后是如何来编写测试的。

  测试是建立与维护一个大型平台不可或缺的一部分。每当我们为FutureLearn这个平台增添新功能时,我们都会编写自动化的功能测试来记录这些新功能是如何运作的,并确保他们不运转时我们也能知晓。

  令人爱恨交加的Cucumber

  Cucumber是一款用来编写功能测试的常用工具,每当我们开启项目时它都是我们的不二选择。它可以让我们以用户的视角编写出高层级的行为驱动测试。


Feature: Enrolment

Scenario: Enrolling in a course

Given there is a course

And I am logged in as a learner

When I enrol on a course

Then the course should appear in 'my courses'

  我们乐于使用Cucumber因为它可以使根据用户故事编写测试变得简单易行,而且写完的测试通俗易懂。然而使用Cucumber也有些许不足之处。首先,我们已经在项目里使用了RSpec,再引入Cucumber意味着又要多维护一个测试框架;其次,由于两者的DSLs和测试运行器不同,在他们之间进行脑筋切换又会带来额外开销;最后,我们特别不喜欢Cucumber所使用的正则表达式,因为同Ruby的标准方法调用相比,它们使测试变得更加晦涩难懂。

  编写更好的RSpec features

  那么,我么该如何在不失测试可读性的前提下停用Cucumber呢?

  我们已经开始使用RSpec features来替代Cucumber,它们通常看起来会是这样:


feature 'Enrolment' do

scenario 'Enrolling in a course' do

course = FactoryGirl.create(:course)

learner = FactoryGirl.create(:learner)

login_as learner

visit course_path(course)

find('.join').click

expect(page).to have_content('Thanks for joining!')

visit '/'

expect(page).to have_main_header('My Courses')

expect(page).to have_content(course.full_title)

end

end

  它们总是趋于变得很长,使得难以辨明其究竟在测试些什么。而且难以区分诸如Arrange, Act, Assert(在Cucumber里又被称为’Given’、’When’和’Then’)这些部分。我们试过在代码中这些步骤里添加注释,但它们就和通常那些程序代码里的注释一样不尽如人意:一段时间之后这些注释就变得与实际代码不同步了。

  一般来说,如果是在程序里别的地方写出这么长的方法,我们就会有所警觉,并且通常会采用提取方法的办法进行重构。何不也这么做呢?让我们依据Cucumber步骤的风格,把这些代码也提取成一个个方法吧。


feature 'Enrolment' do

scenario 'Enrolling in a course' do

given_there_is_a_course

and_i_am_logged_in_as_a_learner

when_i_enrol_on_a_course

then_the_course_should_appear_in_my_courses

end

def given_there_is_a_course

@course = FactoryGirl.create(:course)

end

def and_i_am_logged_in_as_a_learner

@learner = FactoryGirl.create(:learner)

login_as @learner

end

def when_i_enrol_on_a_course

visit course_path(@course)

find('.join').click

expect(page).to have_content('Thanks for joining!')

end

def then_the_course_should_appear_in_my_courses

visit '/'

expect(page).to have_main_header('My Courses')

expect(page).to have_content(@course.full_title)

end

end

  我们有何发现

  我们移除了全部的Cucumber功能测试,并把它们中大部分用新式的RSpec features加以重写。这样一来即可保证拥有Cucumber所提供的优秀的可读性,又使得测试变得更加便于编写和维护。

  我们做了一个慎重的决定,不把各个features文件里提取的方法进行复用,因为担心这么做会使得测试难于理解。我们发现在编写一个feature下的多条scenario时,会不自觉的就想要进行代码复用。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-07-29 09:33:43

使用RSpec编写具有可读性的功能测试的相关文章

测试新思维 DevOps -《测试技术八月刊》

业界前沿 测试新思维-DevOps 徐盛:HPE测试中心总监.徐盛将在本次开放日带来<软件测试新趋势>的分享,在开放日举办之前,主办方特别对徐盛进行了采访,提前剧透在软件测试新趋势下HPE如何进行测试和质量管理. 虚拟化技术在软件测试的应用 虚拟化技术很早就提出来了,但是真正走向市场是从2005年以后,那时候AMD和Intel公司都开始推出支持虚拟化技术的CPU.简单的说,虚拟机就像一个软件容器,可以安装操作系统和应用软件,像一台物理机一样运行,其有如下特点. 使用RSpec编写具有可读性的功

Mustang与Rhino:Java 6中的脚本编写

最新的Java主版本(Java SE 6,又称Mustang)现在正处于beta版本阶段.虽然该版本并不像Java 5的更新那么多,但是它确实有一些有趣的新特性.毋庸置疑,其中的一个就是对脚本编写语言的支持. 诸如PHP.Ruby.JavaScript.Python(或Jython)之类的脚本编写语言被广泛应用于许多领域,并由于其灵活性和简单性而大受欢迎.由于脚本是被解释而不是被编译的,所以可以轻松地从命令行运行和测试它们.这就压缩了编码/测试周期,并提高了开发人员的生产率.脚本通常是动态键入的

提升代码可读性的 10 个技巧

代码可读性是计算机编程领域中普遍存在的问题.这也是我们成为开发者首先要学习的事情之一.本文会详细介绍在编写强可读性代码时最佳实践中最重要的一部分内容. 1 - 注释和文档 IDE(Integrated Development Environmnet,集成开发环境)在过去数年中已经存在了很长时间.使用 IDE 注释代码比以往容易得多.某些确切的注释标准可以让 IDE 和其它工具以不同的方式来完成注释. 看个示例: 我在这里添加到函数定义前的注释可以在使用函数的时候显示出来,甚至在其它文件中使用这个

提升代码可读性的10个技巧

具有较强可读性的代码,能帮助你调试程序,不让自己活得太累. 代码可读性是计算机编程领域中普遍存在的问题.这也是我们成为开发者首先要学习的事情之一.本文会详细介绍在编写强可读性代码时最佳实践中最重要的一部分内容. 1 – 注释和文档 IDE(Integrated Development Environmnet,集成开发环境)在过去数年中已经存在了很长时间.使用 IDE 注释代码比以往容易得多.某些确切的注释标准可以让 IDE 和其它工具以不同的方式来完成注释. 看个示例: 我在这里添加到函数定义前

编写自文档化的代码

文所以载道也.  -- 宋·周敦颐<通书·文辞> 对于我们程序员来说,我们的工作也是写作--几乎每天都要写代码:而且还要载"道",不仅仅要满足客户的需求,还要让代码具有高度的可读性,这样其他的程序员可以更容易地对代码进行修改和扩展. 按这样的要求,我们需要为代码编写足够的文档,也就是将代码"文档化".常见的做法有两种,外部文档和注释. 外部文档 外部文档指的是在代码文件之外编写的附加文档,比如在Word文档中采用大量的篇幅(如UML图.表格)来设计或记录

艾伟_转载:编写自文档化的代码

文所以载道也.  -- 宋·周敦颐<通书·文辞> 对于我们程序员来说,我们的工作也是写作--几乎每天都要写代码:而且还要载"道",不仅仅要满足客户的需求,还要让代码具有高度的可读性,这样其他的程序员可以更容易地对代码进行修改和扩展. 按这样的要求,我们需要为代码编写足够的文档,也就是将代码"文档化".常见的做法有两种,外部文档和注释. 外部文档 外部文档指的是在代码文件之外编写的附加文档,比如在Word文档中采用大量的篇幅(如UML图.表格)来设计或记录

C#程序设计入门经典之C#的基本语法

程序|设计|语法 C#代码的外观和操作方式与C++和Java非常类似.初看起来,其语法可能比较混乱,不像书面英语和其他语言.但是,在C#编程中,使用的样式是比较清晰的,不用花太多的力气就可以编写出可读性很强的代码. 与其他语言的编译器不同,无论代码中是否有空格.回车符或tab字符(这些字符统称为空白字符),C#编译器都不考虑这些字符.这样格式化代码时就有很大的自由度,但遵循某些规则将有助于使代码易于阅读. C#代码由一系列语句组成,每个语句都用一个分号来结束.因为空格被忽略,所以一行可以有多个语

Kotlin与Java之争 究竟谁更好?

Kotlin Kotlin 是一门相对比较新的 JVM 语言,JetBrains 自 2011 年以来一直在积极地开发. 多年来,该语言在 Android 社区受到的关注度越来越高,并在 Google IO 2017 大会之后成为 Android 开发领域最热门的话题.这次大会宣布,Android 正式支持 Kotlin. 遗憾的是,虽然已经有许多关于 Kotlin 的文章,但并没有多少客观信息,许多开发人员仍然在苦思冥想,迁移到 Kotlin 是否是一条正确的道路. 在本文的剩余部分,我将尝试

轻量函数式 JavaScript:一、为什么要进行函数式编程?

函数式程序员:(名词)那些将变量命名为"x",函数命名为"f",并将代码模式称为"zygohistomorphic prepromorphism"的程序员. James Iry ‏@jamesiry 5/13/15 https://twitter.com/jamesiry/status/598547781515485184 函数式编程(FP)无论如何都不是一个新概念.它在编程的整个历史中一直存在着.然而可以确定的是 -- 我不确信这样说是否合理,