Можно ли использовать транспортир и карму вместе?

105

Если Protractor заменяет Angular Scenario Runner для тестирования E2E, означает ли это, что я все еще смогу использовать его с Karma в качестве моей среды тестирования E2E?

голографический принцип
источник
ИМО, ты должен уметь. Карма - всего лишь участник тестов. После того, как вы напишете / построите свои тестовые примеры в Protractor .... karma сможет просто запустить его, когда вас попросят. Таким же образом вы можете попросить Карму запустить настоящие тесты E2E.
скип
1
@skeep Webdriver запускается и подключается к браузерам через протокол WebDriver - то, что Karma не поддерживает (вместо этого он использует WebSockets и веб-страницу). Они выполняют похожие задачи по-разному. Устаревшие теперь тесты Karma E2E не используют WebDriver и страдают от этого - они должны поддерживать состояние в браузере (состояние WebDriver полностью находится вне процесса браузера).
Энди

Ответы:

103

Не рекомендуется текущим сопровождающим Protractor:

https://github.com/angular/protractor/issues/9#issuecomment-19927049

Транспортир и Карма не должны использоваться вместе; вместо этого они предоставляют отдельные системы для запуска тестов. Protractor и Karma охватывают разные аспекты тестирования - Karma предназначена в основном для модульных тестов, а Protractor следует использовать для сквозного тестирования.

Protractor построен на основе WebDriverJS, который использует сервер Selenium / WebDriver для подготовки браузеров и выполнения тестов. Примеры чистого WebDriverJS можно найти здесь: http://code.google.com/p/selenium/wiki/WebDriverJs

И

https://github.com/angular/protractor/issues/9#issuecomment-19931154

Георгиос - я думаю, что имеет смысл хранить Protractor и Karma отдельно - для сквозных тестов вам нужны встроенные функции управления событиями и гибкость webdriver, тогда как для модульных тестов вам нужно быстрое выполнение и автоматическое наблюдение за файлами.

разъем
источник
Верно ли, что мы не должны запускать Protractor из Karma?
ErikAGriffin
@theLateWizard Абсолютно верно, не только нельзя, нельзя :)
Дмитрий Зайцев
75

ОБНОВИТЬ. Вот простой пакет, который я создал, чтобы добавить минимальную настройку Karma в любой проект с помощью одной единственной команды npm install min-karma.


Я хотел бы прояснить некоторые возможные заблуждения относительно Karma и Protractor . Часто задаваемые вопросы Karma действительно относятся к Adaptor for Angular's Scenario Runner , который, однако, кажется заброшенным, вместо этого рекомендуется Protractor .


Карма

Karma - это средство запуска тестов, которое будет запускать файлы JavaScript, указанные в файле конфигурации явно или с помощью node-globs . (Для внешних шаблонов , не относящихся к JavaScript , Руководство по модульному тестированию Angular рекомендует сначала использовать препроцессор Karma html, чтобы скомпилировать их в JavaScript.)

Это могут быть все ваши исходные файлы, некоторые из них, некоторые из них плюс некоторые дополнительные файлы или файлы, не относящиеся к вашему проекту, предоставляющие только некоторую дополнительную конфигурацию - вы называете это! У вас может быть несколько файлов конфигурации кармы для разных целей, которые вы можете запускать параллельно или один за другим. Каждый процесс кармы запускает свой собственный набор браузеров (в настоящее время они доступны) .

это функция от кармы запускать только набор файлов , что делает его идеальным для быстрых тестов работают в фоновом режиме при каждом файле редактирования источника, и получить немедленную обратную связь, которая является блестящей! Единственный минус - это "шумное" сообщение об ошибках, которое, надеюсь, улучшится!


Карма не только для юнит-тестов

Модульный тест предназначен для одной единицы вашего исходного кода. В случае Angular типичным элементом является Angular Component (и Service, Factory, Provider, Controller, Filter, Directiveт. Д.). Не забывайте сохранять Controllersстройность, поэтому слишком много модульных тестов для последних - это красный флаг .

В модульном тесте все остальные модули кода, от которых зависит этот модуль (так называемые зависимости модуля), не должны тестироваться одновременно. Вместо этого их следует «высмеивать», например, заменять чем-то простым, например, фиктивными экземплярами. Angular обеспечивает отличную поддержку макетов среды . В идеале вы хотите видеть все эти макеты прямо внутри ваших тестов, поэтому вам никогда не нужно задумываться, откуда берутся все эти зависимости.

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

Быстро и часто бегать - вот основная черта Кармы . Это означает, что вы хотите избежать любых запросов к серверу, любых запросов к базе данных, всего, что может занять больше долей секунды. ( В противном случае это не будет быстро! ) Эти длинные процессы - это те, над которыми вы хотите имитировать . Это также объясняет, почему размещение необработанных низкоуровневых сервисов, например, $httpнепосредственно внутри ваших контроллеров или любых сложных блоков бизнес-логики, является плохой практикой . Обернув эти низкоуровневые внешние коммуникационные услуги в более мелкие специализированные сервисы, вы значительно упростите «издевательство над ними».

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

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

Именно поэтому мне лично не нравится часто упоминаемый сложный способ тестирования методов с использованием методов низкого уровня, таких как $http. Он работает чище, чтобы изолировать любые ссылки на низкоуровневые методы в собственных специальных методах , единственной обязанностью которых является выполнение HTTP-запросов. Эти специализированные методы должны работать с реальным сервером , а не с поддельным! Что вы можете легко протестировать - вручную или даже отлично, когда Karma работает с другой специальной конфигурацией , если вы не смешиваете эту конфигурацию с той, которая обычно используется для запуска Karma. регулярно и быстро. Теперь, когда ваши выделенные небольшие сервисы протестированы, вы можете безопасно и легко смоделировать их, чтобы проверить другую логику и поместить эти тесты в свою обычную настройку Karma .


Подвести итоги. Используйте Karma для запуска любого набора файлов JavaScript. Это (должно быть) быстро. Вы не видите свое полное приложение, поэтому не можете эффективно и надежно проверить конечный результат . Мог бы я запустить его с транспортиром ? Зачем мне? Запуск Транспортира замедлил бы мои тесты, уничтожив цель Кармы . Легко работать транспортир отдельно.


Транспортир

Транспортир - это:

фреймворк для сквозного тестирования приложений AngularJS. Protractor запускает тесты для вашего приложения, запущенного в реальном браузере, взаимодействуя с ним так же, как и пользователь.

Так что Protractor делает именно то, чего не делает Karma - запускает ваше настоящее окончательное приложение. Это раскрывает его силу и ограничения:

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

Но сложнее отслеживать ошибки, не изолировав отдельные блоки исходного кода. Вот почему вам все еще нужна Карма, чтобы сначала протестировать ваш код JavaScript.


Теперь я хочу запустить Транспортир с Кармой ? Конечно, я могу запускать их параллельно в отдельных окнах терминала. В принципе, я мог бы, если мне нужно, предоставить им общий доступ к тестовым файлам, но обычно я бы этого не сделал. Зачем? Потому что я хочу, чтобы мои тесты были небольшими с одной конкретной целью.

Единственным исключением будет файл, определяющий макросы тестирования, полезные для обоих участников. Однако это будет не тестовый файл, а файл определения макроса .

Помимо этого, мне нравится четкое разделение моих тестов. Те, которые нужно запускать часто и быстро, и те, что для всего приложения. Это дает четкое различие между использованием Karma и Protractor .

Дмитрий Зайцев
источник
Если мне нужно модульное тестирование, а также тестирование e2e, мне нужно настроить среду кармы для модульного тестирования и транспортир для тестирования пользовательского интерфейса или тестирования e2e?
Сунил Гарг,
@SunilGarg Да, если хотите использовать оба, но, как я уже писал, Karma не только для модульного тестирования.
Дмитрий Зайцев
1

Karma - это средство запуска тестов, предоставленное командой Angular, Karma будет выполнять ваши тесты в нескольких браузерах, что гарантирует совместимость нашего приложения со всеми браузерами. Можно использовать модульный тест для angular js карма + жасмин

Jasmine - это среда модульного тестирования javascript, которая предоставит нам утилиты для тестирования нашего приложения. Это лучше всего работает на платформе Angular и, следовательно, в нашем выборе «инструмента автоматического модульного тестирования». https://github.com/shahing/testingangularjs

Protractor - это среда для сквозного тестирования приложений Angular и AngularJS. Protractor выполняет тесты для вашего приложения, работающего в реальном браузере, в автономных браузерах, в кроссбраузерном тестировании и может быть размещен на saucelabs.

https://github.com/shahing/Protractor-Web-Automation

Шахин
источник
1

Да, вы можете использовать карму и транспортир вместе. Karma используется для модульного тестирования компонента, который вы создали с помощью команды angular, вы можете протестировать эти компоненты с помощью karma. Транспортир используется для сквозного теста. Он в основном используется для тестирования пользовательского интерфейса.

Рахул Соланки
источник
Для этого вам нужно добавить конфигурацию как для кармы, так и для транспортира
Рахул Соланки