Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Codeception + Symfony2 настройки модулей и генерация ссылок

codeception
Теги: #<Tag:0x00007f7b639a48a0>

(Георгий) #1

Дано:

  1. Codeception (Acceptance)
  2. Symfony2

Вопросы:

  1. Мне необходимо использовать Test окружение Symfony2. Модуль Symfony2 с настройкой
    environment: 'test'
    в файле codeception.yml справляется с этой задачей. Но я не могу указать линк куда стучаться. localhost мне не подходит. Сервер стоит на той же машине. Мне надо что бы стучался на указанный URL (http://example.com).

  2. Варианты PhpBrowser, WebDriver не имеют настроек окружения Симфони (только свои настройки окружения - т.е. браузеры).
    Меня устроит на данном этапе или Модуль Симфони, который стучится по урлу, или PhpBrowser, который понимает окружение симфони (настройки окружения в настройках симфони разные). Настройки базы, конечно отдельные, но настройки логов - нет. Тестовые логи пишутся, когда меняется окружение.
    Подойдет так же костыль какой-то. К примеру окружение симфони ДЕВ, можно запустить через файл app_dev.php, но app_test.php файла нет и не предусмотрено такое извращение.

  3. В туториалах пишут мол “Бест вей” использовать УРЛы прописанные руками, а не через роутеры. amOnPage вместо amOnRoute. Но мне сейчас надо отправить Ajax запрос:
    Текущая страница localhost/example, надо отправить запрос на вообще другой роутер localhost/test/check.
    Но я не могу вписать руками ссылку.
    Мне надо что бы это работало при разных хостах. (проблема выше п1 в т.ч.)
    $i->sendAjaxPostRequest();


(Michael Bodnarchuk) #2

Тут сразу важно отметить, что есть два способа запускать приложения: внутренний и внешний.

Внутренний: мы запускаем приложение внутри тестов, мы используем модуль Symfony, test environment, test database, не используем веб сервер, а следовательно URL и host не имеет никакого смысла.

Внешний: мы запускаем веб приложение на сервере и тестируем через него. При этом мы ничего не знаем о том на чем напсано приложение, нет никакой внутренней информации о нем. Модуль Symfony2 не используется. Только модуль Webdriver или PhpBrowser

Если вам таки нужен второй вариант, то мне кажется вполне нормальный способ сделать app_test.php, перенастроив его таким образом, чтобы он вгружал тестовый environment.


(Георгий) #3

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

Для примера:
Могу ли я получить доступ из тестовых хелперов (я так понял из cept, cest никак) к сервисам симфони ?
Я могу внести данные, но результат работы (который я хочу тестировать) представлен графикой, таблицами и т.д. Т.е., конечно, можно искать по таблице. Но можно б было просто перебрать массив, который возвращает сервис симфонийский.
Т.е. я хочу

$i->fillField('#test', 12);
$i->click('#submit);
$i->seeInDatabase('test', ['value' => 12];
$service = get('service.name.calculator');
$result = $service->calculate();

И у меня есть готовый (считал вручную) массив, который я хочу сравнить с $result (перебором).

Это, возможно, изврат и смесь разных подходов (как по мне, так логично что имея доступ к сервису надо данные забивать в базу НЕ через вэб интерфейс, а фикстурой). Но считайте это двумя разными тестами. Один проверяет на возможность отправки формы и записи в БД, другой вид теста использует сервис для калькулирования.

Спасибо большое.


(Michael Bodnarchuk) #4

Да. http://codeception.com/docs/modules/Symfony#grabService

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

Кстати вместо seeInDatabase советую подключить модуль Doctrine2 и использовать seeInRepository, в таком случае запрос будет идти через доктрину, а также все тесты будут оборачиваться в транзакцию и откатываться в конце. Таким образом тест не будет писать в базу и сам по себе будет работать гораздо быстрее.