Объектно-ориентированное программирование разработка через тестирование



страница3/4
Дата14.06.2018
Размер0,59 Mb.
ТипУчебно-методическое пособие
1   2   3   4

Дальнейшее тестирование требует от нас написание следующего теста

public void testAdd(){

OrderQuery orderQuery = new OrderQuery();

Customer johnson = new Customer(

“Piter Johnson”, “1st avenue, 33a”);

Order order1 = new Order(344, 100, johnson);

orderQuery.add(order1);

Order order2 = new Order(345, 170, johnson);

orderQuery.add(order2);


Customer cruz = new Customer(

“Jenifer Cruz”, “Mackborn street, 29”);

Order order3 = new Order(346, 510, cruz);

orderQuery.add(order3);


assertEquals(order2, orderQuery.get(1));

}

Выполнение этого теста требует готовых классов Customer и Order. Так как эти классы довольно тривиальны, то мы приведем их без дополнительных разъяснений:



public class Customer {

private String name;

private String address;

public Customer(String name, String address){

this.name = name;

this.address = address;

}
public String getAddress(){

return address;

}

public void setAddress(String address){



this.address = address;

}

public String getName(){



return name;

}

public void setName(String name){



this.name = name;

}

}


public class Order {

private int id;

private int amount;

private Customer customer;

public Order(int id, int amount, Customer customer){

this.id = id;

this.amount = amount;

this.customer = customer;

}
public int getAmount(){

return amount;

}

public void setAmount(int amount){



this.amount = amount;

}

public Customer getCustomer(){



return customer;

}

public void setCustomer(Customer customer){



this.customer = customer;

}

public int getId(){



return id;

}

public void setId(int id){



this.id = id;

}

}


Добавим методы add() и get() в класс OrderQuery

public void add(Order order){}


public Order get(int index){

return null;

}
Запустим тест. Он, как и должно быть, – слетел, выдав следующее сообщение:

junit.framework.AssertionFailedError:

expected: but was:
Оно сообщает о том, что ожидался объект, а метод вернул нам null. Добавим функциональность в метод public void add(Order order):

public void add(Order order){

orders.add(order);

}
А в метод get() в соответствии с этапом 4 цикла TDD

public Order get(int index){

Customer johnson = new Customer(

"Piter Johnson", "1st avenue, 33a");

Order order2 = new Order(345, 170, johnson);

return order2;

}

Мы сымитировали возвращение методом того заказа, который мы добавляли в очередь вторым и которой, по сути вещей, должен быть в списке очереди на позиции с индексом 1, что мы и проверяем в тесте. Запустим же тест. Тест слетел, при этом ошибка говорит нам о том, что объекты действительно разные.



junit.framework.AssertionFailedError:

expected:

but was:
Проанализируем ситуацию, несмотря на то, что оба объекта (созданный в методе тестируемого класса и созданный в тесте) имеют одинаковые значения свойств, реально являются разными, т.е. располагаются в разных участках памяти. Для их сравнения необходимо реализовать специальный метод класса Object – public boolean equals(Object obj). Особенность этого метода заключается в том, что он не сравнивает ссылки на объекты, а будет сравнивать именно значения свойств.

Дальнейшее изучение этого метода необходимо сделать самостоятельно с использованием документации JavaDoc, поставляемой с JSDK.

Самое время написать тест метода equals() для сравнения двух покупателей.




Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа

Добавить три заказа в очередь



Метод equals() для класса Customer

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью


Как протестировать равенство объектов. Для начала пусть два одинаковых покупателя будут равны между собой. Создадим новый класс TestCustomer наследника junit.framework.TestCase. Добавим туда метод:

public void testEquality(){

assertTrue(new Customer("Piter Johnson",

"1st avenue, 33a").equals(new Customer(

"Piter Johnson", "1st avenue, 33a"))

);

}

Запустим тест, полоска окрасилась красным. Для возврата значения true достаточно заглушки в классе Customer.



public boolean equals(Object obj){

return true;

}

Запустим еще раз, и результат – зеленая полоска. Теперь нужно проверить то, что разные покупатели действительно являются разными покупателями, добавим в метод testEquality() еще одну строку.



public void testEquality(){

assertTrue(new Customer("Piter Johnson",

"1st avenue, 33a").equals(new Customer(

"Piter Johnson", "1st avenue, 33a"))

);

assertFalse(new Customer("Piter Johnson",



"1st avenue, 33a").equals(new Customer(

"John Mayson", "Five Star blvr., 1"))

);

}

Запустим тест – слетел. Самое время написать полноценный код для сравнения двух покупателей.



public boolean equals(Object obj){

Customer customer = (Customer)obj;

if ((this.getName().equals(customer.getName()))

&& this.getAddress().equals(

сustomer.getAddress()

))

)



return true;

else return false;

}

Убедимся, что код работает правильно, запустим тест. Зеленая полоска подтверждает это.



Аналогичным образом напишем сначала тест, а затем код для сравнения двух заказов.


Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа

Добавить три заказа в очередь



Метод equals() для класса Customer

Метод equals() для класса Order

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью


Создадим новый класс TestOrder наследника junit.framework.TestCase. Добавим туда метод (здесь можно сделать шажок и побольше):

public void testEquality(){

Customer customerJohnson =

new Customer("Piter Johnson", "1st avenue, 33a");

Customer customerMayson =

new Customer("John Mayson", " Five Star blvr., 1");
Order firstOrder = new Order(345, 170, customerJohnson);

Order secondOrder = new Order(345, 170, customerJohnson);

Order thirdOrder = new Order(310, 150, customerMayson);

assertTrue(firstOrder.equals(secondOrder));

assertFalse(firstOrder.equals(thirdOrder));

}

Ниже приведен код, реализующий метод equals() для сравнения двух заказов.



public boolean equals(Object obj){

Order order = (Order)obj;

if (

(this.getId() == order.getId())



&& (this.getAmount() == order.getAmount())

&& (this.getCustomer().equals(order.getCustomer()))

)

return true;



else

return false;

}

Как видно из кода, класс Order имеет два простых свойства (id, amount) и одно сложное сustomer, сравнение которого мы уже успели сделать.



Запустим тест – получили зеленую полоску. Пора вычеркнуть очередную строку. И вернуться к тестированию добавления заказов в очередь.


Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа



Добавить три заказа в очередь

Метод equals() для класса Customer

Метод equals() для класса Order

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью


Вернемся к классу OrderQuery. Теперь самое время выполнить устранение дублирования кода. Метод get() должен возвращать объект класса Order из свойства orders по заданному индексу.

public Order get(int index){

return (Order)orders.get(index);

}

Запустим тест еще раз – зеленый индикатор! Добавим в тестирующий метод testAdd() код, тестирующий количество заказов в очереди после добавления



assertEquals(2, orderQuery.getCount());

Тест слетел, ну это же очевидно, у нас же три заказа в очереди. Внесем необходимые изменения

assertEquals(3, orderQuery.getCount());

Зеленый, внесем изменения в карточку.




Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа



Добавить три заказа в очередь

Метод equals() для класса Customer

Метод equals() для класса Order

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью

Продолжим, тестируем метод, возвращающий общую стоимость заказов в очереди. Добавим те же заказы в очередь

public void testAmount(){

OrderQuery orderQuery = new OrderQuery();


Customer johnson =

new Customer(“Piter Johnson”, “1st avenue, 33a”);

Order order1 = new Order(344, 100, johnson);

orderQuery.add(order1);


Order order2 = new Order(345, 170, johnson);

orderQuery.add(order2);


Customer cruz =

new Customer(“Jenifer Cruz”, “Mackborn street, 29”);

Order order3 = new Order(346, 510, cruz);

orderQuery.add(order3);


assertEquals(780, orderQuery.getAmount());

}

Добавим метод getAmount() в класс OrderQuery



public int getAmount(){

return 100;

}

Запускаем тест, вот он, уже привычный красный индикатор. Дальше получим зеленый индикатор



public int getAmount(){

return 780;

}

Ну а теперь реализуем метод, получающий сумму всех заказов



public int getAmount(){

Iterator iter = orders.iterator();

Order order;

int amountSum = 0;

while (iter.hasNext()) {

order = (Order)iter.next();

amountSum = amountSum + order.getAmount();

}

return amountSum;



}

Ну а в качестве дополнительного рефакторинга можно удалить дублирование, изменив последнюю строку в цикле на

amountSum += order.getAmount();

Продолжаем вносить изменения в нашу карточку.




Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа



Добавить три заказа в очередь

Метод equals() для класса Customer

Метод equals() для класса Order

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью


public void testMaxAmountOrder()

{

OrderQuery orderQuery = new OrderQuery();



Customer johnson =

new Customer(“Piter Johnson”, “1st avenue, 33a”);

Order order1 = new Order(344, 100, johnson);

orderQuery.add(order1);

Order order2 = new Order(345, 170, johnson);

orderQuery.add(order2);

Customer cruz =

new Customer(“Jenifer Cruz”, “Mackborn street, 29”);

Order order3 = new Order(346, 510, cruz);

orderQuery.add(order3);


assertEquals(order3, orderQuery.getMaxAmountOrder());

}

В класс OrderQuery добавим метод



public Order getMaxAmountOrder(){

return null;

}

Красная полоса, меняем метод на



public Order getMaxAmountOrder(){

Customer cruz =

new Customer("Jenifer Cruz", "Mackborn street, 29");

Order order3 = new Order(346, 510, cruz);

return order3;

}

Теперь зеленая, и находим заказ с максимальной стоимостью



public Order getMaxAmountOrder(){

Iterator iter = orders.iterator();

Order maxOrder = this.get(0);

Order curOrder;

while (iter.hasNext()) {

curOrder = (Order)iter.next();

if (curOrder.getAmount() > maxOrder.getAmount())

maxOrder = curOrder;

}

return maxOrder;



}

Проверяем – индикатор зеленый, вычеркиваем задачу из карточки и переходим к последней.




Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа

Добавить три заказа в очередь

Метод equals() для класса Customer

Метод equals() для класса Order

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью

Повторим весь цикл еще раз. Добавим в тест следующий метод

public void testRemove(){

OrderQuery orderQuery = new OrderQuery();

Customer johnson =

new Customer(“Piter Johnson”, “1st avenue, 33a”);

Order order1 = new Order(344, 100, johnson);

orderQuery.add(order1);

Order order2 = new Order(345, 170, johnson);

orderQuery.add(order2);

Customer cruz =

new Customer(“Jenifer Cruz”, “Mackborn street, 29”);

Order order3 = new Order(346, 510, cruz);

orderQuery.add(order3);

Order removingOrder = orderQuery.getMaxAmountOrder();

orderQuery.remove(removingOrder.getId());


assertEquals(2, orderQuery.getCount());

}

В класс OrderQuery добавим метод



public void remove(int orderId){}

Как и ожидалось, тесты слетели. Сделаем так, чтобы метод удалял последний заказ в очереди.

public void remove(int orderId){

orders.remove((orders.size()-1));

}

Зеленая полоска, а теперь удалим тот заказ, номер которого метод получил в качестве входного параметра.



public void remove(int orderId){

Iterator iter = orders.iterator();

Order order;

while (iter.hasNext()) {

order = (Order)iter.next();

if (order.getId() == orderId)

iter.remove();

}

}



Очередной запуск теста и очередной зеленый индикатор. Зачеркнем задание в карточке.


Получить общее количество заказов в очереди

Проверить при пустой очереди

Проверить при добавлении заказа

Проверить при удалении заказа

Добавить три заказа в очередь

Метод equals() для класса Customer

Метод equals() для класса Order

Получить общую стоимость заказов в очереди

Получить заказ с максимальной стоимостью

Удалить заказ с максимальной стоимостью

Все задания выполнены. Осталось сделать еще одну очевидную вещь – избавиться от дублирования в тестах. Обратите внимание на то, что практически во всех методах класса-теста мы делаем одно и то же: создаем очередь заявок и кладем в нее три заявки, создав при этом два экземпляра класса Customer. Создается ощущение дискомфорта при виде такого кода. Пожалуй, у создателей JUnit появились примерно те же ощущения и поэтому они добавили два метода protected void setUp() и protected void tearDown(), которые вызываются в начале и в конце запуска тестов. Обычно в этих методах происходит открытие и закрытие файлов, инициализация и завершение сеанса связи с базой данных. Например

public class TestDatabase extends TestCase {

private Database db;


protected void setUp() {

db = new Database(“localhost”);

db.open();

}
protected void tearDown() {

db.close();

}
public void testStuff() {

// ... some test code
}

public void testMoreStuff() {

// ... some more test code

}

}



В нашем случае вынесем все подготовительные действия в метод setUp().

protected void setUp(){

this.orderQuery = new OrderQuery();

Customer johnson =

new Customer("Piter Johnson", "1st avenue, 33a");

Order order1 = new Order(344, 100, johnson);

this.orderQuery.add(order1);

Order order2 = new Order(345, 170, johnson);

this.orderQuery.add(order2);

Customer cruz =

new Customer("Jenifer Cruz", "Mackborn street, 29");

Order order3 = new Order(346, 510, cruz);

this.orderQuery.add(order3);

}

Тогда, к примеру, метод testAdd() будет выглядеть достаточно лаконично:



public void testAdd(){

Customer johnson =

new Customer("Piter Johnson", "1st avenue, 33a");

Order order = new Order(345, 170, johnson);

assertEquals(order, this.orderQuery.get(1));

assertEquals(3, this.orderQuery.getCount());



}

Подобным образом сократятся и остальные методы.


3 Варианты заданий для самостоятельной работы
Варианты для самостоятельной работы представляют собой проектные диаграммы классов фрагментов программ. Недостающие методы могут быть дополнены самостоятельно. Каждой диаграмме соответствует карта тестирования с основным заданием, при необходимости добавления методов для тестирования нужно добавить задания в карту самостоятельно.
Вариант 1

Рисунок 11 – UML-диаграмма фрагмента системы учета успеваемости


Получить общее количество студентов в группе

Добавить пять студентов в группу

Получить студента с лучшим средним баллом

Получить студента с худшим средним баллом




Вариант 2

Рисунок 12 – UML-диаграмма фрагмента системы учета товаров


Получить общее количество товаров в магазине

Добавить три товара

Удалить один последний добавленный товар

Получить самый дорогостоящий товар



Получить товар, количество которого наименьшее


Вариант 3

Рисунок 13 – UML-диаграмма составления записей на компакт-диске


Добавить шесть записей на компакт-диск

Удалить одну запись

Получить общее количество записей на компакт-диске

Получить общее время звучание записей на компакт-диске



Получить количество записей по заданному артисту


Каталог: site -> assets -> files
files -> Основная образовательная программа высшего образования
files -> Зарубежный опыт нравственного воспитания молодёжи посредством культурного и природного наследия: теоретические походы
files -> Статья Основные принципы законодательства о градостроительной деятельности Статья Законодательство о градостроительной деятельности
files -> Маршруты культурного наследия Совета Европы как общеевропейская модель нравственного воспитания молодёжи
files -> Программа-минимум кандидатского экзамена по специальности 08. 00. 14 «Мировая экономика» по экономическим наукам
files -> Программа-минимум кандидатского экзамена по специальности
files -> Маркетинговые исследования рынка
files -> Программа минимум кандидатского экзамена по курсу «История и философия науки» «История педагогики»
files -> Рассказанная мовсесом хоренаци по просьбе сахака багратуни մՈՎՍԷՍ ԽՈՐԵՆԱՑԻ ՀԱՅՈՑ ՊԱՏՄՈՒԹԻՒՆ
files -> Проектирование участка новой железной дороги


Поделитесь с Вашими друзьями:
1   2   3   4


База данных защищена авторским правом ©grazit.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал