Тесты Mocha в бессерверном приложении AWS Lambda Express

У меня есть приложение nodejs на основе expressjs, которые я тестирую, используя gruntjs в качестве средства выполнения задач и mochajs в качестве тестовой среды. Таким образом, я написал компонентные, интеграционные и модульные тесты, которые выполняются через grunt test или напрямую через mocha test/component/v1/apiX локально, когда я разрабатываю, и на тестовой виртуальной машине во время развертывания в рамках процесса CI.

Теперь, когда вы думаете о переносе этого приложения на AWS Lambda aka без сервера, возникают следующие вопросы относительно моего тестирования и процесса CI (обратите внимание, что я собираюсь использовать aws-serverless-express и, следовательно, мне не придется писать лямбда-функции явно):

1) Как реализовать тесты компонента / e2e, которые выполняются через HTTP-запросы api?

2) Как реализовать интеграцию и модульные тесты, которые загружают и тестируют только часть приложения?

3) Как интегрировать и то, и другое с новым потоком CI, который отклоняет развертывание, если какой-либо из тестов завершается неудачно?

Считаю вопрос 1) в основном решенным: существует множество подходов к тестированию AWS Lambdas извне. Вы можете выполнить тестирование лямбда-лямбда, вызвав лямбда-тест напрямую из теста-лямбда, или вы можете вызвать лямбда-тест через AWS API Gateway, используя HTTP из теста-лямбда, как описано здесь. Вы также можете использовать serverless-mocha-plugin для локального лямбда-тестирования (при использовании без сервера).

Это 2), где становится интересно: как только ваша лямбда развернута, она становится черным ящиком. Вы не можете выполнить ничего, что явно не объявлено как лямбда-интерфейс. Как мне сохранить или повторно реализовать мои существующие модульные и интеграционные тесты мокко?

То же самое для 3): как сделать так, чтобы ваш CI запускал все тесты при развертывании и отклонял развертывание, если они терпят неудачу?

Вот мой собственный подход: я бы сделал мое приложение узла бессерверным только в тестовой среде. Просто позвольте ему работать как классическая HTTP-служба узла, сделав все бессерверные изменения условными в зависимости от среды. Поскольку требуется несколько изменений, это должно быть возможным и поддерживаемым. Теперь я могу запускать тесты как обычно локально и при развертывании с помощью grunt и mocha. Тогда я все еще могу пройти окончательное тестирование лямбда-лямбда, если я хочу убедиться, что бессерверная версия также работает.


person B M    schedule 08.10.2016    source источник
comment
Я раньше использовал lambCI для такого рода вещей. Я думаю, что чтение этой статьи поможет вам понять все идеи автора (очень близкие к вашим) и ограничения, которые он обнаружил с ее помощью, то есть жизненный цикл лямбда в 300 секунд, отсутствие поддержки докеров и т. Д.   -  person MarcoL    schedule 10.10.2016
comment
спасибо посмотрю!   -  person B M    schedule 10.10.2016


Ответы (1)


Ваш подход звучит хорошо. А что касается 3, вы можете просто заставить ваш CI запускать локальные тесты, развертывать его в среде «dev» или «test» и запускать lambdaTests.

grunt # run grunt commands including local mocha tests
serverless deploy --stage test # deploy to test environment (serverless#1.0 syntax)
grunt lambdaTest

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

person Tolbahady    schedule 10.10.2016