如何在Ruby中测试
if shuffle
some_array.shuffle.each { |val| puts "#{val}" }
end
我是否需要测试shuffle或者不是因为它是Ruby方法?感谢。
答案 0 :(得分:4)
简短回答:不。
你可以相信Ruby会正确地做事。它已经有huge number of tests。
答案很长:是的。
您不应该直接测试shuffle
方法,而是测试您的代码会产生正确的结果。
由于您的代码使用puts
,因此测试非常烦人。如果你可以编写一个方法来返回可以打印的值,那通常会好很多。编写代码时,一定要考虑如何测试代码。
如果您正在努力解决这个问题,那么测试某些内容的方法并不明确,首先编写测试,然后编写代码以使其通过。
如果必须改变你的价值观,那么你需要想出一种方法来确定它们是否已被充分洗牌。这可能很困难,因为随机性是一种变化无常的事情。 shuffle
对您的数据没有任何作用,这是一个很小但非零的机会,这就是随机性的工作原理。这个概率越大,你的列表越小,只保证一个元素不做任何事情。
因此,如果你能描述为什么应该改组数据,以及什么构成一个好的改组,那么你可以为此编写一个测试。
以下是如何执行此操作的示例:
gem 'test-unit'
require 'test/unit'
class MyShuffler
def initialize(data)
@data = data
end
def processed
@data.map do |e|
e.downcase
end.shuffle
end
end
现在你可以这样使用:
shuffler = MyShuffler.new(%w[ a b c d e f ])
# Thin presentation layer here where we're just displaying each
# element. Test code for this is not strictly necessary.
shuffler.processed.each do |e|
puts e
end
现在,您可以单独编写数据操作的测试代码,而不是演示文稿部分:
gem 'test-unit'
require 'test/unit'
class MyShufflerTest < Test::Unit::TestCase
def test_processed
shuffler = MyShuffler.new(%w[ A B c Dee e f Gee ])
results = shuffler.processed
expected = %w[ a b c dee e f gee ]
assert_equal expected, results.sort
assert_not_equal expected, results
counts = Hash.new(0)
iterations = 100000
# Keep track of the number of times a particular element appears in
# the first entry of the array.
iterations.times do
counts[shuffler.processed[0]] += 1
end
expected_count = iterations / expected.length
# The count for any given element should be +/- 5% versus the expected
# count. The variance generally decreases with a larger number of
# iterations.
expected.each do |e|
assert (counts[e] - expected_count).abs < iterations * 0.05
end
end
end
答案 1 :(得分:0)
您不应使用单元测试来测试随机性。单元测试应调用方法并根据预期值测试返回值(或对象状态)。测试随机性的问题在于,您希望测试的大部分内容都没有预期值。