CronTabManager + PHPunit (Автоматические тесты)

Всем привет.
Недавно занимался возможность интеграции PHPunit тестов со своим компонентом CrontabManager.

Сегодня удалось завершить эту разработку.
Теперь CronTabManager умеет запускать PHPunit тесты из коробки.

После установки CronTabManager как обычно создает директорию с котроллерами:
core/scheduler/Controllers/
Сейчас по дефолту добавлен контроллер demophpunit.php
core/scheduler/Controllers/demophpunit.php
Который как раз и показывает как запустить PHPunit тест.

UPD: 22.03.2020: Интеграция PHPUnit в PHPStrom с помощью компонента CronTabManager


Запуск PHPunit по расписанию


Так как из названия компонента понятно что это crontab (фоновые задания которые запускаются по расписанию)
То теперь наши тесты можно поставить на запуск, например: 1 раз в 3 часа

Добавляем задание:Производить запуск тестов 1 раз в 3 часа и отсылать уведомления на емаил если 3 попытки завершились не удачно.



Демонстрация


Как выглядят уведомления



Это gif со всеми процессами: просмотра логов и уведомлением на email.


Ссылка на github
github.com/webnitros/CronTabManager

Ссылка на modstore
modstore.pro/packages/utilities/crontabmanager

Зачем все это


Основная идея такой реализации — это простая интеграция тестов в Modx так как без извратов с настройками в разных IDE не обойтись.

Но даже если вам удалось интегрировать тесты, всегда остается вопросы:
  • Как запускать тесты по расписанию;
  • Как получать уведомления в случае неудачного прохождения теста ❌;
  • Где смотреть логи, если была ошибка;
В общем все эти вопросы снимает мой компонент так как в нем уже все встроено.

UPD: 22.03.2020

Интеграция с PHPStorm


И еще одна доработка для запуска из под PHPStorm с удаленным подключением к mysql

1. Копируем наш файл с конфигом core/config/config.inc.php в core/config/test.inc.php в котом настраиваем подключение к mysql (если подключение удаленное то PORT обязательно нужно указывать)

// core/config/test.inc.php
<?php
/**
 *  MODX Configuration file
 */
$database_type = 'mysql';
$database_server = 'IP SERVER:PORT';
$database_user = '{USERNAME}';
$database_password = '{PASSWORD}';
$database_connection_charset = 'utf8';
$dbase = ''{DATABASE}';

....

2. Создаем файл phpunit.xml с содержимым
в bootstrap указываем путь до файла core/components/crontabmanager/lib/phpunit/MODxTestHarness.php
// phpunit.xml
<phpunit colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="true"
         verbose="true"
         bootstrap="public_html/core/components/crontabmanager/lib/phpunit/MODxTestHarness.php"
         timeoutForSmallTests="5"
         timeoutForMediumTests="5"
         timeoutForLargeTests="10"
         reportUselessTests="true"
         strictCoverage="true"
         disallowTestOutput="true"
         enforceTimeLimit="true">
    <php>
        <server name="REQUEST_URI" value="/"/>
    </php>
</phpunit>

3. Подключение нашего файл phpunit.xml в phpStorm и указываем откуда запускать PHPunit



4. Создаем папку tests с тестами в корне сайта и наш первый тест

// tests/Settings.php
<?php
/**
 * Created by Andrey Stepanenko.
 * User: webnitros
 * Date: 21.03.2021
 * Time: 15:34
 */
class Settings extends MODxProcessorTestCase
{

    public function testSiteName()
    {
        $sitename = $this->modx->getOption('site_name');
        self::assertEquals('MODX REVOLUTION', $sitename);
    }

}
Теперь тесты готовы к запуску

5. Жмем play



6. Получаем результат



Вот так просто можно встроить PHPUnit в PHPStrom с помощью компонента CronTabManager
Андрей Степаненко
21 марта 2021, 16:04
modx.pro
2
481
+4
Поблагодарить автора Отправить деньги

Комментарии: 9

Сергей Шлоков
22 марта 2021, 10:29
0
Не совсем понятно, зачем нужны тесты рабочего сайта по расписанию. Обычно тестируют разработку перед деплоем. Протестировал — замёрджил — задеплоил.

Ну и по поводу вышеописанных примеров тестов. Они нарушают все базовые правила юнит-тестирования — обращения к файловой системе и базе данных недопустимы. Их обычно мокают. Это уже больше функциональное тестирование. И для этого есть шикарный фреймворк Codeception.
    Андрей Степаненко
    22 марта 2021, 10:31
    0
    Есть вариант как мокнуть xpdo?
      Сергей Шлоков
      22 марта 2021, 10:33
      0
      MODX плохо поддаётся юнит-тестированию. Поэтому юзаем Codeception.
        Андрей Степаненко
        22 марта 2021, 10:35
        0
        Codeception — особо не знаком с ним. Можно попробовать встроить и его. Разницы то особо нету какой фреймворк запускать из под crontabmamager
          Андрей Степаненко
          22 марта 2021, 10:40
          0
          MODX плохо поддаётся юнит-тестированию.

          Из за этого и встроил PHPunit в Crontabmanager
          Ибо чтобы настроить PHPUnit для modx мозг взорвется пока это сделаешь.

          crontabmanager использует твою наработку по запуску скриптов на бэкенде (спасибо)))).
          За счет чего полноценно стартуют тесты в Modx.
            Андрей Степаненко
            22 марта 2021, 10:44
            0
            Ах да забыл про это написать.
            Стартую изолированный Modx, а не из под того же скрипта который его запустил
            Пишет все в логи, а уже из логов читаются сообщения.
            Сергей Шлоков
            22 марта 2021, 10:43
            0
            Есть вариант как мокнуть xpdo?
            В этом как раз и жопа. Вместо дополнительного уровня абстракции (как это сделано в Evolution — $modx->db) modX тупо наследуется от xPDO. И в итоге хрен ты чего сделаешь.
          Андрей Степаненко
          22 марта 2021, 10:33
          0
          При интеграции с разными сервисами частенько что то ломается.
          Не совсем понятно, зачем нужны тесты рабочего сайта по расписанию. Обычно тестируют разработку перед деплоем. Протестировал — замёрджил — задеплоил.
          Банальный ответ: Для автоматического тестирования)))))))))))
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9