Тестирование и интеграция
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 87 из 91.
Задание
ЛегкоПоздравляем с созданием полноценной системы управления библиотекой! Теперь пришло время объединить все ваши компоненты и убедиться, что все работает безупречно. Вы создадите комплексный интеграционный тест, который проверит весь рабочий процесс вашей библиотеки.
Вы распределите свой код по пяти файлам:
Book.php— Ваш классBookсо свойствами только для чтения (isbn,title,author), приватным свойством$isAvailableи методами:isAvailable(),markAsBorrowed()иmarkAsReturned().User.php— Подключите файл Book. Ваш классUserсо свойствами только для чтения (id,name), приватным массивом$borrowedBooks, константойMAX_BOOKSсо значением3и всеми пользовательскими методами.Library.php— Подключите файл User. Ваш классLibraryс управлением книгами, функционалом выдачи/возврата, методами поиска и методомremoveBook().Admin.php— Подключите файл Library. Ваш классAdmin, наследующийUser, с методамиaddBookToLibrary()иremoveBookFromLibrary().main.php— Подключите файл Admin. Здесь вы запустите свой интеграционный тест. Вы получите два входных значения: имя пользователя и ключевое слово для поиска автора.Настройте вашу библиотечную систему:
- Создайте объект
Library - Создайте объект
Adminс ID1и именем"LibraryAdmin" - Создайте объект
Userс ID2и предоставленным именем пользователя
Пусть администратор добавит эти три книги:
- ISBN:
"978-0", Title:"PHP Fundamentals", Author:"Sarah Johnson" - ISBN:
"978-1", Title:"OOP Patterns", Author:"Mike Chen" - ISBN:
"978-2", Title:"Web Security", Author:"Sarah Johnson"
Затем выполните следующую последовательность интеграционного теста, выводя каждый результат на новой строке:
- Пусть пользователь возьмет книгу
"978-0" - Пусть пользователь возьмет книгу
"978-1" - Выполните поиск по автору, используя второе входное значение, и выведите количество:
"Books by author: [count]" - Получите список доступных книг и выведите:
"Available: [count]" - Пусть пользователь вернет книгу
"978-0" - Снова получите список доступных книг и выведите:
"Available after return: [count]" - Пусть администратор удалит книгу
"978-0" - Пусть администратор попытается удалить книгу
"978-0"еще раз
- Создайте объект
Это финальное испытание подтверждает, что вся ваша система работает слаженно: администраторы управляют инвентарем, пользователи берут книги в рамках лимитов, поиск возвращает точные результаты, а статус доступности корректно обновляется на протяжении всего процесса.
Попробуйте сами
<?php
require_once 'Admin.php';
// Чтение входных данных
$userName = trim(fgets(STDIN));
$searchAuthor = trim(fgets(STDIN));
// TODO: Создать библиотеку (Library)
// TODO: Создать администратора (Admin) с ID 1 и именем "LibraryAdmin"
// TODO: Создать пользователя (User) с ID 2 и предоставленным именем пользователя
// TODO: Пусть администратор добавит три книги:
// - ISBN: "978-0", Title: "PHP Fundamentals", Author: "Sarah Johnson"
// - ISBN: "978-1", Title: "OOP Patterns", Author: "Mike Chen"
// - ISBN: "978-2", Title: "Web Security", Author: "Sarah Johnson"
// TODO: Последовательность интеграционного теста:
// 1. Пусть пользователь возьмет книгу "978-0"
// 2. Пусть пользователь возьмет книгу "978-1"
// 3. Выполнить поиск по автору, используя $searchAuthor, и вывести: "Books by author: [count]"
// 4. Получить список доступных книг и вывести: "Available: [count]"
// 5. Пусть пользователь вернет книгу "978-0"
// 6. Снова получить список доступных книг и вывести: "Available after return: [count]"
// 7. Пусть администратор удалит книгу "978-0"
// 8. Пусть администратор попытается удалить книгу "978-0" снова
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy