是否可以使用 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
我最近开始从事一个自动化测试项目,该项目使用 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