2015-01-26 3 views
5

У меня есть проект API, работающий на localhost: 8000, подключенный к тестовой базе данных, и у меня есть внешнее угловое приложение, работающее на localhost: 9000. Как сбросить базу данных после запуска каждого тестового примера переднего плана? Я использую Protractor для моего тестирования E2E на переднем конце. Я не хочу высмеивать или заглушать весь бэкэнд. Хотя это ускорит мой тест быстрее, однако, каждое взаимодействие с пользователем приведет к изменениям состояния сервера и последует еще несколько запросов на одни и те же конечные точки сервера, при этом эти конечные точки с разными результатами в разных точках могут быть слишком большим, чем просто говорить к реальному серверу. Я предпочел бы сбросить базу данных до начального состояния или сбросить все таблицы.Сбросить отдельные серверные службы при тестировании интерфейса

Один из возможных способов сделать это - написать мой тестовый пакет E2E для интерфейса в моем проекте API. Поскольку теперь он запускается бэкэндом-тестировщиком, он может легко сбросить базу данных до каждого тестового примера. Но я бы предпочел сохранить свои тесты в своем интерфейсном проекте, так как мой api также будет обслуживать других клиентов, а не только клиент браузера. И так как мой бэкэнд находится в php и использует Phpunit для тестирования, в то время как я использую Protractor для тестирования моего интерфейса, интеграция его в бэкэнд, похоже, немного неуместна.

Вы столкнулись с этой проблемой и каково ваше решение? Как вы координируете два проекта в своем тестировании E2E (или интеграции?)?

+0

Я предполагаю, что одним из способов было бы обеспечить поддержку «сброса» в вашем бэкэнд и назвать этот API для каждого нового теста. –

+0

@NewDev Звучит опасно. Но я думаю, вы можете защитить его, охраняя его проверкой среды. Другой способ - выяснить способ сброса базы данных в обратном вызове onPrepare для Protractor. Мне интересно, есть ли еще лучшие способы. Спасибо за ответ. – randomor

+0

Абсолютно, это должно быть только в тестовой среде, а не в Prod :) Кстати, это все равно не подменяет насмешку, так как она не заменяет unit-testing, но для e2e иногда требуются такие вещи. –

ответ

1

Я пошел писать все тесты E2E внутри проекта API после неудачного перехода на сторону клиента. Компромиссы:

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

  2. Я должен вручную настроить клиентскую сторону, чтобы каждый раз разговаривать с тестовой средой api перед запуском теста E2E. А также вручную установите сервер api в режиме тестирования. Потому что вам нужно, чтобы фактический веб-сервер API работал где-то, чтобы клиент мог ударить.

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

1

У меня возникла та же проблема. Мое решение состоит в том, чтобы добавить конечную точку api «reset» для восстановления базы данных до ее начала до запуска теста E2E.

Мы используем ASP.NET WebApi для создания службы RESTful. Вот моя структура кода.

[HttpGet] 
[Route("reset")] 
public IHttpAction Reset(){ 
    // check and remove records added in the e2e tests 

    // check and restore the records modified in the e2e tests 

} 

Так АНИ вызов этого метода test/reset помогает восстановить базу данных бэкэнд в исходное состояние. Мы можем поместить вызов внутри afterAll() (если вы используете JasmineJS). Или вы можете просто выполнить ручную перезагрузку, сделав это GET звонок из почтового менеджера или Fiddler.

Иногда у меня есть несколько методов сброса api для вызова. Так что я могу проверить и сбросить функциональные группы. Например, выполните тесты e2d для функций управления пользователями и сбросьте эту часть данных, а затем перейдите к следующей функции.

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

Вся цель состоит в том, чтобы повторить тесты e2e и получить тот же результат.


И, конечно, если это разрешено, еще один хороший выход для резервного копирования базы данных до нашего э2э теста и восстановить его после окончания проверки. Ручная, глупая, но иногда удобная и достаточная для повторного повторения нашего теста e2e.

+0

Спасибо за идеи! Итак, вы устанавливаете свою базу данных в начальное состояние после каждого теста, которое подкрепляется приборами? Было бы неплохо иметь фабрики, чтобы мы могли загружать каждый прецедент с минимальными начальными данными. Вы не нашли их? Поэтому я переместил все свои E2E в backend, чтобы я мог воспользоваться существующими моделями и фабриками, предоставил PHPUnit не так хорошо синтаксис для тестирования E2E по сравнению с узловыми инструментами, такими как Protractor и т. Д. – randomor

Смежные вопросы