Автоматизация тестирования производительности с K6

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

Ниже представлены важные аспекты автоматизированного тестирования производительности:

  • Набор сценариев тестирования производительности, разработанных для автоматического выполнения инструментами.
  • Оценка результатов тестирования инструментами.
  • Гарантия того, что тестирование не нарушит работу системы.
  • Наличие метрик для принятия решений, таких как максимальное время отклика, среднее время отклика и др.
  • Формирование отчетов о результатах тестирования как для текущего, так и для ретроспективного анализа.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ

1. Какие типы тестирования производительности следует автоматизировать

Автоматизированное тестирование производительности может быть применено ко всем типам тестирования производительности. Однако каждый тип требует разного уровня зрелости и проверки.

Автоматизированное тестирование производительности:

  • Легко применяется к нагрузочному тестированию.
  • Трудно применяется к стресс- и спайк-тестам (spike), хотя это может быть полезно.
  • Очень сложно применяется к тестированию на выносливость и длительное время работы.

Автоматизированное нагрузочное тестирование

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

  • Требует наличия конкретного уровня нагрузки.
  • Требует заранее определенных метрик.
  • Требует оценки результатов.
  • Для тестирования требуется полностью идентичное окружение — допускается проверка лишь одного изменения.
  • Требует знаний инструментов и скриптов.
  • Легко интегрируется в CI/CD систему
  • Позволяет отслеживать производительность системы при изменениях.

2. Инструменты, необходимые для автоматизации тестирования производительности

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

Инструменты с открытым исходным кодом для тестирования производительности:

  • JMeter — проект Apache, версия 1.0 (1998 год)
  • Gatling — поддержка со стороны Frontline
  • K6 — поддержка со стороны LoadImpact
  • Locust
  • И многие другие

Коммерческие инструменты для тестирования производительности:

  • LoadRunner от Micro Focus (ранее Mercury — HP)
  • Blazemeter — поддержка нескольких инструментов с открытым исходным кодом
  • LoadUI Pro от Smartbear

Базы данных:

  • InfluxDB — база данных для временных данных с открытым исходным кодом
  • MongoDB — документная база данных с открытым исходным кодом

Инструменты для мониторинга и отчетности:

  • Grafana
  • Kibana
  • Graphite

Инструменты оркестрации:

  • Docker Compose
  • Kubernetes
  • Prometheus
  • Mesosphere DC/OS
  • И другие

Инструменты автоматизации:

  • Jenkins
  • TravisCI
  • TeamCity
  • CircleCI
  • Code Ship
  • Gitlab CI

3. Использование K6 для автоматизированного тестирования производительности

K6 — это инструмент с открытым исходным кодом для тестирования производительности, который ориентирован на разработчиков. Он предлагает множество полезных функций для выполнения тестов в более безопасном, быстром и интегрированном формате. Интеграция с CI/CD осуществляется очень легко.

Некоторые из ключевых особенностей K6:

  • Высокая производительность, входит в топ-5 по сравнению с аналогами.
  • Написан на языке Golang, но позволяет писать тестовые сценарии на JavaScript.
  • Легкая интеграция с базами данных (например, InfluxDB).
  • Удобное создание отчетов (Grafana).Обширные библиотеки, которые можно использовать в скриптах. Запросы отправляются через k6/http. Группировка позволяет выполнять запросы одного типа в рамках одной группы.

Пример простого тестового скрипта на K6:

// script.js
import { check, sleep, group } from "k6";
import http from "k6/http";
import { Trend } from "k6/metrics";

let valid_urls = ["/", "/api/users", "/api/user?username=testusername1"];
let host = "http://0.0.0.0:8001";

export let TrendRTTGet = new Trend("RTTGet");
export let TrendRTTPost = new Trend("RTTPost");

export let options = {
    thresholds: {
        "RTTGet": [
            "p(95)<800",
            "p(90)<700",
            "max<900",
            "avg<600",
            "med<600",
            "min<100",
        ],
        "RTTPost": [
            "p(95)<850",
            "p(90)<700",
            "max<900",
            "avg<600",
            "med<600",
            "min<200",
        ]
    }
};

export function setup() {
    // Здесь можно настроить начальные параметры
}

export default function() {
    group("GET", function() {
        var url = valid_urls[Math.floor(Math.random() * valid_urls.length)];
        var link = host + url;
        console.log(link);

        let res = http.get(link);
        check(res, {
            "status is 200": (r) => r.status === 200
        });
        TrendRTTGet.add(res.timings.duration);
    });

    group("POST", function() {
        var url = "/api/register/";
        var link = host + url;
        var username = (new Date()).getTime().toString(36) + Math.floor(Math.random() * 100000000).toString();
        console.log(link + username);

        let formData = { 
            username: username,
            email: username + '@gmail.com',
            birthday: '2001-01-02',
            address: 'test address is going here'
        };

        let res = http.post(link, formData);
        check(res, {
            "status is 201 or 202": (r) => [201, 202].includes(r.status),
        });
        TrendRTTPost.add(res.timings.duration);
    });

    sleep(3);
}

export function teardown() {
    // Здесь можно завершить тестирование
}

Примечание редакции: вас также может заинтересовать статья “Тестирование производительности и k6”

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

docker run --network host -i loadimpact/k6 run - \
    --vus 10 \
    --duration 30s \
    --out influxdb=http://localhost:8086/testrisk \
    <load_test-k6.js

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

docker run --network host -i loadimpact/k6 run - \
    --vus 10 \
    --stage 5s:10,5m:20,10s:5 \
    --out influxdb=http://localhost:8086/testrisk \
    <load_test-k6.js

K6 легко интегрируется с базой данных InfluxDB. В настройках также используется docker-compose для создания экземпляра InfluxDB, который мы будем использовать для передачи данных на панель мониторинга Grafana для визуализации результатов.

version: '3'
services:
  influxdb:
    build:
      context: .
      dockerfile: Dockerfile.influxdb
    ports:
      - "8086:8086"
  grafana:
    build:
      context: .
      dockerfile: Dockerfile.grafana
    links:
      - influxdb
    environment:
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_BASIC_ENABLED=false
    ports:
      - "3000:3000"
  k6:
    build: .
    ports:
      - "6565:6565"
    environment:
      - K6_OUT=influxdb=http://influxdb:8086/k6
    command: 'version'

K6 отправляет результаты тестирования в InfluxDB, что позволяет нам визуализировать данные с помощью Grafana. Вы можете воспользоваться готовой панелью мониторинга, предоставленной LoadImpact.

Интегрируйте эти скрипты в вашу систему CI/CD для автоматизации нагрузочного тестирования и мониторинга результатов через Jenkins.

Заключение

Автоматизированное тестирование производительности с использованием K6 представляет собой мощное и эффективное решение для оценки и оптимизации производительности приложений. Благодаря своей гибкости, простоте интеграции и богатым возможностям K6 позволяет легко создавать и запускать тесты, а также визуализировать их результаты с помощью InfluxDB и Grafana.

Интеграция K6 в ваш процесс CI/CD обеспечивает непрерывный мониторинг и анализ производительности, позволяя быстро реагировать на изменения и потенциальные проблемы. Использование K6 и связанных инструментов помогает улучшить качество и надежность программного обеспечения, обеспечивая более высокую производительность и стабильность ваших приложений.

Перевод статьи «Automated Performance Testing with K6».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *