Make it work, make it right, make it fast.

  • 测试运行的时间。应用和测试组件的增长,速度会越来越慢,目标是保持代码的readable, maintainable.
  • 如何快速编写清晰的测试

具体:

  • RSpec 为精简代码提供的简练句法;✅找有用的看了看

  • 善用代码编辑器,减少输入量⚠️ 未学

  • 使用驭件和桩件,避免潜在的性能瓶颈; ✅简单了解。

  • 使用标签过滤速度慢的测试; ✅ ,基本学习

  • 提升测试组件整体速度的技术。 ✅ gem ParallelTests


9.1 RSpec 的简练句法

subject和let看起来做了一样的工作,区别是subject对象是测试的焦点,let是辅助。(敏捷开发一书。)

subject用于声明测试的对象。

  subject(:cart) {Cart.new} #声明了变量cart,之后会用到。
  let(:book_one) { products(:ruby)}   #let 声明了其他变量
  let(:book_two) { products(:two)}

9.3 mock, stub

  • 驭件(替身)是用来替代真实对象的测试对象,也被称为测试替身(test double)。驭件可以替代我们之前使用预构件或纯 Ruby 创建的对象,但是不改动数据库中的数据,所以速度快一些。

  • 桩件是对指定对象方法的重写,返回一个预设的值。也就是说,桩件虽是个虚假方法,但调用时
    会返回一个真实的值供测试使用。桩件经常用来重写方法的默认功能,特别是在频繁操作数据库
    或网络密集型交互中。 allow().to receive().and_return()

RSpec内置的mock功能:

反继承的min-in 方法:

delegate(*methods, to: nil, prefix: nil)Link

Provides a delegate class method to easily expose contained objects' public methods as your own. 授权receiver使用某个对象的公共方法,当成自己的方法来用

# object be delegated to use user's name

to: 目标target

prefex: true的话,方法前面加上target的name,然后加_隔开。

  it "delegates name to the user who created it" do
    user = instance_double("User", name: "Fake User")
    note = Note.new
    allow(note).to receive(:user).and_return(user)
    expect(note.user_name).to eq "Fake User"
  end

如果不想大量使用驭件和桩件也没关系,简单的数据用 Ruby 对象,稍微复杂的就用
Factory Bot。桩件很容易带来麻烦。

只要测试不太慢,或者测试的数据无法复现(例如第三方 API 或其他 Web 服务,下一章会详细介
绍),恰当的使用 Ruby 对象和预构件完全可以满足需求。


9.4 tag

https://relishapp.com/rspec/rspec-core/docs/command-line/tag-option#filter-examples-with-non-existent-tag假设我们在为应用添加一个新功能,在这个过程中要编写几个模型测试,一个控制器测试和一个集成测
试。我们可不想在开发过程中运行整个测试组件,而单独运行每个测试又略显麻烦。此时便可以使用
RSpec 标签选项。助标签,我们可以标记要运行的测试,其余的则跳过。

为此,经常使用名为 focus 的标签。在想运行的测试中添加这个标签:

it "processes a credit card", focus: true do

# 测试用例中的步骤

end

然后在命令行中指定 focus 标签,只运行标记的测试:    $ bin/rspec --tag focus

标签名可以自定义为" name: 'value' " 或者 “ name: true ”

如果bin/rspec --tag xxx 不存在这个标签,则只检索测试,并反馈0example,0failures。


9.4 删除非必要测试

如果某个测试的目的达到了,未来不再需要了,放心地删除吧。如果以后还会用到,但是不想每次都运

行,可以跳过那个测试:

it "loads a lot of data" do

skip "no longer necessary"

# 测试用例的代码
   # 不会运行

end


9.6 并行运行测试

我见过要运行 30 分钟的测试,我还听说过比这更慢的测试。运行速度慢的测试组件可以

使用 Parallel-
Tests gem 并行运行。

9.7 高手通过剔除Rails框架的部分或全部组件提高速度。

Rspec: everyday-rspec实操: 第9章 快速编写测试,编写快速的测试。的更多相关文章

  1. Rspec: everyday-rspec实操: 第8章DRY. (6个方法,其中3个方法好上手)

    Don't Repeat Yourself. • 把操作步骤提取到辅助模块中;✅ • 通过let复用测试中的实例变量;✅ • 把通用的设置移到共享的情景中;⚠️(不喜欢) • 在RSpec和rspec ...

  2. Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。

    10.测试文件上传 作者推荐的Paperclip,官方维护组已经不推荐使用deprecated. 推荐使用rails自带的 ActiveStorage. Active Storage: 推进文件上传到 ...

  3. symfony 踩坑之旅 视频实操从第九章开始

    1.annotation定义路由 @Route("/**",defaults={"name":"world"},requirements={ ...

  4. TensorFlow入门实操课程第一章练习笔记

    在本练习中,您将尝试构建一个神经网络,让它根据一个简单的公式来预测房屋的价格. 想象一下,如果房子的定价很简单,带一间卧室的房子价格是5万+5万,那么一间卧室的房子要花10万元:两间卧室的房子就要花1 ...

  5. TensorFlow入门实操课程第一章教程笔记

    神经元网络深度学习的起步程序 Hello World 第一个应用程序总是应该从超级简单的东西开始,这样可以看到代码如何产生和运作的整体框架. 就创建神经网络而言,我喜欢使用的例子是一个能够学习两组数字 ...

  6. Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章

    总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...

  7. Rspec: everyday-rspec实操。5:controller test(了解基础)

    第 5 章 控制器测试 5.1基础 rails generate rspec:controller home RSpec.describe HomeController, type: :control ...

  8. .net基础学java系列(四)Console实操

    上一篇文章 .net基础学java系列(三)徘徊反思 本章节没啥营养,请绕路! 看视频,不实操,对于上了年龄的人来说,是记不住的!我已经看了几遍IDEA的教学视频: https://edu.51cto ...

  9. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...

随机推荐

  1. 《挑战程序设计竞赛》2.5 最小生成树 POJ3723 3169 1258 2377 2395 AOJ2224(1)

    POJ3723 http://poj.org/problem?id=3723 题意 windy要组建一支军队,召集了N个女孩和M个男孩,每个人要付10000RMB,但是如果一个女孩和一个男孩有关系d的 ...

  2. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  3. CentOS下LVM逻辑卷管理技术解释

    1.LVM逻辑卷管理技术产生的背景 企业日益变化的存储需要使得传统的磁盘分区存储显得不够灵活 2.磁盘分区存储 对于这样的三个物理分区的话,迟早有一天会被数据填满,因为它是死的,无法进行缩放. 假设下 ...

  4. UEM用户行为了如指掌!

    “千呼万唤始出来”,万众期待的UEM正式与宝宝们见面啦~~~ 今天很多人来问小编,Web咋不见了,表急,Web并没有消失,而是重磅升级为UEM啦!!! 什么是UEM呢?UEM全称User Experi ...

  5. MongoDB Windows环境安装及配置( 一)

    原文http://www.cnblogs.com/lzrabbit/p/3682510.html MongoDB一般安装 1.首先到官网 (http://www.mongodb.org/downloa ...

  6. proc_create函数内幕初探

    一直以为PROC文件系统很是晦涩难懂,平时仅仅是使用它,不愿意去触碰内核中的具体实现.今天突发奇想,想看看里面究竟是怎么实现的,结果……真是大跌眼镜,没想到里面并不复杂 关于PROC文件系统的功能以及 ...

  7. mysql 数据操作 多表查询 子查询 介绍

    子查询就是: 把一条sql语句放在一个括号里,当做另外一条sql语句查询条件使用 拿到这个结果以后 当做下一个sql语句查询条件mysql 数据操作  子查询 #1:子查询是将一个查询语句嵌套在另一个 ...

  8. 数据库触发器,禁止DDL操作

    CREATE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE FOR ALTER_TABLE,DROP_TABLE,CREATE_TABLE,CREAT ...

  9. SqlServer PIVOT函数快速实现行转列,UNPIVOT实现列转行(转)

    我们在写Sql语句的时候没经常会遇到将查询结果行转列,列转行的需求,拼接sql字符串,然后使用sp_executesql执行sql字符串是比较常规的一种做法.但是这样做实现起来非常复杂,而在SqlSe ...

  10. 表单(中)-EasyUI Combogrid 组合网格、EasyUI Numberbox 数字框、EasyUI Datebox 日期框、EasyUI Datetimebox 日期时间框、EasyUI Calendar 日历

    EasyUI Combogrid 组合网格 扩展自 $.fn.combo.defaults 和 $.fn.datagrid.defaults.通过 $.fn.combogrid.defaults 重写 ...