zoukankan      html  css  js  c++  java
  • 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框架的部分或全部组件提高速度。 

  • 相关阅读:
    Lucene搜索引擎例子demo
    java Log4j日志配置详解大全
    java获取当前上一周、上一月、上一年的时间
    Django组件-cookie与session
    前端基础之jQuery
    Django组件-forms
    Django组件-分页器
    Django-Ajax
    Django模型层-多表操作
    Django模型层-单表操作
  • 原文地址:https://www.cnblogs.com/chentianwei/p/9069316.html
Copyright © 2011-2022 走看看