Нужно ли при первичной разработке теста искать наборы данных, приводящих к коллизии 
При написании очередного теста возник такой вопрос: на сколько полным должен быть набор входных данных для теста. Допустим, мы создали реализацию, опираясь на тест только с одним набором данных. Тест проходит успешно и завершается зеленой полосой. Над кодом тестируемого класса выполнен рефакторинг. Что дальше?
Тут есть два варианта: с одной стороны, можно расширить количество тестовых данных с целью найти такой набор, который приводит к коллизии, с другой стороны, можно двинуться дальше и приступить к следующему тесту.
Со своей стороны я больше склоняюсь ко второму варианту. По следующим причинам:
Во-первых, один пройденный тест - это всего лишь небольшой шаг к конечной реализации тестируемого класса. У программиста еще нет представления о том, какой будет конечный результат разработки и тратить время на поиск возможных багов неразумно.
Во-вторых, в процессе реализации последующих тестов необходимость в части тестов может пропасть, в том числе и в тесте, для которого мы усердно искали дополнительные наборы данных. Опять потеря времени.
В-третьих, процесс рефакторинга относиться не только к рабочему коду, но и к тестовому тоже. А значит идеи, которые применяются в процессе разработки боевого кода, применимы и к тестам. Одна из этих идей заключается в том, что первоначально нужно стремиться к наиболее простой реализации, усложняя ее по мере необходимости.
Таким образом приходим к выводу, что первоначально делаем максимально простой тест, который работает на одном конкретном наборе данных, и только потом, когда значительная часть боевого кода готова, начинаем выискивать его недостатки.
P.s. обратил внимание, что в последнее время очень низкая активность в комментариях. Очень прошу не молчите, ведь я пишу не столько для себя, сколько для вас. Для меня лучше получить негативный комментарий, чем вообще ничего.
подписаться на блог
Alex
Гость
можешь привести пример трех последних написанных тобой тестов?
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Alex, самые последние тесты:
describe Phpbb_Poster do
before(:each) do
@phpbb_poster = Phpbb_Poster.new ‘http://www.pragmaticweb.ru’, ‘login’, ‘password’
end
it “Должен публиковать топики в форум на PHPBB” do
@phpbb_poster.login
@phpbb_poster.sid.length.should == 32
@phpbb_poster.uid.should == ‘96′
forums = @phpbb_poster.get_forums
forums[9].should == ['10', 'Общие вопросы PHP']
@phpbb_poster.get_attrs_from_newtopic_form forums[10][0]
@phpbb_poster.lastclick.length.should == 10
@phpbb_poster.form_token.length.should == 40
@phpbb_poster.creation_time.length.should == 10
@phpbb_poster.topic_cur_post_id == nil
@phpbb_poster.publish(’Title’, ‘Content’, ‘8′).should > 0
end
it “Должен публиковать ответы к топикам на PHPBB” do
@phpbb_poster.login
@phpbb_poster.sid.length.should == 32
@phpbb_poster.uid.should == ‘96′
@phpbb_poster.get_attrs_from_newtopic_form ‘9′, ‘71′
@phpbb_poster.lastclick.length.should == 10
@phpbb_poster.form_token.length.should == 40
@phpbb_poster.creation_time.length.should == 10
@phpbb_poster.topic_cur_post_id.should == ‘103′
@phpbb_poster.publish(’Title’, ‘Content’, ‘9′, ‘71′).should == 71
end
end
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Когда писал заметку имел в виду такой тест:
it “должен получить из урла имя приложения и действия” do
urls = [
# url, application, action
['/notepad/edit', 'notepad', 'edit'],
['/notepad/edit/some/another/parts', 'notepad', 'edit'],
['/notepad/edit?some_url', 'notepad', 'edit'],
['/notepad/edit/some/part?another=part', 'notepad', 'edit'],
['/notepad', 'notepad', :default],
['/', 'default', :default],
['', 'default', :default]
]
urls.each do |url, app, action|
dispatcher = Dispatcher.new env(url), {}
dispatcher.application.should == app
dispatcher.action.should == action
dispatcher.params.should == {}
end
end
Это простенький диспетчер урлов. Пришел к выводу, что здесь надо ограничиться всего одни урлом и не городить огород.
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Alex, встречный вопрос. Можешь показать свои тесты?
Leave a Reply