Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Предваряющее тестирование при экстремальной разработке
Предваряющее тестирование и рефакторинг (реорганизация) — основной способ разработки при экстремальном программировании. Обычно рефакторингом называют внесение в код небольших изменений, сохраняющих функциональность и улучшающих структуру программы. Более широко рефакторинг определяют как технику разработки ПО через множество изменений кода, направленных на добавление функциональности и улучшение структуры. Предваряющее (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 Public class ПосещениеКафе { } Этот код компилируется, тест проходит, и мы готовы добавить необходимую функциональность. Листинг 16.4.ТестЛакомки.jауа и ПосещениеКафе.jауа ТестЛакомки.java import junit.framework.*; import ПосещениеКафе; Import java.util.Date public class ТестЛакомки extends TestCase { public TecтЛакомки(String name) { super(name): } public void тестСоздатьПосещениеКафе() { Date дата = new Date(); double булочки = 7.0; // 7 булочек double стоимость = 12.5 * 7; // цена 1 булочки - 12.5 руб. double вес = 60.0; // взвешивание лакомки double дельта = 0.0001;// точность ПосещениеКафе v = new ПосещениеКафе(дата, булочки, стоимость, вес); assertEquals(дата, v.получитьДату( )); assertEquals(12.5 * 7, v.получитьСтоииость(), дельта); assertEquals(7.0, v.получитьБулочки(), дельта); assertEquals(60.0, v.получитьВес(), дельта); assertEquals(12.5, v.получитьЦену(). дельта); } } ПосещениеКафе.java import Java.uti1.Date; public class ПосещениеКафе { private Date егоДата; private double егоБулочки; private double егоСтоимость; private double eroBec; Public ПосещениеКафе(Date дата, double булочки, Double стоимость, double вес) { егоДата = дата; егоБулочки = булочки; егоСтоимость = стоимость; егоВес = вес; } public Date получитьДату() {return егоДата;} public double получитьБулочки() {return егоБулочки;} public double получитьСтоимость() {return егоСтоимость;} public double получитьЦену(){return егоСтоимость/егоБулочки;} public double получитьВес() {return eroBec;} } На этом шаге мы добавили тесты в класс ТестЛакомки, а также добавили методы в класс ПосещениеКафе. Унаследованные методы assertEquals позволяют проводить сравнение ожидаемых и фактических результатов тестирования. Очевидно, вы удивитесь этому подходу. Неужели нельзя вначале написать весь код класса ПосещениеКафе, а потом создать тесты? Ответ достаточно прост. Написание тестов перед написанием программного кода дает важное преимущество: мы знаем, что весь ранее созданный код компилируется и выполняется. Следовательно, любая ошибка вызывается текущими изменениями, а не более ранним кодом. И значимость этого преимущества усиливается по мере продвижения вперед. Далее определимся с хранением объектов класса ПосещениеКафе. Очевидно, что свойство егоВес характеризует лакомку. Таким образом, объект ПосещениеКафе записывает часть состояния лакомки па момент посещения кафе. Следовательно, нужно создать объект Лакомка и содержать объекты класса ПосещениеКафе в нем. Листинг 16.5.ТестЛакомки.java и Лакомка.java ТестЛакомки.java import junit.framework.*; import ПосещениеКафе; import java.util.Date public class ТестЛакомки extends TestCase { public TecтЛакомки(String name) { super(name); } … Public void тестСоздатьЛакомку() { Лакомка g = new Лакомка(); assertEquals(0, д.получитьЧислоПосещений()); } } Лакомка.Java Public class Лакомка { |
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 225. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |