是否可以使用 Ruby+Minitest 编写参数化测试?

Is there a possibility to write parametrized tests with Ruby+Minitest?

我最近开始从事一个自动化测试项目,该项目使用 Ruby+Minitest,我想知道我是否可以 运行1 测试我提供的输入数据的次数。

所以,我有类似的东西(代码在 NDA 下,所以我不能提供真实的例子)

def test_new_registrations
  result = process_new_entry(list_entries)
  assert(validator_method(result), result)
end

诀窍是在 process_new_entry 方法中有一个循环,我很高兴摆脱它,只是 运行 这个测试的次数与 [=13= 中的条目一样多]

来自 Java+Selenium 中的 TestNG 我想起了使用数据提供程序的概念,该数据提供程序在测试方法中将输入数据一个接一个地传递。 有没有可能在这里实施类似的方法?

如果你有:

class MyTest
  TESTCASES = {
    // input => expected
    a: "a",
    b: "b",
    c: "c",
  }

  def test_testcases
    TESTCASES.each do |entry, expected|
      result = process_one(entry)
      assert(expected, result)
    end
  end
end

而且您确实希望 运行 每个案例都在其自己的测试中,那么它只是:

MyTest
  TESTCASES = {
    // input => expected
    a: "a",
    b: "b",
    c: "c",
  }

  TESTCASES.each do |entry, expected|
    define_method("test_testcase_#{entry}") do
      result = process_one(entry)
      assert(expected, result)
    end
  end
end

如果您真的想要使用与 Java 中完全相同的语法,则可以将上面的内容转换成一个库,这样就可以工作了:

testcase_parameters(TESTCASES) # left as an exercise to the reader
def test_testcase(entry, expected)
  assert(expected, process_one(entry))
end

但我看不出如此 indirect/abstract 有什么好处。我建议保持明确,保持代码和执行状态可检查且易于调试:

class MyTest
  TESTCASES = {
    // input => expected
    a: "a",
    b: "b",
    c: "c",
  }

  def test_testcases
    results = TESTCASES.map do |entry, expected|
      result = process_one(entry)
      [entry, [expected, result]]
    end

    invalid_results = results.select { |e, (ex, res)| ex != res }

    # This is a very easy-to-breakpoint place in code, to easily view all results:
    # binding.pry

    assert_empty invalid_results # failure cases will be printed out by test output
  end
end