Краща практика для одиничних тестів у Magento 1.9


11

Я підтримую сайт Magento 1.9 з декількома спеціальними модулями. Деякі з функціональних можливостей є критично важливими для бізнесу та гостро потребують деяких тестів. Наприклад, калькулятор ціни одиниці продукції.

Зазвичай я розвиваюсь у Symfony і дійсно вважаю за краще якось використовувати PHPUnit (w / Composer), якщо це взагалі можливо.

Деяка функціональність базується на даних, імпортованих до декількох спеціальних таблиць баз даних, тому я вважаю за краще якось завантажити світильники.

Тому я шукаю найкращий підхід до написання деяких тестів. Я буду гладким приймати підручники чи щось подібне. Будь-яка допомога вдячна.

Відповіді:


10

Я знову стикався з тією ж проблемою.

Я розглядав можливість використання модуля Ecomdev PHPUnit, але мені важко використовувати і погано задокументовано (але я все ще люблю те, що робить Іван та його великий внесок у екосистему Magento).

Отже, за допомогою Vinai я закінчив розробляти наступний тестовий рамковий модуль: https://github.com/digitalpianism/testframework

Первісна мета була інтеграційними тестами, але я також використовую її для одиничних тестів. Ви можете побачити його в дії тут: https://github.com/digitalpianism/easytoplinks/blob/master/app/code/community/DigitalPianism/EasyToplinks/Test/Unit/Block/Page/Template/LinksTest.php

Що стосується світильників, то я використовую зворотні звороти транзакцій, щоб уникнути створення зразкових даних у базі даних.


Це виглядає дійсно перспективно. Я спробую це. Дякую.
фрігг

13

Установка

Оскільки Magento 1 не використовує композитора поза коробкою, я не думаю, що це має велике значення, якщо встановити phpunit за допомогою композитора або просто завантажити версію phar .
Якщо ви вже використовуєте композитор для управління іншими сторонніми модулями або бібліотеками на вашому сайті, то композитор, мабуть, має найбільше сенс. Якщо ви не використовуєте PHP7, ви будете обмежені старою версією phpunit (тому я пов’язав версію 4.8 вище).

Інтеграційні тести проти / та / або Тести одиниць

Оскільки Magento 1 є настільки важким додатком для ваги, є сенс розділити завантажувальний апарат phpunit на один для інтеграції та один для одиничних тестів.
Тестовий завантажувальний пристрій потрібно лише ініціалізувати автозавантажувач, тоді як тестовий завантажувальний пристрій інтеграції повинен ініціалізувати все середовище програми, включаючи завантаження конфігурації та з'єднання db.
Через те інтеграційні тести в Magento, як правило, працюють набагато повільніше, ніж одиничні тести (тим більше, що і в інших програмах).

Завантаження Magento на phpunit

  • Автозавантажувач Magento не відповідає стандарту PSR-0, оскільки він видає виняток, якщо він не може знайти файл, в якому знаходиться клас. Це порушує деякі звичаї class_existsв phpunit. Є кілька можливих (якщо хакі) обхідних шляхів:

    • Скасуйте реєстрацію автозавантажувача Magento, загорнувшись \Varien_Autoload::autoload()в декоратор, ігноруючи винятки, кинуті всередині, та зареєструйте обгортку як новий автонавантажувач. Це низька ймовірність конфлікту з сторонніми бібліотеками, які реєструють автозавантажувачі та залежать від конкретного замовлення автозавантажувача.
    • Використовуйте користувальницький обробник помилок, загорнувши вбудований в Magento 1. Спеціальні обробники помилок ковтають помилки, викликані автозавантажувачем Magento. Це рішення, яке використовує тестова рамка Рафаеля . Це, мабуть, є найбільш сумісним з іншими розширеннями сторонніх розробників.
    • Використовуйте hack path path для переосмислення, \Varien_Autoload::autoload()щоб не викинути помилку, якщо файл не існує. Однак це конфліктує з декількома модулями, які також перекривають один клас. Я сам не використовую такий підхід.
  • Щоб уникнути помилок із запуску сеансу під час тестів, просто встановіть $_SESSON = []у завантажувальній програмі.

  • Встановіть спеціальний об'єкт відповіді, Mage::app()->setResponse($testResponse)який розширює реальний, але не надсилає вихідні чи заголовки.

  • Для повторної ініціалізації Magento між інтеграційними тестами, які повністю змінюють стан виконання, використовуйте Mage::reset(); Mage::app(). Зауважте, що після цього оброблювач помилок доведеться повторно прикрасити.

Світильники

Для світильників DB я, як правило, використовую звичайні моделі в методах кріплення для створення світильників, наприклад createSimpleProduct($sku). Як сказав Рафаель, використовуйте setUp()та tearDown()оберніть тест у транзакції, яка повертається після тесту (наприклад Mage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction()).

Для пристосувань конфігурації магазину я, як правило, налаштовую лише світильники в пам'яті за допомогою Mage::app()->getStore()->setConfig($path, $value).

EcomDev_PHPUnitРозширення також надає можливість для створення БД приладів з допомогою YAML файлів, але для себе я вважаю , тим важче підтримувати по порівнянні з сантехнікою , створеної з використанням моделі класів. YMMV.

Тест-пар

Реєстр можна використовувати для введення тестових пар для об’єктів, створених через Mage::getSingleton(), Mage::getResourceSingleton()та Mage::helper().
Можна встановити деякі інші центральні об'єкти Mage::app()(наприклад, запит).
Для заміни класів, створених за допомогою тестових пар, Mage::getModel()або за Mage::getResourceModel()допомогою тестових пар, слід використовувати спеціальну обгортку об'єкта конфігурації . Дивіться цей приклад у тестовій рамці Рафаеля, як це можна досягти.

Підсумок

Після того, як Magento завантажується, майже все можна перевірити досить добре. Будьте готові створити глибокі макети через велику кількість методів, що ланцюжок основного коду використовує, хоча.
Незважаючи на те, що налаштування хакі, воно працює добре, і я вважаю, що тести дають мені велику впевненість і цінність, майже в порівнянні з тестовим набором для програми Symphony.


Я ніколи не пробував цього, але чому б не використати Magento Test Framework? ( Docs.magento.com/m1/ce/user_guide/magento / ... )
Від

3
Так, я спробував це, але це функціональне тестування (не одиничне чи інтеграційне), воно повільне, це складне і тести, як правило, лускаті і крихкі. Загалом я вважав час, який я провів з цим, марно.
Вінай

@Vinai Я знаю його пізно, але загалом у контролері є дзвінки до моделей та колекцій, які при тестуванні нам не знадобляться. Я використовую вашу рамку тестування (DigitalPianism), і там ми можемо TestDouble моделей, але, роблячи запит на отримання дії до контролера, який, у свою чергу, використовує модель, як я можу знущатися над тим викликом моделі / колекції?
arqam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.