Rspec: everyday-rspec实操: 第9章 快速编写测试,编写快速的测试。

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)

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框架的部分或全部组件提高速度。 

原文地址:https://www.cnblogs.com/chentianwei/p/9069316.html