Начиная новый проект с TDD

10

Я изучаю TDD, и я прочитал, что это также помогает вам определить дизайн приложения, правильно?

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

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

Так что вопрос ...

Я создал новое решение в VS 2010, добавил новый тестовый проект, и я просто не знаю, какие тесты писать!

Так как это поможет мне определить дизайн, какие тесты я могу написать здесь?

Спасибо за любую помощь!


источник
1
Это поможет вам сначала подумать о шаблонах, которые вы собираетесь использовать, о классах, которые вы напишете, и т. Д. - Сначала определите класс и напишите тестовые примеры для методов, затем начните реализовывать методы в соответствии с их тестовым примером ..
Халфдан

Ответы:

6

Когда вы пишете модульные тесты, вы тестируете поведение своего приложения, поэтому важный вопрос, который нужно задать, - что делает ваше приложение ? Вот начало:

[TestFixture]
public class RegistrationTests
{
    [Test]
    public void Should_save_new_user_info()
    {
    }

    [Test]
    public void Should_throw_validation_exception_when_email_already_exists()
    {
    }

    [Test]
    public void Should_format_phone_number_when_country_code_is_us()
    {
    }
}

источник
Ну, все эти тесты уже пройдены, что дальше? :)
Скотт Уитлок
2

Простое создание тестового проекта и написание некоторых тестовых методов - это своего рода TDD, но, по моему опыту, это мало поможет, если вы не работаете над библиотекой, в которой есть известный API и вызовы методов напрямую соответствуют тому, что ожидает пользователь , Вам нужно составить правильный список тестов и для нетривиального приложения, которое может быть действительно трудным.

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

Когда вы определяете функцию, вы просто пишете что-то вроде

When a user is saved
Then the user should exist

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

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

Для простого приложения вы можете просто создать файлы объектов, но для чего-то более сложного полезно заранее составить более полную спецификацию. Для этого я использую iPad-приложение, но вы можете использовать любой инструмент, который вам удобнее всего.

Начните со списка функций высокого уровня, таких как «Регистрация пользователя». Они, как правило, слишком широки для непосредственного написания тестов, поэтому разбейте их на подфункции, которые могут быть четко определены и обычно сопоставлены с определенным действием пользователя, таким как «Сохранить пользователя» или «Просмотреть существующего пользователя».

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

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

Том Кларксон
источник
2

Я обнаружил, что было бы неплохо подкрепить свои первые эксперименты с TDD чтением, а также сокращением кода. Википедии статья на эту тему очень хорошо , и будет вести вас широкий спектр других ресурсов. Ищите, в частности, вещи Кента Бека - своего рода отца TDD.

Еще одна вещь, которая может помочь вам в этом, - это выполнять некоторые каты - простые, почти бессмысленные тренировочные упражнения. У Роя Ошерова есть несколько хороших.

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

И, чтобы начать, возможно, начните с вашего требования имени. Что тебе понадобится?

Вам, вероятно, понадобится класс. Напишите тест для этого (некоторые люди пропускают это, но в начале делают это для упражнения) и напишите класс.

Далее вашему классу нужно будет сохранить имя. Напишите тест, подтверждающий, что ваш класс действительно может. Затем снова напишите код, чтобы пройти тест.

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

И так далее...

Дэвид Холл
источник
1

Я думаю, что невозможно дать вам представление о TDD в кратком ответе. Вам нужно «увидеть», как кто-то практикует это, чтобы почувствовать это. Лучший ресурс, который я когда-либо нашел по этой теме, - http://pragprog.com/titles/achbd/the-rspec-book . Прежде чем вы скажете мне, что Руби не ваш язык: прочитайте предисловие дяди Боба! ;-)

Ахим
источник
1
Книга rspec в порядке. Если ОП собирается прочесть книгу по TDD, это должно быть так: amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530
Хулио,
0

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

Кайл Слеттен
источник
0

Как вы уже описали систему, на уровне приложения есть только один тест:

[Test] public void Save_and_retrieve_user (String name, String email, ...) {// Сохранить // Получить // Проверить}

По мере уточнения требований добавляйте больше тестов.

Кевин Клайн
источник