如果您编写一个测试类,如
class MyTest < Test::Unit::TestCase
def setup
end
def test_1
flunk
end
def test_1
assert true
end
end第一个test_1被忽略。虽然这看起来是个愚蠢的错误,但它可能发生在复制和粘贴编程中。除了跑步
grep test test_me.rb | wc与有多少测试单元表示已经运行,或者使用rcov或heckle,或者使用-w运行的测试单元相比,如何才能检测到这些问题?
另外,是否有任何方法来指定不应该覆盖测试方法?
编辑:正在测试的方法有一个参数,其值为6个左右,测试人员希望测试每个场景。这就是为什么使用复制和粘贴编程。对于这种情况,我能设想的唯一选择是一个参数和期望值的六元素数组。
发布于 2009-02-20 17:44:07
您可以利用Ruby的method_added,只要将方法添加到类中,就会调用它。您应该能够将某些内容放入您包含的模块中,但这里有一个在测试类中执行该操作的简单示例。
class MyTest < Test::Unit::TestCase
@@my_tests = []
def self.method_added(sym)
raise "#{sym} already defined!" if @@my_tests.include? sym
@my_tests << sym
end
def test_foo_1
end
def test_foo_2
end
def test_foo_1
end
end发布于 2009-02-21 10:00:58
编辑:正在测试的方法有一个参数,有大约6个可能的值,测试人员希望测试每个场景。这就是为什么使用复制和粘贴编程。
在这种情况下,我这样做:
def test_foo
test_cases = [
{:param => 1, :expected => 'whatever is expected'},
{:param => 2, :expected => 'whatever is expected'},
{:param => 3, :expected => 'whatever is expected'},
{:param => 4, :expected => 'whatever is expected'},
{:param => 5, :expected => 'whatever is expected'},
{:param => 6, :expected => 'whatever is expected'}
]
for test_case in test_cases
do_the_test(test_case)
end
end
def do_the_test(test_case)
# test code here
end这完全避免了复制和粘贴,正如已经说过的,这是不好的。
对于这种情况,我能设想的唯一选择是一个参数和期望值的六元素数组。
一点儿没错!
发布于 2009-02-21 12:32:20
关于HermanD的答案,因为这是Ruby!,所以您也可以在类中直接这样做,以创建唯一的测试方法:
class MyObjectTest < Test::Unit::TestCase
[
{:param => 1, :expected => 'whatever is expected'},
{:param => 2, :expected => 'whatever is expected'},
{:param => 3, :expected => 'whatever is expected'},
{:param => 4, :expected => 'whatever is expected'},
{:param => 5, :expected => 'whatever is expected'},
{:param => 6, :expected => 'whatever is expected'}
].each do |test_case|
define_method :"test_using_#{test_case[:param]}_should_return_#{params[:expected].underscore}" do
assert_equal test_case[:expected], MyObject.new.do_something_with(test_case[:param])
end
end
end使用Rspec(或Shoulda's)语句更自然一些,就像语言一样:
describe MyObject do
[
{:param => 1, :expected => 'whatever is expected'},
{:param => 2, :expected => 'whatever is expected'},
{:param => 3, :expected => 'whatever is expected'},
{:param => 4, :expected => 'whatever is expected'},
{:param => 5, :expected => 'whatever is expected'},
{:param => 6, :expected => 'whatever is expected'}
].each do |test_case|
it "should return #{test_case[:expected]} when using #{test_case[:param]}" do
MyObject.new.do_something_with(test_case[:param]).should == test_case[:expected]
end
end
endhttps://stackoverflow.com/questions/567660
复制相似问题