Рубрики
Без рубрики

Как я пишу осмысленные тесты для AWS Lambda функций

Жесткая правда Если вы собираетесь написать бессмысленные модульные тесты, которые чаще Mas … Теги от AWS, безвесочны, Python, тестирование.

Жесткая правда

Если вы собираетесь написать бессмысленные модульные тесты, которые чаще маскируют ошибки, чем разоблачить их, вам лучше пропустить упражнения.

Там я сказал это.

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

Эффективное тестирование кода уже давно сложная проблема в программировании, а новые инструменты, такие как AWS Lambda, кажется, выявляют худшие разработчики, когда речь идет о написании тестов.

Я думаю, что главная причина этого – это то, что это сложнее (или, по крайней мере, менее интуитивно понятно), чтобы отразить среду производства лямбда локально. И в результате некоторые разработчики воздерживаются от тестирования полностью.

Я знаю, потому что я сделал это сам, даже для проектов в производстве. Вместо этого тестирование было выполнено интеграционно-стиль только после того, как код уже развернут в облаке.

Это чрезвычайно ручное и отдает время в долгосрочной перспективе. Еще один подход, который я видел результаты тестов, которые выглядят что-то подобное:

Это безошибочный признак инженерной группы с требованием тестирования охвата, но отсутствие подотчетности. И объяснение не требуется, чтобы вышеизложенное не является отсутствием.

Итак, как мы отправляемся в преобразование файла Sad Test_lambda_function .py выше в что-то значимое?

Прежде чем мы сможем погрузиться прямо в тестирование нашего кода лямбда, в пути есть пару препятствий. Мы покроем каждый из них индивидуально и определим, как лучше всего справиться с ними. После того, как мы справились, мы можем бесплатно проверить лямбдас до контента нашего сердца!

Примечание. Я буду включать небольшие фрагменты кода на протяжении всей статьи для ясности. Но в конце появится полный пример рабочего кода для ссылки.

Burdle # 1: мероприятие Lambda Trigger

Каждая функция лямбда вызывается в ответ на предварительно определенный триггер, который проходит специфические событие данные в по умолчанию lambda_handler () метод. И ваша первая задача для эффективного тестирования функции Lambda состоит в том, чтобы создать реалистичное событие ввода для тестирования.

Формат этого события зависит от типа триггера. По состоянию на момент написания присутствуют 16 различных услуг AWS, которые могут выступать в качестве триггера вызова для лямбда.

Ниже приведен фрагмент кода с несколькими примерами входов, которые я наиболее часто использую:

Полный список событий ввода образца можно найти в AWS Документация Отказ В качестве альтернативы вы также можете распечатать переменную события в вашем коде Lambda_Handler после развертывания и просмотра полезной нагрузки в журнала CloudWatch:

После того, как у вас есть этот пример, просто заблокируйте его в вашем тестовом файле, как показано выше, и мы в фантастическом запуске!

Следующий…

Препятствие # 2: AWS Service Взаимодействия

Почти неизбежно, функция лямбда взаимодействует с другими услугами AWS. Может быть, вы пишете данные на таблицу dynamodb. Или публиковать сообщение на SNS-тему. Или просто отправка метрики на Cloudwatch. Или комбинация всех трех!

При тестировании не рекомендуется отправлять данные или изменять фактические ресурсы AWS, используемые в производстве. Чтобы обойти эту проблему, один подход должен быть установлен и позже раскрыть отдельные тестовые ресурсы.

Однако более чистый подход, состоит в том, чтобы издеваться над взаимодействиями с услугами AWS. И поскольку это общая проблема, был разработан пакет для решения этой конкретной проблемы. И что лучше, это так сильно в супер элегантном пути.

Это название Moto (портманто Mock & Boto), и его элегантность получена из двух основных функций:

  1. Он исправляет и заменяет клиенты Boto в тестах автоматически.
  2. Он поддерживает состояние ресурсов Pseudo AWS.

Как это выглядит? Все, что нужно, это какой-то декоратор магии и немного настроен!

Скажем, мы читаем данные S3 в нашей лямбде. Вместо создания и заполнения тестового ведра в S3 мы можем использовать Moto для создания поддельного ведра S3 – один, который выглядит и ведет себя точно так же, как настоящий – без того, на самом деле не касаясь AWS.

И лучшая часть мы можем сделать это, используя стандартный синтаксис Boto3, как видно в примере ниже при вызове create_bucket и put_object Методы:

Точно так же, если мы пишем данные для Dynamodb, мы могли бы настроить наш тест, создав фальшивую таблицу Dynamo первым:

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

Хорошо, но не все покрыто Moto …

Да, это правда, что Moto не поддерживает четность с каждым AWS API. Например, если ваша лямбда функция взаимодействует с AWS Clue, шансы находятся MOTO, покинут вам высокую и сухую, поскольку для сервиса клеев всего 5%.

Именно здесь нам нужно свернуть наши рукава и сделать грязную работу издевательства, называет себя Обозноживание Отказ Это правда.

По общему признанию терминология и концепции вокруг этого становится густыми, поэтому он лучше всего объясняется через пример. Давайте придерживайтесь клей AWS и скажем, у нас есть жжение, желание перечислить склеил нашу учетную запись с следующим кодом:

session = boto3.session.Session()
glue_client = session.client("glue", region_name='us-east-1')
glue_client.list_crawlers()['CrawlerNames']
# {"CrawlerNames": ["crawler1", "crawler2",...]}

Если мы не хотим успеха или неудачи нашего прославленного теста, чтобы зависеть от list_crawlers () Ответ, мы можем жестко обратить внимание, как так:

Используя Setattr Метод прибора MonkeApatch Petest мы разрешаем клеевым клиентским кодом в lambda_handler Динамически во время выполнения доступа к жесткому образованию list_clusters Ответ от класса Mockbotosessions.

Что хорошего в этом решении, это это достаточно гибко для работы для любого клиента Boto.

Приводящий к приспособлениям

Мы уже охватывались, как иметь дело с входами событий и внешними зависимостями в Lambda Tests. Еще один совет, который я хотел бы поделиться, включает в себя использование Pтойца Светильники поддерживать организованный файл тестирования.

Примеры кода до сих пор показали заданный код напрямую в test_lambda_handler сам метод. Однако лучший рисунок должен создать отдельный set_up Функция как приспособление Ptyest, которая передается в любой метод теста, который необходимо его использовать.

Для Final Code Snippet давайте покажем пример этой структуры прибора, используя @ pytest.fixture Декоратор и комбинируйте все покрытые:

Мы прошли долгий путь от пустого тестового файла в начале статьи, нет?

В качестве напоминания этот код тестирует функцию лямбда, которая:

  1. Триггеры с события сообщения SQS
  2. Пишет сообщение на таблицу Dynamo
  3. Перечислены доступные клеи

Используя эти стратегии, хотя, вы должны чувствовать уверенное тестирование лямбда, вызванное из любого типа события, и тот, который взаимодействует с любым обслуживанием AWS.

Последние мысли

Если вы изо всех сил пытались проверить свои функции лямбда, моя надежда эта статья показала вам несколько советов, чтобы помочь вам сделать это полезным способом.

Пока мы провели много времени на общие вопросы и как вы не должен Тестируйте лямбда, у нас не было возможности покрыть обратное, но одинаково важный аспект этой темы – а именно, что Должен Вы тестируете, и как вы можете структурировать код функции лямбда, чтобы облегчить это сделать.

Я с нетерпением жду ответа от вас и обсудим, как вы тестируете функции лямбда!

Спасибо Вамши Раполо для вдохновения и отзывы об этой статье.

Оригинал: “https://dev.to/aws-builders/how-i-write-meaningful-tests-for-aws-lambda-functions-2ifh”