В этой статье разберемся что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них. (1) /**/ Наглядный пример из жизни Что такое уровень тестирования? Пример реальной задачи по разработке 1. Модульное / Компонентное / Unit тестирование Характеристики модульного тестирования 2. Интеграционное тестирование […]
или иначе: “Как вызвать приватный метод в другом классе?“ этот вопрос с подвохом, т.к. ответ на него должен быть — “никак, без рефакторинга (переписания архитектуры класса, заменой private метода на protected/public)” Но вот лайфхак: можно, с помощью рефлексии (1): Вызов защищенных и приватных методов Если вам […]
Типы тестов Что такое PHPUnit Пишем свою unit-тест Что такое юнит-тесты в PHP и как их писать, рассмотрим по мануалу (1). Типы тестов Прежде чем мы погрузимся в PHPUnit давайте разберём различные типы тестов. В зависимости от того, как вы хотите категоризировать их, в PHPUnit применяются […]
Тестовые «двойники» или Mock-объекты в PHPUnit Типы тестовых «двойников» Как создать тестового «двойника» Добавление «двойника» (mock) unit-тест При тестировании кода, использующего какие-то внешние компоненты, часто применяют подход mock-объектов. (1) Это такие объекты, которые имеют тот же интерфейс, что и используемые компоненты, но их поведение полностью задаётся […]
Вкратце Концептуально Отличие абстрактного класса от интерфейса (4) Использование интерфейсов и абстрактных классов (примеры) Пример №1 Пример №2 Пример №3 Пример №4 Вкратце Абстрактный класс — это класс, у которого не реализован один или больше методов (некоторые языки требуют такие методы помечать специальными ключевыми словами). Интерфейс […]
Как получить доступ к private свойству класса из другого класса (извне) ? Решение №1: Наследование Решение №2: Рефлексия Решение №3: Массивы Источники Как получить доступ к private свойству класса из другого класса (извне) ? Согласно (1), есть один легальный и два нелегальных способа: Решение №1: Наследование […]
Плохой пример Хороший пример Источники … ISP или “Принцип разделения интерфейса“ Согласно ISP, «Клиенты не должны зависеть от интерфейсов, которые не используют». Хороший пример демонстрации принципа: классы, для которых требуются большие объекты настроек (settings objects). Рекомендуется не требовать от клиентов настраивать много параметров, потому что по […]
Плохой пример Хороший пример Источники: … DIP или “Принцип инверсии зависимостей” Этот принцип гласит: Высокоуровневые модули не должны зависеть от низкоуровневых. Оба вида должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций. Сначала это может быть трудным для понимания, но […]
Алексей Корепанов — ИНТЕРВЬЮ — это плохой способ нанять ПРОГРАММИСТ Список видео: Алексей Корепанов — ИНТЕРВЬЮ — это плохой способ нанять ПРОГРАММИСТ (function(){ var data = { «addon_key»:»net.veniture.confluence.cloud.macrosuite», «uniqueKey»:»net.veniture.confluence.cloud.macrosuite__easy-html-macro1312578174320522226″, «key»:»easy-html-macro», «moduleType»:»dynamicContentMacros», «moduleLocation»:»content», «cp»:»/wiki», «general»:»», «w»:»100%», «h»:»100%», «url»:»https://macrosuite.cloud.veniture.net/html?macroId=c3bd744c-769a-4a6f-bd9f-7f6b3f5dfede&pageId=168656930&pageVersion=3&xdm_e=https%3A%2F%2Fmishaikon.atlassian.net&xdm_c=channel-net.veniture.confluence.cloud.macrosuite__easy-html-macro1312578174320522226&cp=%2Fwiki&xdm_deprecated_addon_key_do_not_use=net.veniture.confluence.cloud.macrosuite&lic=none&cv=1.1054.0&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1YmIzNGM2ODU5ZDg4MTEzYTM3MzkyZWYiLCJxc2giOiI4MjI1MjUwZDg4NzY3ODgwYzNmMTNkOWU3ZDlkYzAwMjEzN2E4NWI4NmEzYTI1YTc0ZTEyZDNiYjRhMmUxNzE5IiwiaXNzIjoiOWU3NWMxNmEtNmFkYi0zZDVkLTk2ZjgtZDJjY2E2ZDQ5ZDAwIiwiY29udGV4dCI6e30sImV4cCI6MTYzMDM5NzExNCwiaWF0IjoxNjMwMzk2OTM0fQ.ODdauHeIY0UbE9A86L_yFqTggoHBWAJyIlUSv_oYMyE», «contextJwt»: «eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI1YmIzNGM2ODU5ZDg4MTEzYTM3MzkyZWYiLCJxc2giOiJjb250ZXh0LXFzaCIsImlzcyI6IjllNzVjMTZhLTZhZGItM2Q1ZC05NmY4LWQyY2NhNmQ0OWQwMCIsImNvbnRleHQiOnsiY29uZmx1ZW5jZSI6eyJtYWNybyI6eyJvdXRwdXRUeXBlIjoiZW1haWwiLCJoYXNoIjoiYzNiZDc0NGMtNzY5YS00YTZmLWJkOWYtN2Y2YjNmNWRmZWRlIiwiaWQiOiJjM2JkNzQ0Yy03NjlhLTRhNmYtYmQ5Zi03ZjZiM2Y1ZGZlZGUifSwiY29udGVudCI6eyJ0eXBlIjoicGFnZSIsInZlcnNpb24iOiIzIiwiaWQiOiIxNjg2NTY5MzAifSwic3BhY2UiOnsia2V5IjoiV0lLSSIsImlkIjoiODIyNDc5NCJ9fX0sImV4cCI6MTYzMDM5NzgzNCwiaWF0IjoxNjMwMzk2OTM0fQ.yScdQN6lR64XX2rssTr9OWS6_D2y8Rqad-FiekStQfg», «structuredContext»: «{»confluence»:{»macro»:{»outputType»:»email»,»hash»:»c3bd744c-769a-4a6f-bd9f-7f6b3f5dfede»,»id»:»c3bd744c-769a-4a6f-bd9f-7f6b3f5dfede»},»content»:{»type»:»page»,»version»:»3»,»id»:»168656930»},»space»:{»key»:»WIKI»,»id»:»8224794»}}}», «contentClassifier»:»content», «productCtx»:»{»page.id»:»168656930»,»macro.hash»:»c3bd744c-769a-4a6f-bd9f-7f6b3f5dfede»,»space.key»:»WIKI»,»user.id»:»5bb34c6859d88113a37392ef»,»page.type»:»page»,»content.version»:»3»,»page.title»:»u0412u0438u0434u0435u043e u043fu0440u043e u0438u043du0442u0435u0440u0432u044cu044e»,»macro.localId»:»cc3850e7-0175-4b2d-9021-eeebdee5ed56»,»macro.body»:»»,»: = […]