Предваряющее тестирование при экстремальной разработке
Предваряющее тестирование и рефакторинг (реорганизация) — основной способ разработки при экстремальном программировании.
Обычно рефакторингом называют внесение в код небольших изменений, сохраняющих функциональность и улучшающих структуру программы. Более широко рефакторинг определяют как технику разработки ПО через множество изменений кода, направленных на добавление функциональности и улучшение структуры.
Предваряющее (test-first) тестирование и рефакторинг — это способ создания и последующего улучшения ПО, при котором сначала пишутся тесты, а затем программируется код, который будет подвергаться этим тестам. Программист выбирает задачу, затем пишет тестовые варианты, которые приводят к отказу программы, так как программа еще не выполняет данную задачу. Далее он модифицирует программу так, чтобы тесты проходили и задача выполнялась. Программист продолжает писать новые тестовые варианты и модифицировать программу (для их выполнения) до тех пор, пока программа не будет исполнять все свои обязанности. После этого программист небольшими шагами улучшает ее структуру (проводит рефакторинг), после каждого из шагов запускает все тесты, чтобы убедиться, что программа по-прежнему работает.
Для демонстрации такого подхода рассмотрим пример конкретной разработки. Будем опираться на технику, описанную Робертом Мартином (с любезного разрешения автора)*.
* Robert C. Martin. RUP/XP Guidelines: Test-first Design and Refactoring. - Rational Software White Paper, 2000.
Создадим программу для регистрации посещений кафе-кондитерской. Каждый раз, когда лакомка посещает кафе, вводится количество купленных булочек, их стоимость и текущий вес любителя (любительницы) сладостей. Система отслеживает эти значения и выдает отчеты. Программу будем писать на языке Java.
Для экстремального тестирования удобно использовать среду Junit, авторами которой являются Кент Бек и Эрик Гамма (Kent Beck и Erich Gamma). Прежде всего создадим среду для хранения тестов модулей. Это очень важно для предваряющего тестирования: вначале пишется тестовый вариант, а только потом — код программы. Необходимый код имеет следующий вид:
Листинг 16.1.ТестЛакомки. java
import junit.framework.*;
public class ТестЛакомки extends TestCase
{
public ТестЛакомки (String name)
{
super(name);
}
}
Видно, что при использовании среды Junit класс-контейнер тестовых вариантов должен быть наследником от класса TestCase. Кстати, условимся весь новый код выделять полужирным шрифтом.
Создадим первый тестовый вариант. Одна из целей создаваемой программы — запись количества посещений кафе. Поэтому должен существовать объект ПосещениеКафе, содержащий нужные данные. Следовательно, надо написать тест, создающий этот объект и опрашивающий его свойства. Тесты будем записывать как тестовые функции (их имена должны начинаться с префикса тест). Введем тестовую функцию тестСоздатьПосещениеКафе (листинг 16.2).
Листинг 16.2.ТестЛакомки.jауа
import junit.framework.*;
public class ТестЛакомки extends TestCase
{
public ТестЛакомки (String name)
{
super(name);
}
public void тестСоздатьПосещениеКафе()
{
ПосещениеКафе v = new-ПосещениеКафе();
}
}
Для компиляции этого фрагмента подключим класс ПосещениеКафе.
Листинг 16.3.ТестЛакомки.jаvа и ПосещениеКафе.jаvа
ТестЛакомки.jаvа
import junit. framework.*;
import ПосещениеКафе;
public class ТестЛакомки extends TestCase
{
public ТестЛакомки (String name)
{
super(name);
}
public void тестСоздатьПосещениеКафе()
{
ПосещениеКафе v = new ПосещениеКафе();
}
}
ПосещениеКафе.java
Дата добавления: 2015-03-07; просмотров: 672;