Модульное тестирование 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: