Я разрабатываю Webapp. Он состоит из 2 частей. A node сервер останова и клиент с угловым клиентом.
Приложение структурировано таким образом: Rest Server ↔ Api Module ↔ Angular App
Сервер в настоящее время хорошо протестирован. У меня есть тесты модулей и интеграционные тесты. Интеграционные тесты обращаются к реальной базе данных и вызывают остальные api по http. Я думаю, что это такой высокий уровень, который он может получить для тестирования сервера. Интеграционные тесты также выполняются быстро. Я довольно уверен, что способ проверки сервера достаточно для моего варианта использования, и я доволен результатами.
Однако я изо всех сил пытаюсь проверить приложение angularjs. У меня есть модульные тесты для соответствующих директив и модулей. Написание их не было проблемой.
Я хотел бы написать интеграционные тесты, которые охватывают пользовательские сценарии. Что-то вроде сценария регистрации: пользователь посещает веб-сайт, переходит к форме регистрации и отправляет форму с данными.
Команда angularjs переходит из ng-сценариев в protractor. Транспортир использует Selenium для проведения тестов. Поэтому есть две области: область приложения и область проверки.
Теперь я могу думать о трех разных абстракциях, которые я мог бы использовать. И я не уверен, какой из них лучше всего подходит мне.
- Откажитесь от модуля Api
- Макет сервера останова
- Использовать полный сервер
Макет модуля Api
В этом случае мне не нужно будет устанавливать сервер. Все взаимодействия выполняются в браузере
Преимущество:
- Сервер не требуется
Неудобство:
- Api находится в области браузера, и мне приходится вмешиваться в это.
Мне действительно нравится это решение, но мне сложно издеваться над Api.
Api необходимо изменить в области браузеров.
Поэтому мне нужно отправить модификацию из теста в браузер.
Этот можно сделать, однако я не вижу, как я мог запускать утверждения типа mockedApi.method.wasCalledOnce()
в области проверки
Макет сервера останова
Преимущество:
- Клиент не изменится
- Только одна область действия для
Неудобство:
- Нужно настроить маршруты останова
Я мог бы создать полный сервер Mock Rest в nodejs.
Тестеры-транспортеры записываются в nodejs, поэтому управление сервером может быть выполнено в тесте.
Прежде чем запустить тест, я могу сказать серверу, как реагировать.
Что-то вроде этого: server.onRequest({method: 'GET', url: '/'}).respondWith('hello world')
Тогда я мог делать утверждения типа wasCalledOnce
Использовать полный сервер с базой данных
Каждый тест работает с полным сервером и может добавлять элементы в базу данных. После каждого теста можно просмотреть ожидаемые элементы в базе данных
Преимущество:
- Можно с уверенностью сказать, что если эти тесты запущены, приложение будет функционировать в проверенном случае использования
Неудобство:
- Я уже провел довольно интенсивный интеграционный тест с остальным сервером. Это похоже на повторение этого же вопроса.
- Настройка зависит от полного сервера
Текущее заключение
- Издевательствование Api полностью отделяет сервер и клиент.
- Использование Mock Api было бы более высоким уровнем тестирования, но для этого требовался поддельный сервер
- Выполнение полного теста интеграции даст лучшую надежность, но это также сильно зависит от кода сервера.
Что я должен выбрать? Что бы вы сделали?