У меня есть приложение 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. Тогда я все еще могу пройти окончательное тестирование лямбда-лямбда, если я хочу убедиться, что бессерверная версия также работает.