2013-03-12 2 views
1

Например, я хотел бы подтвердить, что это имя только буквы и от 4 до 14 букв. У меня есть следующий код в модели:Как я правильно тестирую?

validates: name, :format => { :with => /^[a-zA-Z]+$/, 
            :message => 'Name should be letters only. }, 
        :length => { :minimum => 4, :maximum => 14 } 

Таким образом, это ясно позволяет мне делать то, что я хочу.
Но для модульных тестов, у меня есть немного слишком много перфекционизма поэтому я что-то вроде

invalid_names = ['1234', 
       'qwe', 
       '1%#$#$', 
       'Sam1', 
       '%', 
       random_string(15)] #I also have a test method to create random string with parametrized length 

valid_names = %w['test', 
       'Travis', 
       'John', 
       random_string(5), 
       random_string(14), 
       random_string(4)] 

и проверить каждый из них в цикле с утверждающей, как

invalid_names.each do |name| 
    user = User.new(:name => name) 
    user.save 
    assert user.errors[:name].any?, "#{name} is valid." 
end 

Так что определенно работает Великий. Но это слишком многословно, также я не могу быть уверен, что мой тест на самом деле проверяет все символы и их комбинации, возможные и все длины и прочее, хотя я уверен, что он работает так, как ожидалось.
Итак, что приемлемый способ проверить мою проверку, не будучи слишком перфекционистом, но оставив большую часть тестируемой логики?
Я просто настроен на то, чтобы написать идеальный код, чтобы написать идеальный код и забыть о главной цели: рабочий продукт?

ответ

2

Я думаю об этом так: что вы пытаетесь проверить? Насколько вы уверены в своем регулярном выражении (которое в этом случае просто невозможно)?

Случайное строковое тестирование бессмысленно, ИМО и бессмысленно для читателя, потому что функция генерации слабо названа в том смысле, что она не указывает, что она будет генерировать имена, которые соответствуют регулярному выражению, которое я могу извлечь из контекста, но это все еще как предположение.

Люди TDD будут ударять меня по лицу, но я не уверен, что уйду в эти тесты после того, как первоначальная разработка имеет длительную ценность. Я даже не убежден, что у меня есть тесты для этого . Значение имеет значение, потому что логика тривиальна, и мне кажется, что это больше связано с тестированием Rails, чем с моей проверкой.

Дельта мои комментарии о методе генерации строк, однако, у меня нет никаких проблем с тестами, которые вы показываете. Если будут проходить тесты, это разумный способ написать их, легко добавить примеры использования и, кроме незначительного увеличения времени тестирования, они не навредят.

+0

Ну, я младший разработчик, но даже с такими проверками я действительно пропустил какую-то ошибку в своем регулярном выражении: я забыл поставить начальную и конечную точки, так что имя «Джон1» было бы действительно, поэтому тест помог мне здесь. Однако, как вы сказали, все еще хромой xD – konnigun

+1

@ Konnigun Я действительно не сказал бы, что они «хромые». В частности, когда вы не уверены, лучше ошибиться на стороне осторожности. Стоимость (относительно) низкая. –

1

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

+0

Да, вы правы, спасибо!И для специальных символов я могу просто проверить несколько из них, я не могу проверить все это на самом деле и все комбинации, так что все-таки какое-то окно остается за ошибкой, но все равно ничего не идеального, попытка тестирования каждой отдельной части не нужна, особенно для такого простого регулярного выражения hehe – konnigun