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

afdcj2ne  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(123)

我最近开始在一个自动化测试项目中工作,这个项目使用Ruby+Minitest,我想知道我是否可以运行一个测试,它的数量是我提供的输入数据的两倍。
所以,我有smth喜欢(代码是根据保密协议,所以我不能提供真实的例子)

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

字符串
诀窍在于,在process_new_entry方法内部有一个循环,我很乐意摆脱它,只需按照list_entries上的条目数来运行此测试
在Java+Selenium的TestNG中,我想起了一个使用数据提供程序的概念,它将输入数据一个接一个地传递到测试方法中。这里有没有可能实现类似的方法?

gzjq41n4

gzjq41n41#

如果您有:

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


但我不认为如此间接/抽象有什么好处。我建议保持明确,保持代码和执行状态可检查且易于调试:

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

相关问题