Давайте не будем забывать о хороших старых циклах:
def test_that_the_first_few_primes_are_detected_as_prime
[2, 3, 5, 7, 11, 13, 17].each do |p|
assert @primality_tester.prime?(p)
end
end
Некоторые люди используют метапрограммирование для определения отдельных методов тестирования, но в этом случае я думаю, что это излишне:
[2, 3, 5, 7, 11, 13, 17].each do |p|
define_method :"test_that_#{p}_is_detected_as_prime" do
assert @primality_tester.prime?(p)
end
end
Вообще, я не думаю, что тесты должны быть сухими.Они должны быть DAMP (описательные и значимые фразы).В конце концов, тесты - это ваша спецификация и ваша документация, и их читают люди, которые могут быть не знакомы с Ruby или вообще с программированием.Поэтому я даже не уверен, что ваш исходный пример плох, особенно если вы немного очистите его, как я делал выше:
def test_that_2_is_detected_as_prime
assert @primality_tester.prime?(2)
end
def test_that_3_is_detected_as_prime
assert @primality_tester.prime?(3)
end
def test_that_5_is_detected_as_prime
assert @primality_tester.prime?(5)
end
Вот что я сделал:
- Переименуйте тесты: теперь имя теста формирует законченное предложение, и оно не просто повторяет то, что делает тест.
- Используйте
assert
вместо assert_equal
: проверка на равенство true
в любом случае почти никогда не бывает хорошей идеей, и assert
уже проверяет, что результат правдив, так зачем беспокоиться? - Переименовать
@prime_generator
в @primality_tester
, поскольку, ну, это не генерирует простые числа , он только проверяет, является ли число простым. - Переименуйте
is_prime?
в prime?
, поскольку вопрос уже подразумевается под знаком вопроса - И последнее, но не менее важное: исправьте форматирование, поскольку форматирование не только несовместимо со стандартными соглашениями о кодировании Ruby, но даже не согласуется с самими
Тем не менее, лучшее решение IMO будет выглядеть примерно так:
def test_that_the_first_few_primes_are_detected_as_prime
assert @primality_tester.prime?(2)
assert @primality_tester.prime?(3)
assert @primality_tester.prime?(5)
end
Там есть дублирование, но именно дублирование необходимо для того, чтобы тест был читабельным и произносимым.DRY - хороший принцип для производственного кода, который развивается и расширяется, но для тестов DRY всегда должен быть сбалансирован с DAMP.(Возможно, имеет смысл написать собственное утверждение, но я сомневаюсь в этом. По крайней мере, я не могу придумать хорошее название для него, которое всегда является подсказкой.)
Полностью другой подход будет основываться на проверке свойств, подобный QuickCheck Haskell или Pex .NET.Имеется порт QuickCheck для Ruby, который называется RushCheck , но он не поддерживается с 2006 года, и обслуживание ушло всего пару недель назад, и еще предстоит проделать большую работу, чтобы ускорить его в последние годы.версии Ruby.