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



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

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

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

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

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

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

Например, представьте, что нам надо реализовать обмен данными с другой системой через сокет. После завершения операции сокет должен быть закрыт, а в буфер должна быть прочитана строка 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.

Тестовые данные (Test Data)

Какие данные следует использовать для предварительных тестов? Используйте данные, которые делают тест простым для чтения и понимания. Помните, что вы пишете тесты для людей. Не разбрасывайте данные в изобилии по всему тесту только потому, что вам хочется добавить в тест как можно больше разнообразных данных. Если в разных местах теста используются разные данные, разница должна быть осмысленной. Если не существует концептуальной разницы между 1 и 2, используйте 1.