|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.05.2011, 18:09 | #1 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Test-Driven Development на практике
Test-Driven Development (TDD, разработка через тестирование) является одной из основополагающих техник экстремального программирования, но к сожалению, в россии очень немногие разработчики умеют ею пользоваться.
В настоящей теме, я постараюсь показать на практике что это за фрукт и как его едят Разработка через тестирование подразумевает следующие этапы, которые в 90% случаев идут строго по порядку(об оставшихся 10% скажу позднее): 1. пишется пустой класс А (релизный) 2. пишется класс ATest (тестовый) и в нем создаются заглушки всех тестовых методов(определяем весь функционал который нам нужен от класса А) 3. создаем заглушки методов в классе А, которые должны реализовывать весь необходимый функционал, который выявился на этапе 2 4. Если выявились недостающие тесты, то они декларируются, и реализуются все тестовые методы в классе ATest до конечной стадии. и прогоняем тесты. все тесты должны завершиться с ошибкой (именно ошибкой из-за UnsupportedOperationException, которые выкидываются из класса А), за некоторым специфичным исключением(например, проверка наследования). 5. реализуем все методы в классе A, прогоняем тесты - все тесты должны завершиться успешно. Примером будут служить 2 класса (релизный и тестовый) из проекта Kelvina, в разработке которого участвую я и мой коллега. Язык - Java. Модульные тесты написаны при помощи JUnit. В роли класса А будет: RollbackReaderWrapper В роли класса ATest будет: RollbackReaderWrapperTest
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. Последний раз редактировалось alexinspir; 06.06.2011 в 05:02. |
30.05.2011, 18:13 | #2 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап первый.
Для работы парсеров проекта, нам нужен ридер, который бы позволял либо ставить множественные метки, либо позволял откатываться назад на любую позицию.
Я посчитал что откат будет удобнее, чем множественные метки. Этот функционал будет реализовывать класс RollbackReaderWrapper. Напишем пустой класс: Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. |
30.05.2011, 18:24 | #3 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап второй.
Для того чтобы определиться какой функционал требуется от класса, мы создадим тестовый класс RollbackReaderWrapperTest.
Методами тестового класса(далее - тестовые методы [Test Method]), мы будем определять весь функционал, который нам потребуется от релизного класса. Каждый тестовый метод будет реализован в соответствии с принципом "проверяйте одно условие за тест" (Verify One Condition per Test). Комментарии на русском языке даны чисто для объяснения моих рассуждений, в тестах практически не пишут документационные комментарии. В последующих примерах комментарии будут удалены. Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. Последний раз редактировалось alexinspir; 30.05.2011 в 18:31. |
31.05.2011, 11:25 | #4 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап второй. продолжение.
Мы определили какие нам методы нужны от класса, вот они:
-один конструктор с двумя параметрами -метод aктивации буфера -метод деактивации буфера -метод возвращающий текущее наполнение буфера -метод отката -метод возвращающий текущее состояние буферизации (активна/неактивна) и методы унаследованные от java.io.Reader чтож, давайте подвергнем критике. Конструктор Критика: Почему только 1 конструктор? почему не может быть 2 конструктора, первый из которых мы определили, а второй принимает лишь оборачиваемый ридер и ставит размер буфера по умолчанию? Решение: добавляем второй конструктор. добавляем публичную, статическую константу, которая будет хранить размер по умолчанию для буфера. Буфер Критика: Активация и деактивация буфера - как будет вести себя класс при повторной активации буфера, без промежуточной деактивации? у нас есть методы read/skip/reset, унаследованные от java.io.Reader - как ведет себя буфер при их вызовах? Как ведет себя буфер при переполнении? Рассуждение: В нашем случае ридер будет перебрасываться между множеством экземпляров парсеров туда-обратно. из чего следует, что работа с RollbackReaderWrapper'ом, при мануальной (по требованию) работе буфера будет достаточно сложной - надо будет контролировать его текущее состояние. Также будет очень тяжелая работа по кодированию функционала мануальной работы буфера, с учетом появившихся вопросов. Решение: Буфер сделаем неявным, и постоянно активным. Так как буфер будет неявным, и буферизация будет идти постоянно, то нам будут нужны методы: -очистка буфера -закрытие обертки с возвращением обернутого ридера, при этом текущая позиция курсора враппера должна совпадать с курсором обернутого ридера - ридер не должен быть в состоянии отката (это может привести к потере данных и ошибкам у невнимательных и неопытных программистов, использующих RollbackReaderWrapper) Наследование от java.io.Reader Критика: Т.к. в качестве оборачиваемого ридера используется java.io.Reader, то вполне возможно оборачивание RollbackReaderWrapper'а в другой RollbackReaderWrapper, что будет явно не самым хорошим решением - может иметь место у неопытных программистов, и существенно замедлять работу объекта. Решение: Если оборачиваемый ридер является экземпляром RollbackReaderWrapper'а, то объект не должен конструироваться. Перепишем декларации тестов, с учетом всех рассуждений и выводов. Так как размер декларации получился очень большой, то разрежу ее на ТРИ поста
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. Последний раз редактировалось alexinspir; 31.05.2011 в 17:21. |
31.05.2011, 16:13 | #5 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап второй. продолжение.
Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. |
31.05.2011, 16:17 | #6 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап второй. продолжение.
Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. |
31.05.2011, 16:19 | #7 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап второй. продолжение.
Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. |
31.05.2011, 17:20 | #8 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап третий.
На втором этапе у нас получился достаточно большой Test-Case класс, хотя мне кажется что некоторых тестов там не хватает.
Теперь наш тестовый класс будет служить нам документацией для релизного класса. На основе этой документации, мы видим какие нам нужны методы и что они должны делать - т.е. мы можем сразу написать к методам документационные комментарии. класс разбит на ДВА поста Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. Последний раз редактировалось alexinspir; 31.05.2011 в 18:38. |
31.05.2011, 17:25 | #9 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап третий. продолжение.
Код:
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. |
04.06.2011, 01:03 | #10 |
Новичок
Джуниор
Регистрация: 26.08.2008
Сообщений: 1,010
|
Этап четвертый.
На этом этапе мы реализуем все декларированные тесты.
В ходе реализации всех тестовых методов, стало ясно что потенциально будут полезны еще два метода в релизном классе: -isClosed() -inRollbackMode() Что касается самой реализации: Так как подготовка объектов релизного класса невозможна извне, а только лишь с помощью его собственных методов, то очень многие тесты являются пересекающимися (Test Overlap). Пересечения тестов - это ситуация, когда тесты используют некую общую функциональность, при изменении которой, все тесты которые ее используют (note: не обязательно тестируют) отказывают или вообще завершаются с ошибкой. Пересечения тестов являются крайне нежелательными, и при любой возможности от них стараются избавиться. В моем же случае у меня нет достаточно времени и опыта чтобы найти способ избавиться от них. Выше опубликованная декларация методов тестового класса была изменена (в соответствии с именами методов в релизном классе) а также были добавлены новые тесты. Для удобства понимания использовалась только новая тестовая конфигурация (Fresh Fixture) для каждого теста. Для гарантии корректности некоторых тестов использовались подставные объекты (Fake Object). т.к. исходник получился внушительного размера, то его публикую в виде вложения. Следующий, и последний, этап - реализация методов релизного класса.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими. Последний раз редактировалось alexinspir; 06.06.2011 в 04:09. Причина: замена файла, был недописан последний тест. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Test-driven development | [Smarik] | Свободное общение | 2 | 30.03.2011 10:46 |
Ответ по практике | StudentMarat | Свободное общение | 1 | 14.09.2010 23:57 |
Задание по практике | IPI | Помощь студентам | 4 | 15.06.2010 12:31 |
Отчот по практике | sby | Фриланс | 3 | 12.05.2009 17:16 |
Программа по практике | Antowka | БД в Delphi | 0 | 15.10.2007 10:40 |