|
Процесс разработки - Листинг 16.1. |
Страница 28 из 37
Листинг 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 позволяют проводить сравнение ожидаемых и фактических результатов тестирования. Очевидно, вы удивитесь этому подходу. Неужели нельзя вначале написать весь код класса ПосещениеКафе, а потом создать тесты? Ответ достаточно прост. Написание тестов перед написанием программного кода дает важное преимущество: мы знаем, что весь ранее созданный код компилируется и выполняется. Следовательно, любая ошибка вызывается текущими изменениями, а не более ранним кодом. И значимость этого преимущества усиливается по мере продвижения вперед. Далее определимся с хранением объектов класса ПосещениеКафе. Очевидно, что свойство егоВес характеризует лакомку. Таким образом, объект ПосещениеКафе записывает часть состояния лакомки па момент посещения кафе. Следовательно, нужно создать объект Лакомка и содержать объекты класса ПосещениеКафе в нем.
|