Определение того, что нужно тестировать, а что нет

Я все еще начинаю понимать разработку через тестирование. У меня есть следующие требования к модулю регистрации пользователей приложения.

  1. Система должна зафиксировать имя, фамилию пользователя, адрес электронной почты и, при необходимости, почтовый адрес.
  2. Имя и фамилия должны быть в алфавитном порядке
  3. Укажите имя и фамилию.
  4. Адрес электронной почты должен быть действительным адресом и является обязательным.
  5. Почтовый адрес не является обязательным.

Чтобы реализовать вышеописанное в java. Я написал следующий код:

  1. Java-бин, содержащий вышеуказанные поля и соответствующие геттеры и сеттеры
  2. Аннотация проверки для вышеуказанных полей
  3. Дао для сохранения пользователя
  4. Пользовательский интерфейс для ввода сведений о пользователе.

Вопрос: Какой из приведенных выше кодов должен быть покрыт модульными тестами? то есть геттер и сеттеры bean-компонента, наличие аннотаций проверки, способность dao сохранять пользователя, наличие соответствующих элементов формы в пользовательском интерфейсе.


person joshua    schedule 29.11.2010    source источник
comment
отметьте это соответствующей технологией (например, Java).   -  person RPM1984    schedule 29.11.2010
comment
@RPM1984: Почему? Вопрос явно касается модульного тестирования и TDD, и ответы в равной степени применимы к любому другому языку.   -  person Platinum Azure    schedule 29.11.2010
comment
@Platinum Azure - с точки зрения того, должен ли я / не должен ли я, я бы согласился. Но фактическая реализация будет сильно отличаться от технологии для технологии (например, тестирование пользовательского интерфейса). Но я думаю, что это не о том, как, поэтому я отказываюсь от своего утверждения.   -  person RPM1984    schedule 29.11.2010
comment
Итак, Джону О'Харе будет трудно зарегистрироваться, как и мисс Саре Уикхем-Браун. (Кроме того, у нас был сотрудник с индийского субконтинента по имени Гаурав; без фамилии — или это было не имя.) И «Система должна зафиксировать ... почтовый адрес» и «Почтовый адрес не является обязательным» являются квазипротиворечивыми.   -  person Jonathan Leffler    schedule 29.11.2010
comment
@ Platinum, @ RPM1984: поскольку в вопросе упоминается Java (бины, DAO) и т. д., я не уверен, насколько важна метка для конкретного языка.   -  person Jonathan Leffler    schedule 29.11.2010
comment
Если вы уже написали код, то по определению вы не используете TDD. Вы можете (и должны) отказаться от модульного тестирования того, что вы написали до смерти.   -  person Lieven Keersmaekers    schedule 29.11.2010
comment
@Lieven, какой ответ вы бы дали, если бы я не указал, что написал код. Это требования, какие тесты я должен писать сейчас? Вот и ищу ответ.   -  person joshua    schedule 29.11.2010


Ответы (2)


Я пишу тесты для вещей, о которых думаю: «Может, я сделал это неправильно?». Это означает, что я не беспокоюсь о тестировании сторонних библиотек, а только о своих конфигурациях.

Геттеры и сеттеры - определенно нет. Я использую Eclipse для их создания, тестировать не стоит.

Аннотации для проверки — я бы не стал проверять, например, правильно ли они реализуют нулевую проверку, я полагаюсь на то, что они делают то, что написано на жестяной банке, но я бы проверил их наличие. На правом поле они есть? И если бы я настроил их с помощью регулярного выражения, я бы проверил, правильно ли я понял регулярное выражение.

Другой пример, если я храню свой POJO в Hibernate. Я не проверяю, работает ли Session.save(myObj), но то, что я мог сделать неправильно, например, границы транзакций и конфигурацию сопоставления (все ли поля сохранены) и т. д.

Я нахожу тестирование пользовательского интерфейса очень сложным. Я много раз думал "в этот раз сделаю" - но что-то сложнее формы, и я сдаюсь. Использование такого шаблона, как MVP, означает, что я могу внедрять события для тестирования большей части вычислительного материала, но все еще остается подключение к пользовательскому интерфейсу, которое не тестируется. Обычно я заканчиваю тестированием фрагментов, сложной обработкой данных, вещами, которые кажутся подверженными ошибкам.

person Martin Algesten    schedule 29.11.2010

Во-первых, я знаю о TDD, что вы никогда не пишете код первым.

Сначала вы пишете тест, когда ваш тест терпит неудачу, вы пишете/генерируете код для его исправления, а затем пишете дополнительные тесты, чтобы сломать функциональность, которую вы намереваетесь достичь, и пишете/исправляете исходный код для него.

Лучше всего, если у вас есть 100% покрытие кода.

Обратитесь к википедии, чтобы узнать, как начать работу над проектом с помощью TDD — http://en.wikipedia.org/wiki/Test-driven_development

person Sairam    schedule 29.11.2010
comment
Вы предлагаете мне написать тесты для всех разделов, как указано в вопросе? включая геттеры и сеттеры? если нет, мои вопросы заключались в том, что я должен и что я не должен тестировать. - person joshua; 29.11.2010
comment
Я бы добавил, что вы должны тестировать только код, который вы сами пишете (или собираетесь писать, как предлагает вам TDD). Не пытайтесь тестировать (например) сторонние библиотеки доступа к данным, потому что это не ваша работа. - person Platinum Azure; 29.11.2010
comment
@Sairam, теория в Википедии интересна. но у меня есть реальная жизненная ситуация под рукой. Вот почему я сделал вопрос очень конкретным. - person joshua; 29.11.2010
comment
'Какой из вышеприведенного кода должен быть покрыт модульными тестами? ' - Как говорит Azure, вам нужно писать тесты для всего кода, который вы пишете - person Sairam; 29.11.2010
comment
@Stephen C - использование «в реальном времени» было плохим. починил это. - person Sairam; 29.11.2010
comment
Если вы практикуете TDD, ваш охват составляет 100% - person BЈовић; 29.11.2010