我有Ruby 2.0代码,可以使用手机号码进行操作,我想用MiniTest进行测试.我有一个函数,它接受一个电话号码参数并测试它(包括断言).每次我调用该函数时,我都希望它成为一个新的测试用例.像这样的东西:
listOfPhoneNumbersForTesting.each { |phone| testphone phone }
Run Code Online (Sandbox Code Playgroud)
我不想要的是这个:
class test2125551212 < MiniTest::Unit::TestCase
def t2125551212
testphone "2125551212"
end
end
Run Code Online (Sandbox Code Playgroud)
...重复10次,20次或100次测试每个电话号码......
显然,我可以将循环代码放在MiniTest :: Unit :: TestCase中,但无论我测试多少个电话号码,都会产生一个测试用例,我不喜欢这样.(另外,如果其中一个断言失败,那么就不再测试电话号码了,我不想要那个!)另外,第二个表格看起来像是违反DRY,因为类名,函数名和参数都包含电话号码.
不知怎的,我觉得我应该能够有一个名为TestPhone的类,并使用电话号码参数创建它,并将其导入MiniTest框架.但我愿意使用setup(),Fixtures,元编程,或者其他任何东西,如果它能工作的话.
listOfPhoneNumbersForTesting.each { |phone| TestPhone.new phone }
Run Code Online (Sandbox Code Playgroud)
TestPhone是TestCase的子类,最终调用testphone来完成工作.
基本上,我想要的是:1.一个电话号码列表,如果我在列表中添加一个数字,我会在报告输出中再获得一个TestCase.2.如果与一个电话号码相关的测试失败,则其余测试仍在测试中.3.所有电话号码都进行相同的测试,其中包括几个断言.
非常感谢!
Jus*_* Ko 22
您可以动态定义方法.
在以下示例中,动态创建了6个测试(针对正在测试的3个值中的每个值进行2次测试).这意味着如果有任何失败,其他测试仍然会运行.
require "minitest/autorun"
class MyTests < MiniTest::Unit::TestCase
['0', '1111111', '2222222'].each do |phone_number|
define_method("test_#{phone_number}_has_7_characters") do
assert_equal(7, phone_number.length)
end
define_method("test_#{phone_number}_starts_with_1") do
assert_equal('1', phone_number[0])
end
end
end
Run Code Online (Sandbox Code Playgroud)
apply测试用例给出以下结果:
# Running tests:
F..F.F
Finished tests in 0.044004s, 136.3512 tests/s, 136.3512 assertions/s.
1) Failure:
test_0_starts_with_1(MyTests) [stuff.rb:13]:
Expected: "1"
Actual: "0"
2) Failure:
test_0_has_7_characters(MyTests) [stuff.rb:9]:
Expected: 7
Actual: 1
3) Failure:
test_2222222_starts_with_1(MyTests) [stuff.rb:13]:
Expected: "1"
Actual: "2"
6 tests, 6 assertions, 3 failures, 0 errors, 0 skips
Run Code Online (Sandbox Code Playgroud)
将相同的概念应用于您的测试,我认为您想要:
class MyTests < MiniTest::Unit::TestCase
listOfPhoneNumbersForTesting.each do |phone|
define_method("test_#{phone}") do
TestPhone.new phone
end
end
end
Run Code Online (Sandbox Code Playgroud)
使用spec-style测试时可以采用类似的方法:
require 'minitest/spec'
require 'minitest/autorun'
describe "my tests" do
['0', '1111111', '2222222'].each do |phone_number|
it "#{phone_number} has 7 characters" do
assert_equal(7, phone_number.length)
end
it "#{phone_number} starts with 1" do
assert_equal('1', phone_number[0])
end
end
end
Run Code Online (Sandbox Code Playgroud)
重要提示:需要注意的一点是,您需要确保为每个测试用例创建的测试方法的名称是唯一的.
例如,如果您未将电话号码放在方法名称中,则最终会覆盖以前定义的方法.最终,这意味着只测试最后一个电话号码.
这是因为MiniTest动态生成测试方法,并将覆盖已生成的测试方法,最终只使用最后一个.each变量.