rspec - 使用 RSpec 构建 CSV 数据驱动测试的基本简单方法?

标签 rspec rspec2 rspec3

我是 Ruby 和 RSpec 的新手,做了一些研究,发现有几种方法可以从在线帖子中进行数据驱动的枚举测试,但它们没有像完整的教程那样详细介绍。因此,在我再次详细查看这些在线文章之前,我想我应该先在这里询问。

这是我基于使用 RSpec 的标准简单方法(定义的描述和它 block ,而不是导入 RSpec 的部分来仅实现期望)的设置。然后我尝试为其添加数据驱动能力:

require 'rspec'
require 'csv'

describe "test suite name" do
  before :all do
    #this CSV mapping method found online...
    @device_client = CSV.read path
    @descriptor = @device_client.shift
    @descriptor = @descriptor.map { |key| key.to_sym }
    @device_client.map { |client| Hash[ @descriptor.zip(client) ] }
  end

  @device_client.each do |client|
    describe "#{client[:test_scenario]}" do
      if "match some CSV field value"
        it "should run this kind of test" do
          #additional code as needed
          expect(some_actual).to eql(some_expected)
        end
      end

      if "match some other CSV field value"
        it "should run that kind of test" do
          #additional code as needed
          expect(some_actual).to eql(some_expected)
        end
      end

      it "some other test common to all CSV rows" do
        #stuff
      end
    end
  end

end

我在这里注意到 @device_client 是 nil,因为它现在的结构(使用“p @device_client”语句进行调试以转储内容)。为了使其有值(value),我必须将哈希值包含在其范围内的 it block 内(我通常将其放在另一个描述 block 内,尽管假设我可以跳过额外的描述)。

我如何重组测试以“阅读”相同内容(对测试的读者来说)并按照我想要的方式运行?如果重组意味着我无法使用标准 RSpec 格式并且必须以不同方式要求 RSpec 组件(在线帖子似乎不遵循简单/基本 RSpec 格式),那也没关系。

我认为我的代码解释起来相当简单。如果没有,目的是使用 CSV 输入动态构建测试。每个 CSV 行都是一个具有多个测试的场景 - 1 个测试因 CSV 字段值而异,因此 ifs,其余测试对于所有场景都是通用的。我们对文件中尽可能多的 CSV 场景行重复此设置。 before all block 是我们处理 CSV 数据之前的全局设置。

在重组中,理想情况下,我想保留描述和它的文本描述 block (或与之相当的东西),以便在测试结果中它们显示描述测试,而不仅仅是一堆期望。

最佳答案

这样的事情应该有效:

require 'csv'

describe "test suite name" do
  device_client = CSV.read path
  descriptor = device_client.shift
  descriptor = descriptor.map { |key| key.to_sym }
  clients = device_client.map { |client| Hash[ descriptor.zip(client) ] }

  clients.each do |client|
    describe "#{client[:test_scenario]}" do
      if "match some CSV field value"
        it "should run this kind of test" do
          #additional code as needed
          expect(some_actual).to eql(some_expected)
        end
      end

      if "match some other CSV field value"
        it "should run that kind of test" do
          #additional code as needed
          expect(some_actual).to eql(some_expected)
        end
      end

      it "some other test common to all CSV rows" do
        #stuff
      end
    end
  end
end

与您的版本相比的显着变化:

  • 无需要求 rspec(当您运行 rspec 命令时,RSpec 会自行加载)。
  • 我将 CSV 逻辑从 before(:all) 移出并移至 describe 正文中。您之前遇到的问题是,before 钩子(Hook)在定义所有示例和组之后、执行特定组之前运行。您需要在规范定义期间(执行 describe block 期间)利用 CSV 文件内容。
  • 我从实例变量切换到局部变量。您之前所做的不起作用,因为 before(:all) Hook 在示例组类的实例的上下文中运行,而描述 block 在类本身的上下文中运行 - - 因此它们在不同的上下文中运行并且无法访问相同的实例变量。一旦我们将逻辑移至 describe block 中,您就可以使用简单的局部变量。
  • 我将 clients = 添加到 before(:all) 逻辑的最后一行。您之前的做法是丢弃 device_client.map { ... } 的结果,但我假设这就是您想要使用的结果。

有关 describebefore block 之间范围差异的更多信息,请参阅 section in the rspec-core README that discusses scope .

关于rspec - 使用 RSpec 构建 CSV 数据驱动测试的基本简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31375083/

相关文章:

ruby-on-rails - 关系的未定义方法 `find_or_initialize'

rspec - 我自己的 DSL 位于 rspec、cucumber 之上

ruby - 使用 RSpec 2 测试 RUBY_PLATFORM

ruby-on-rails-4 - 使用 rails 4 和 rspec 3 被 verify_partial_doubles 绊倒

ruby - 更改 described_class.new 参数的值

ruby - Rspec——模拟另一个类中的方法

ruby-on-rails - Rspec link_to - 包括确认/数据确认属性导致测试失败

ruby-on-rails - 我应该在 rspec 中使用什么类型的 "assert"来验证先决条件是否正常?

ruby - 如何在 rspec 中模拟我的父类(super class)

ruby - RSpec3 模拟参数期望 - 使用 &block?