如何在ruby中单元测试具有不同长度的有符号整数的二进制字符串表示?

时间:2017-02-15 18:19:41

标签: ruby unit-testing

我想编写一个测试来验证具有不同长度的有符号整数的二进制字符串表示。我不知道如何计算表示为二进制字符串的随机正整数和负整数的期望值,具有不同的二进制长度(8,16,32,64)。到目前为止,我有一个测试,只打印出检查值。

下面是测试(只打印结果,没有断言)和函数:

# test

def test_binary_string_with_length
  10.times do 
    n = -rand(128)
    puts "n: #{n} -> bin8: #{binary_string_with_length(n, 8)}"

    n = rand(256)
    puts "n: #{n} -> bin8: #{binary_string_with_length(n, 8)}"

    n = -rand(2 ** 15) 
    puts "n: #{n} -> bin16: #{binary_string_with_length(n, 16)}"

    n = rand(2 ** 16) 
    puts "n: #{n} -> bin16: #{binary_string_with_length(n, 16)}"

    n = -rand(2 ** 31)
    puts "n: #{n} -> bin32: #{binary_string_with_length(n, 32)}"

    n = rand(2 ** 32)
    puts "n: #{n} -> bin32: #{binary_string_with_length(n, 32)}"

    n = -rand(2 ** 63)
    puts "n: #{n} -> bin64: #{binary_string_with_length(n, 64)}"

    n = rand(2 ** 64)
    puts "n: #{n} -> bin64: #{binary_string_with_length(n, 64)}"
  end
end

# function

def binary_string_with_length(n, int_length_in_bits)
  pack = 'Q' # default is 64 bit
  case int_length_in_bits
  when 8
    pack = 'C'
  when 16
    pack = 'S'
  when 32
    pack = 'L'
  when 64
    pack = 'Q'
  end
  sprintf('%b', [n].pack(pack).unpack(pack)[0])
end

如何编写断言来验证每个字符串表示是否正确?

1 个答案:

答案 0 :(得分:6)

不要在单元测试中测试随机任意值。选择一组输入以测试其已知的预期输出。包括边缘情况。在生产中添加其他测试用例,以确保您不会引入回归。

用最简单的术语来说,构建一个输入到预期值的散列,然后遍历散列并断言实际值等于期望值。