Книга: Экстремальное программирование. Разработка через тестирование

Сначала оператор assert (Assert First)

Сначала оператор assert (Assert First)

Когда следует писать оператор assert[13]? Попробуйте писать их в первую очередь. Неужели вам не нравится самоподобие?

• С чего следует начать построение системы? С формулировки пожеланий[14] о том, как должна работать система, полученная в результате вашей работы.

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

• С чего начать написание теста? С операторов assert, которые должны выполняться в ходе тестирования.

С этой методикой познакомил меня Джим Ньюкирк. Когда я начинаю разработку теста с операторов assert, я ощущаю мощный упрощающий эффект. Когда вы пишете тест, вы решаете несколько проблем одновременно, даже несмотря на то, что при этом вам не нужно думать о реализации.

• Частью чего является новая функциональность? Является ли она модификацией существующего метода? Является ли она новым методом существующего класса? Является ли она методом с известным именем, но реализованным в другом месте? А может быть, новая функциональность – это новый класс?

• Какие имена присвоить используемым элементам?

• Как можно проверить правильность результата работы кода?

• Что считать правильным результатом работы кода?

• Какие другие тесты можно придумать исходя из данного теста?

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

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

testCompleteTransaction() {

assertTrue(reader.isClosed());

assertEquals("abc", reply.contents());

}

Откуда должен быть прочитан объект reply? Конечно же, из сокета:

testCompleteTransaction() {

Buffer reply = reader.contents();

assertTrue(reader.isClosed());

assertEquals("abc", reply.contents());

}

А откуда берется сокет? Мы создаем его, подключаясь к серверу:

testCompleteTransaction() {

Socket reader = Socket("localhost", defaultPort());

Buffer reply = reader.contents();

assertTrue(reader.isClosed());

assertEquals("abc", reply.contents());

}

Однако перед этим мы должны установить соединение с сервером:

testCompleteTransaction() {

Server writer = Server(defaultPort(), "abc");

Socket reader = Socket("localhost", defaultPort());

Buffer reply = reader.contents();

assertTrue(reader.isClosed());

assertEquals("abc", reply.contents());

}

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

Оглавление книги


Генерация: 1.503. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз