Подтвердить что ты не робот

Может ли Angular сценарий e2e-тестов интегрировать рабочий процесс внешних ресурсов

Как вы используете бегун сценария для сценариста Karma Runner (ex-Testacular) для интеграции рабочего процесса offsite/out-of-app/external-resource в тесте e2e?

Основной сценарий:

  • У приложения есть кнопка.
  • Нажмите кнопку, чтобы отправить данные поставщику услуг X (например, отправить на http://service/submit или что угодно).
  • Поставщик X требует click/submit/action по этому URL.
  • Поставщик X затем отправляет что-то обратно в наше приложение.

Я не спрашиваю: "Как вы заглушите провайдера X". Я спрашиваю, как вы на самом деле это сквозной тест, так что наши тесты могут фактически нарушить изменения API сторонних поставщиков. Я в основном ищут возможность управлять сайтом вне приложения, похожим на то, как вы можете с чем-то вроде Selenium Webdriver.

В настоящее время моя проблема заключается в использовании element( ref ).click() для попытки выполнить шаг 2, он не кажется, что он когда-либо загружает требуемый сайт, поэтому ни один DOM не действует, не имеет возможности завершить e2e.

4b9b3361

Ответ 1

Невозможно выполнить этот сценарий с помощью Karma. Я расскажу о том, как работает Карма, как она сравнивается с Webdriver, и что было бы необходимо для реализации этого сценария.

Прежде всего, важно иметь в виду, что Karma и angular -ценарий - это не одно и то же. Карма - это общая оболочка для запуска тестов на основе браузера. Он запускает процессы браузера, запускает node для обслуживания веб-страницы, содержащей тестовый жгут, запускает тесты, отправляя команды через websocket, а затем собирает результаты. Это агностик в отношении фактического жгута/рамки, который проводит тесты. Он имеет адаптеры для сценария Angular (используется для тестов Angular e2e), Jasmine (обычно используется для модульных тестов Angular) и других популярных фреймворков JavaScript.

Тест-ролики, такие как Jasmine, выполняются в том же контексте окна, что и тестируемый код, поэтому он полезен для модульных тестов. Сценарий сценария Angular, напротив, имеет отношение длины руки к тестируемой системе. Он загружает все приложение в iframe, а затем по большей части имитирует пользовательские события и утверждения тестов на явно экспонированных элементах DOM.

Поскольку сценарий-бегун взаимодействует с приложением по границе iframe, он ограничен политикой браузера с одним доменом. Невозможно выполнить запуск сценария на http://localhost:8000, затем загрузить http://yourapp в iframe, а затем запустить события внутри этого iframe.

Один из способов - просто запустить сценарий на том же сервере, что и ваше приложение. Вот простой пример:

http://plnkr.co/edit/rfqpSq?p=preview

Тем не менее, крахмал тестового бегуна в приложении не очень удовлетворителен. Карма дает вам способ обойти это со встроенным прокси-сервером HTTP. Вы можете настроить Karma на прокси любое количество разных серверов, чтобы все они происходили из одного и того же источника. Просто добавьте их в раздел proxies файла конфигурации:
proxies = {
  '/': 'http://yourapp/',
  '/service/': 'http://service/'
} 

Это позволяет вашим тестировкам e2e пересекать домены, но улов в том, что когда передача домена происходит посредством отправки или перенаправления формы, она должна быть связана с прокси-адресом. В противном случае бегун сценария потеряет управление iframe и не сможет продолжить тестирование.

Обратите внимание, что Selenium Webdriver не имеет этого ограничения. Он работает выше уровня отдельного окна браузера, поэтому он не ограничен одной и той же политикой домена.

Итак, давайте посмотрим на ваш конкретный сценарий. Что касается фактических HTTP-запросов и ответов, я предполагаю, что это поток, который вы хотите использовать:

  • Загрузите приложение из http://yoursite/yourapp.html
  • Пользователь отправляет форму, которая выглядит следующим образом:
<form method="POST" action="http://service/remotesubmission">
  ...your form...
  <input type="submit">
</form>
  • Поставщик X обрабатывает удаленный POST, а затем перенаправляет на форму по адресу:
<form method="POST" action="http://service/nextsubmission">
  ...provider form...
  <input type="submit">
</form>
  • Поставщик X обрабатывает форму POST, а затем перенаправляет обратно в ваше приложение.

Если это реальный сценарий, то я думаю, что единственный способ сделать эту работу с кармой и сценарием сценария Angular будет:

  • Уцените URL-адрес действия в своей форме, чтобы он указывал на прокси-адрес внешней службы при тестировании.
  • Убедитесь, что URL-адреса перенаправления и действия в потоке провайдера остаются в пределах проксированных путей. Я не думаю, что в настоящее время это возможно, но, возможно, можно будет исправить Karma, чтобы настроить шаблоны замещения для проксированного контента.