Модульное тестирование AWS Lambda-функций в Node.js
Я большой поклонник написания модульных тестов и очень расстраиваюсь, если те, кто работает над проектами, их не пишут. Я также люблю задокументировать свои тесты в том виде, в каком они написаны. Я использую Node.js последние пару лет и широко использую фреймворки Mocha и Chai (expect) в своих проектах.
Когда я начал писать лямбда-функции с использованием Node.js, я не нашел фреймворков, которые мне нравились бы. В итоге я написал свои собственные вспомогательные утилиты, чтобы сделать тестирование Lambdas более простым и менее болезненным.
По старому
Давайте протестируем мои базовые фреймворки, Mocha и Chai, и воспользуемся очень простой функцией Lambda, чтобы упростить примеры в этой статье.
Ниже представлена лямбда-функция, которую мы хотим протестировать:
Чтобы полностью покрыть код, мы хотели бы проверить, что имя равно «Ричард» и «риатт», имя является чем-то другим, и просто для удовольствия имя не установлено (не определено).
Итак, наш тестовый код с использованием некоторых циклов для допустимых / недопустимых случаев будет выглядеть так:
Our project structure should look as follows: /example index.js package.json /node modules /test index.test.js
Запустив вышеуказанный тест для нашего обработчика, мы должны получить следующий результат:
vandium-rhyatt:myLambda rhyatt$ mocha test myLambda ✓ successful invocation: name=Richard ✓ successful invocation: name=rhyatt ✓ fail: when name is invalid: name=Fred ✓ fail: when name is invalid: name=undefined 4 passing (10ms)
Наши тесты отлично работают, и если бы мы запустили инструмент покрытия кода, такой как istanbul, у нас был бы полный охват. Но если бы код был немного сложнее, у нас могли бы возникнуть серьезные проблемы.
Новый способ - использование лямбда-тестера
После написания нескольких версий тестовых утилит, обсуждения лучших практик с другими разработчиками и их неоднократных просьб использовать мой тестовый код, меня осенило, что другие испытывают аналогичную боль (или просто не пишут тесты!). Я открыл исходный код своего инструмента под названием lambda-tester, и он доступен через NPM.
Чтобы использовать его в своем проекте:
npm install lambda-tester --save-dev
Давайте начнем делать лямбда-функции более простыми и менее болезненными для тестирования. Следующий код представляет собой тот же набор тестов, но на этот раз мы используем лямбда-тестер:
И когда мы его запускаем:
vandium-rhyatt:myLambda rhyatt$ mocha test myLambda ✓ successful invocation: name=Richard ✓ successful invocation: name=rhyatt ✓ fail: when name is invalid: name=Fred ✓ fail: when name is invalid: name=undefined 4 passing (9ms)
Наш новый набор тестов состоит из 44 строк по сравнению с 76 в старом методе. Если бы наше лямбда-выражение действительно что-то делало и было более сложным, мы могли бы увидеть большую разницу в объеме кода.
При использовании лямбда-тестера * важно * вернуть экземпляр LambdaTester
в среду тестирования, поскольку он использует обещания JavaScript для обработки асинхронных операций. Невыполнение этого шага приведет к тому, что лямбда-тестер не будет работать должным образом и тест не пройдёт.
Подведение итогов
Лямбда-тестер не только сокращает объем работы, которую вам нужно выполнить в ваших тестах, но также упрощает чтение и сопровождение тестов. Встроенный асинхронный дизайн с внутренним использованием Promises снижает потребность в сложной логике обратного вызова. Если ваша лямбда-функция выдает ошибку или следует неправильным путем, лямбда-тестер определит проблему и не пройдет тест.
Если вам понравилась эта статья и вы пишете обработчики для AWS Lambda, ознакомьтесь с нашим родственным проектом Vandium, который упрощает написание обработчиков Lambda: