YiiFramework Yii. Как протестировать ConsoleCommand

panoptik

Новичок
Господа. Доброго времени всем.

Боюсь вопрос будет странным или тупым, но все же есть необходимость покрыть тестами некоторую консольную команду. там примерно 3-4 экшна и они вызываются по крону.
В тестировании не силен, писал несколько юнит-тестов под модели, но под остальные части приложения не доводилось и слегка не понимаю философию как правильно это сделать
Сложности добавляет еще и то что в приложении выполняются обращения к 3+ внешним источникам информации - это различные сервисы, обращения по апи или собственно написанным врапперам.

Собственно мне нужно протестировать логику их взаимодействия, которая собрана именно в этой консольно команде. Какой вид тестов нужно использовать в таком случае (функциональные, интеграционные)?
Использовал PHPUnit. Немного видел как работает селениум. В данном случае не совсем понятно к чему отнести консольную команду.

Заранее благодарен за наводки и советы
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
эссе, мягко говоря, непонятное

Боюсь вопрос будет странным или тупым
главное чтобы он был :) ибо сейчас вопроса нет вообще, есть лишь поток мыслей

но +1 к вопросу о разделе про тестирование
 

panoptik

Новичок
ну если ближе к делу в коде это выглядит примерно так

PHP:
<?php

class WorkingCommand extends CConsoleCommand
{
    public function actionSomethingUsefull()
    {
          // тут много всякой бизнес логики

        $apiData = Api::getNeedData();
        if($apiData->someParam == 1) {
              $res =  $this->help1($apiData->helpParams);

              if($res->param == 1) {
                      $this->help2($res);
              } else {
                      $this->help3($res);
              }

            // еще какая-то логика с сохранением в бд или извлечением оттуда и последующей обработкой
        }

     
    }

    private function help1($params)
    {
        // some implementation here with business logic
    }

    private function help2($params)
    {
        // отправка данных на сервис 1
    }

    private function help3($params)
    {
        // отправка данных на сервис 2
    }
}
есть некоторые обращения к сторонним сервисам, в данному случае методы help2 и help3 вызывают врапперы для сервисов и отправляют данные туда.

насколько я понимаю мне нужно сделать моки для всех сервисов и сэмулировать отправку и получение данных с каждым из них, чтобы можно было безопасно протестировать код, но так как этот код вызывается из консоли, я не знаю как правильно его настроить в phpunit-bootstrap. да и на просторах гугла ничего похожего не нашел. была только одна тема на yiiframework.com/forum но тот пост остался без ответа.
отсюда у меня создалось впечатление что таким никто не занимается очевидно потому что это как-то неправильно. так как в тестировании я не силен, то сообразить что не так не в состоянии, а логику нужно покрыть тестами, потому что периодически туда вносятся изменения, и я хочу быть уверенным что ничего не упадет после очередных

так что вопрос в том стоит ли и можно ли это протестировать на уровне консольной команды? или тупо вынести все в отдельные классы и тестировать как юниты вне контекста приложения? но все же вопрос покрытия функциональными тестами тогда останется открытым
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я перечитал твой пост 3 раза и не смог понять что такое "это", что ты хочешь протестировать,
я не знаю что такое уровень консольной команды,
что такое "все", что выносится в отдельные классы,
и от чего они отдельные,
и почему тупо,
и что такое контекст приложения,
и с кем у тебя диалог, кто с тобой не соглашается, и ты говоришь ему "все-же"

в общем, или у тебя шизофрения, или ты разговариваешь сам с собой
 

AmdY

Пью пиво
Команда форума
юнит тест - это когда ты тестишь один метод одного класса, подменяя моками другие объекты или методы того же класса. Интеграционные - это когда ты тестишь всю кучу. Для апишек лучше юнит тест, чтобы не было эффекта минус на минус дают плюс. У тебя в примере статика и дерган е кучи состояний и методов объекта, так что юнит будет написать сложно, начать лучше с интеграционного, а потом лепить юниты постепенно улучшая архитектуру.
 

panoptik

Новичок
AmdY, спасибо. просветили
буду читать про инеграционные тесты. как это делать для yii2 уже нашел. так что для первой части, думаю проблем не будет
 
Сверху