2017-02-15 1 views
0

Я хотел написать тест, чтобы проверить двоичные строковые представления целых чисел с различной длиной. Я не знаю, как вычислить ожидаемые значения для случайных положительных и отрицательных целых чисел, представленных в виде двоичных строк, с разными двоичными длинами (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

@SergioTulentsev - я уточню свой вопрос - я знаю, как вычислить двоичные представления положительных и отрицательных чисел - проблема специфична для ruby, будучи динамически типизированной, что она не имеет внутреннего размера (в байтах) для целого числа , Сам размер, по-видимому, растет с целым числом (целые числа могут быть сколь угодно большими, а рубин растет, чтобы поддерживать их ограниченным только памятью). Способ вычисления двоичного представления для разных размеров ** - это то, что я делаю в вышеприведенной функции. Как я теперь * проверяю * его точность? – Anand

+1

Поместите разъяснение в свой вопрос, вставив его там, где у вас было бы, если бы вы ввели его на начальном этапе. _Не используйте «обновленные» или «отредактированные» теги_. Мы можем сказать, что было добавлено в случае необходимости. Таким образом, каждый будет видеть информацию без необходимости читать каждый комментарий. –

ответ

6

Не тестируйте случайные произвольные значения в своих модульных тестах. Выберите набор входов для проверки их известных ожидаемых результатов. Включите граничные случаи. Добавьте дополнительные тестовые примеры, когда они появляются в производстве, чтобы гарантировать, что вы не вводите регрессии.

В простейших терминах создайте хэш входов для ожидаемых значений, а затем выполните итерацию по хешу и утвердите, что фактическое значение равно ожидаемому значению.

+0

Да, я согласен - с конкретными входами, включая краевые случаи, это сработает. Тем не менее, я предпочитаю использовать случайные значения. Я думаю, что одна тенденция в тестировании поощряет случайное тестирование ценности, именно потому, что мы не можем доверять себе, чтобы предвидеть правильный набор случаев (обезьяна-хаос Netflix - пример: http://techblog.netflix.com/2012/07/chaos-monkey- release-in-wild.html) – Anand

+3

@Anand Использование случайных входов и * вычислений * ожидаемые выходы обходят точку написания тестов. Теперь у вас есть две реализации, которые вы тестируете друг против друга, вместо проверки одной реализации с известными хорошими значениями. Теперь ваши тесты нуждаются в тестах. – meagar

+2

@Anand Это говорит, что есть время и место для рандомизированного тестирования, и это не модульное тестирование. Chaos Monkey работает * порядков * выше по стеку, чем простые модульные тесты. Рандомизированное тестирование - хороший способ застраховать вас * пропустите * краевые случаи, которые являются наиболее ценными случаями для покрытия. – meagar

Смежные вопросы