Подтвердить что ты не робот

TDD: почему, как и реальный тест

Во-первых, Пожалуйста, несите меня со всеми моими вопросами. Я никогда не использовал TDD раньше, но все больше и больше я понимаю, что должен. Я прочитал много сообщений и руководств по TDD, но некоторые вещи до сих пор не ясны. В большинстве случаев для демонстрации используются математический расчет или некоторые другие простые операции. Я также начал читать книгу Роя Ошерове о TDD. Вот несколько вопросов, которые у меня есть:

Если у вас есть объект в вашем решении, например класс Account, в чем же смысл тестирования установки свойства на нем, например имя учетной записи, то вы утверждаете, что все, что вы установили, является правильным. Неужели это никогда не закончится?

Другим примером, балансом счета, вы создаете объект с балансом 300, тогда вы утверждаете, что на самом деле баланс равен 300. Как это может закончиться? Что я буду тестировать здесь? Я вижу, что тестирование операции вычитания с различными входными параметрами было бы более хорошим тестом.

На что я должен проверять свои объекты? методов или свойств? иногда у вас также есть объекты как службы на уровне инфраструктуры. В случае методов, если у вас есть трехуровневое приложение, а бизнес-уровень вызывает уровень данных для некоторых данных. Что тестируется в этом случае? параметры? объект данных не является нулевым? как насчет услуг?

Тогда на мой вопрос относительно проекта реальной жизни, если у вас есть зеленый проект, и вы хотите начать его с TDD. С чего вы начинаете сначала? вы делите свой проект на функции, а затем на каждый из них или вы произвольно выбираете его, и вы идете оттуда.

Например, у меня есть новый проект, и для него требуется возможность входа в систему. Я начинаю с создания пользовательских тестов или тестов учетной записи или тестов входа в систему. С чего я начинаю сначала? Что я сначала тестирую в этом классе?

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

  • Username_Length_Greater_Than_6
  • Username_Length_Less_Than_12
  • Password_Complexity

Если вы утверждаете, что длина больше 6, как это тестирование кода? проверяем ли мы ошибку, если она меньше 6?

Прошу прощения, если я повторяю свои вопросы. Я просто пытаюсь начать работу с TDD, и мне не удалось изменить мышление. Спасибо, и, надеюсь, кто-то может помочь мне определить, чего мне здесь не хватает. Кстати, знает ли кто-нибудь о каких-либо дискуссионных группах или чатах относительно TDD, к которым я могу присоединиться?

4b9b3361

Ответ 1

Посмотрите на BDD низкого уровня. Этот пост от Dan North представляет его довольно хорошо.

Вместо того, чтобы тестировать свойства, подумайте о поведении, которое вы ищете. Например:

Account Behavior:
    should allow a user to choose the account name
    should allow funds to be added to the account

User Registration Behavior:
    should ensure that all usernames are between 6 and 12 characters
    should ask the password checker if the password is complex enough <-- you'd use a mock here

Затем они станут испытаниями для каждого класса, а "should" станет тестовым именем. Каждый тест является примером того, как класс может быть использован ценно. Вместо того, чтобы тестировать методы и свойства, вы показываете кому-то другому (или вашему будущему "я" ), почему класс ценен и как его безопасно изменить.

Мы также делаем что-то в BDD, называемом "вне игры". Поэтому начните с GUI (или обычно контроллера/презентатора, так как мы не часто единично тестируем графический интерфейс).

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

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

Таким образом, вы всегда пишете интерфейс, который вы пожелаете, - что-то удобное в использовании - для каждого класса. Вы описываете поведение этого класса и предоставляете некоторые примеры того, как его использовать. Вы делаете это безопасным и легким в обращении, и соответствующий дизайн будет появляться (не стесняйтесь руководствоваться шаблонами, продуманным здравым смыслом и опытом).

BTW, с Login, я, как правило, разрабатываю то, что пользователь хочет войти в систему, а затем сначала код. Добавить Логин позже - обычно это не очень рискованно и не сильно меняется после его написания, поэтому вам даже не нужно его тестировать. До вас.

Ответ 2

  • Испытайте, пока страх не заменится скукой. Аксесуары и конструкторы собственности являются дорогостоящими, чтобы приносить пользу для написания тестов. Я обычно проверяю их косвенно как часть какого-либо другого (более высокого) теста.

  • Для нового проекта я бы рекомендовал посмотреть на ATDD. Найдите пользовательскую историю, которую вы хотите выбрать в первую очередь (в зависимости от значения пользователя). Напишите приемочный тест, который должен пройти, когда история пользователя будет выполнена. Теперь разверните те типы, которые вам нужны, чтобы получить AT, используя TDD. Приемочный тест расскажет вам, какие объекты и какое поведение требуется. Затем вы реализуете их по одному с использованием TDD. Когда все ваши тесты (включая ваш экзамен) проходят - вы выбираете следующую историю пользователя и повторяете.

Предположим, вы выбрали "Создать пользователя" в качестве своей первой истории. Затем вы пишете примеры того, как это должно работать. Включите их в автоматические приемочные испытания. создать достоверную учетную запись пользователя → создать недопустимый пользователь (комбинации различий, которые показывают, что недействительно) → учетная запись не должна создаваться, полезная ошибка, отображаемая пользователю

AccountsVM.CreateUser(имя пользователя, пароль) AccountsVM.HasUser(имя пользователя) AccountsVM.ErrorMessage

Тест показал бы, что вам нужно выше. Затем вы проходите тест-драйв их.

Ответ 3

Не проверяйте, что слишком просто сломать.

  • getters и seters слишком просты, чтобы их можно было сломать, поэтому так, код настолько прост, что ошибки не может быть.

  • вы проверяете общедоступные методы и утверждаете, что ответ соответствует ожиданиям. Если метод возвращает void, вам нужно проверить "побочные последствия" (иногда это нелегко, например, чтобы проверить, отправлено ли электронное письмо). Когда это произойдет, вы можете использовать mocks для проверки не ответа, а способа выполнения метода (вы спрашиваете mockk, если класс Under Test назвал его желаемым способом)

Я начинаю катавать, чтобы узнать основы: JUnit и TestNG; затем Harmcrest; затем прочитайте документацию EasyMock или Mockito.

Ищите ката в github, или здесь http://codekata.pragprog.com http://codingdojo.org/

Первый тест должен быть самым простым! Возможно, тот, который просто заставляет вас создавать CUT (класс под тестом)

Но опять же попробуйте ката!

http://codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz