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

Написание рамок распределенной тестирования Cicada

В прошлом году я писал Cicada-2, низкокодовую структуру тестирования. С момента его выпуска я рассмотрел способы … Помечено тестированием, докером, Python, Showdev.

В прошлом году я написал Cicada-2, низкая кодовая структура тестирования Отказ С момента его выпуска я считал способы улучшения на нем, особенно для беговых тестов нагрузки. Это история того, как я создал Cicada распределен, основа на нагрузке на основе Python И почему я считаю, что должен быть инструмент для тестирования ваших услуг.

Почему это было время для перезаписи

Cicada-2 был основан на уроках, которые я узнал, пытаясь проверить комплексные приложения. Хотя было отлично подходит для интеграционных тестов, у него не было никаких функций, которые мне нужно было писать эффективные тесты нагрузки. Жесткокодируемая модель нагрузки Cicada-2 ограничивала, когда она пришла к написанию теста, кроме чего-то вроде «ударить мою API кучу раз». Я хотел, чтобы инструмент мог ударить достаточно жестко, чтобы узнать, что это истинные ограничения.

С учетом этого я начал добавлять более программные функции тестирования в Cicada-2. Однако я быстро понял, что я предпочел бы написать тесты в Python, чем с некотором неловким рекурсивным ямлом, смешанным с Jinja2. Поэтому я начал закончиться и начал писать цикаду с нуля.

Переписать Cicada снова … и снова

Основная функция, которую я хотел, чтобы новая Цикада должна была позволить пользователям иметь полный контроль над моделью нагрузки теста. Тест должен быть в состоянии не только вызывать сервис определенного количества раз, но доставляя нагрузку на нагрузку, масштабируясь до порога, а куча других ситуаций, которые я не рассматривал.

Для этого Cicada использует модель виртуальной пользователей. По сути, код для моделирования действий пользователя работает параллельно для создания нагрузки. Я написал начальную версию этого, чтобы запустить виртуальные пользователи внутри потоков. К сожалению, это оказалось не большим подходом. Отпечатки печати сломали бы остальную часть теста. Я бы получил странные ошибки о том, что могло и не могла быть замариваться, чтобы бежать в ните. Код, написанный за пределами теста, не всегда будет работать. Кроме того, процесс, управляющий пользовательскими потоками, стал узким местом. Было трудно контролировать, какие пользователи могут начать и остановиться без значительного влияния на производительность.

Как работает новая цикада

После нескольких ревизий я поселился на распределенной модели пользователя, которая была свободно связана с сценарием через брокер событий (Кафка на сегодняшний день). Вместо того, чтобы запустить на управляющем экземпляре, виртуальные пользователи работают внутри контейнеров. Это значительно упрощает виртуальный код пользователя, потому что он позволяет Cicada использовать преимущества контейнера Orchestrator в управлении пулом пользователей, вместо управления отдельными нитками через машину или несколько машин. Кроме того, модель событий позволяет пользователям получать команды и отправлять результаты на свой собственный темп, что делает тест менее склонным к узким местам производительности.

Еще одно серьезное улучшение заключается в том, насколько более настраиваемая модель нагрузки Cicada распределена, чем у Cicada-2. Это позволяет писать его на простых Python и управлять сценарием через API. Это означает, что вы можете масштабировать пользователи вверх и вниз программно, а также DivVy Up Load среди пользовательского пула. Наконец, у вас есть полный контроль над тем, как результаты собираются и проанализированы через определенную пользовательскую агрегацию и функции фильтрации ошибок.

Быстрый пример

Чтобы продемонстрировать улучшенные функции тестирования нагрузки на распределенные цикады, мы пройдем по примеру простого теста. Для этого примера я создал API С конечной точкой для создания пользователя и хранения его в базе данных:

Для базового теста нагрузки мы можем ударить эту конечную точку ограниченным количеством пользователей в течение определенного времени. Во-первых, нам нужно будет установить Docker и Cicada распределены и создать пустой проект:

pip install cicadad

mkdir load-test
cd load-test

cicada-distributed init .

В каталоге Load-Test вы увидите пару файлов:

  • Dockerfile
  • test.py

Поскольку Cicada использует Docker для упаковки тестов, вы можете добавлять какие-либо зависимости на изображение в пользователю или сценарию. Добавьте пакет запросов на DockerFile:

FROM cicadatesting/cicada-distributed-base-image:latest

RUN pip install requests

COPY . .

ENTRYPOINT ["python", "-u", "test.py"]

Следующий , Обновите Test.py с базовым тестом нагрузки:

...
from cicadad.core.decorators import scenario, load_model, user_loop
from cicadad.core.scenario import n_seconds, iterations_per_second_limited
...

@scenario(engine)
@load_model(n_seconds(180, 30))
@user_loop(iterations_per_second_limited(4))
def post_user(context):
    requests.post(
        url="http://172.17.0.1:8080/users",
        json={
            "name": "jeremy",
            "age": 23,
            "email": f"{str(uuid.uuid4())[:8]}@gmail.com",
        },
    )

В этом примере Cicada выполнит тест Post_user, чтобы создать пользователя в течение 180 секунд с 30 пользователями. Кроме того, каждый пользователь ограничен 4 запросами в секунду. Чтобы выполнить тест, вам нужно будет запустить кластер (брокер событий и сервис для создания контейнеров) и запустить тест:

cicada-distributed start-cluster
cicada-distributed run

Когда это работает, мы покончим с кривой нагрузки, которая выглядит так (я использовал Prometheus + Grafana для мониторинга API):

Что, если мы хотели увидеть, сколько нагрузки API может занять через 3 минуты? Удалить линию @user_loop (iterations_per_second_limited (4)) и заменить его с @user_loop (while_alive ()) (Импортируйте его с помощью CICADAD.CORE.SCENARIO Import White_alive). Это удалит ограничение на запросы в секунду, поэтому виртуальные пользователи могут сделать как можно больше запросов. На моей машине я смог обрабатывать примерно 200 запросов в секунду (хотя виртуальные пользователи Cicada способны выкладывать гораздо более высокие RPS против более способного хоста). Дайте мне знать в комментариях, насколько загрузка ваша система смогла обрабатывать.

Вывод

В заключение я намного более доволен гибкостью распределенной цикады по сравнению с Cicada-2. Пожалуйста, не стесняйтесь Попробуйте Cicada распределены И дайте мне знать, что вы думаете!

Оригинал: “https://dev.to/herzo175/writing-the-cicada-distributed-testing-framework-4p8”