В современной статье я руководствую вас через настройки Azure DEVOPS для выполнения автоматических тестов нагрузки с использованием K6. Прежде чем мы начнем, я хочу занять минуту, чтобы объяснить, какие тесты нагрузки есть и почему они необходимы.
Существует много разных типов тестирования в разработке программного обеспечения. Например, некоторые тесты проверяют, что разные модели приложения работают вместе, как и ожидалось (тестирование в интеграции), некоторые сосредоточены на бизнес-требования к приложению, подтверждающие выпуск действий без учета промежуточного состояния (функциональное тестирование), а другие выполняют разные Типы тестирования. Тестирование нагрузки — это тип тестирования производительности, а также тип теста на стресс и тест на пропускной способности. Он фокусируется на проверке стабильности и надежности приложения в условиях нормальной и пиковой нагрузки.
Важно: в то время как тестирование нагрузки тестирует ваше приложение в соответствии с реалистичными средней или пиковыми нагрузками, тестирование стресс-тестирования в условиях, которые намного превышают реалистичные оценки.
Как работает нагрузка на тестирование? Во время тестирования нагрузки инструмент тестирования имитает одновременные запросы к вашему приложению через несколько виртуальных пользователей (VUS) и меры понимания, такие как время отклика, пропускные способности, уровень использования ресурсов и многое другое.
В современном мире как предприятия, так и потребителям полагаются на цифровые приложения для важных функций. По этой причине даже небольшая неудача может быть дорогостоящим как с точки зрения репутации и денег. Например, представьте, если Amazon не знал количества трафика, который мог бы поддерживать его серверы; Это не предоставит запросы от своего клиента во время пиковых сезонов, как Черная пятница. Вы можете подумать, что это событие вряд ли. Однако, согласно опросу, предпринятому Глобальному исследованию и консультативной фирме Gartner, в 2020 году 25% респондентов сообщили о среднем почасовой стоимости простоя от их применения составляло от 301 000 до 400 000 долл. США. Кроме того, 17% сказали, что это стоило их 5 миллионов долларов в час.
K6 — это инструмент для тестирования нагрузки на открытом исходном источнике, который встраивает время выполнения JavaScript, чтобы разработчики писать тесты производительности в JavaScript. Каждый скрипт должен иметь хотя бы одну функцию по умолчанию. Эта функция представляет точку входа виртуального пользователя. Структура каждого сценария имеет две основные области:
- Код INIT: Код вне функции по умолчанию, которая работает только один раз на VU
- Код Ву: Код внутри функции по умолчанию, которая работает непрерывно, если Тест работает
// init code export default function() { // vu code }
Если вы хотите определить характеристики, такие как длительность или DNS, или если вы хотите увеличить или уменьшить количество VU во время теста, вы можете использовать объекты параметров следующим образом:
export let options = { test_1: { executor: 'constant-arrival-rate', rate: 90, timeUnit: '1m', duration: '5m', preAllocatedVUs: 10, tags: { test_type: 'api' }, env: { API_PROTOCOL: 'http' }, exec: 'api', }, test_2: { executor: 'ramping-arrival-rate', stages: [ { duration: '30s', target: 600 }, { duration: '6m30s', target: 200 }, { duration: '90s', target: 15 }, ], startTime: '90s', startRate: 15, timeUnit: '10s', preAllocatedVUs: 50, maxVUs: 1000, tags: { test_type: 'api' }, env: { API_PROTOCOL: 'https' }, exec: 'api', }, };
Такие процессы, такие как непрерывную интеграцию, способствуют левому тестированию сдвига, предоставляя вам преимущество открытия и устранения проблем на ранних этапах развития приложений. Тем не менее, вам следует запускать тесты нагрузки, предназначенные для определения того, могут ли ваше приложение обрабатывать запросы в среде как можно ближе к производству. Хотя стоимость поддержания окружающей среды, идентичной этой продукции, может быть запрещенной, вы должны сделать это как можно более похожими. Если у вас есть ресурсы, решение может быть создание промежуточной среды, которая является копией нашей производственной среды. В противном случае вы можете рассматривать тщательно проводить тесты на вашей производственной среде. В этой демонстрировании я покажу вам, как настроить ваши DevOps, чтобы выполнить нагрузочные тестирования API .NET 5, написанные в C # с использованием K6. Теперь, когда у вас есть общее понимание ведущих игроков этой статьи, давайте копаемся в демонстрацию.
Создайте API
Во-первых, вам нужно создать новый ASP.NET 5 API. Вы можете сделать это легко, используя следующий код:
dotnet new sln dotnet new webapi -o Training -f net5.0 --no-https dotnet sln add Training/Training.csproj
Чтобы сделать эту API более реалистично, добавьте провайдеру базы данных базы данных объекта Antity Framework, и создайте экземпляр DBContext, который представляет сеанс с базой данных, который вы будете использовать для запроса и сохранения экземпляров ваших объектов.
public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptionsoptions) : base(options) { } public DbSet Products { get; set; } }
Затем зарегистрируйте контекст в качестве службы в коллекции ISERVICE, скопировав и вставляя следующую инструкцию в файле StartUp.cs:
services.AddDbContext(opt => opt.UseInMemoryDatabase("ApplicationDbContext"));
Создайте класс продукта со своими атрибутами и методами:
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; }public static void AddProduct(ApplicationDbContext context, Product product) { context.Products.Add(product); context.SaveChanges(); } public static Product GetProductById(ApplicationDbContext context, int id) { return context.Products.FirstOrDefault((p) => p.Id == id); } public static ListGetAllProduct(ApplicationDbContext context) { return context.Products.ToList(); } public static void RemoveProductById(ApplicationDbContext context, int id) { var productToRemove = context.Products.FirstOrDefault((p) => p.Id == id); context.Products.Remove(productToRemove); context.SaveChanges(); } }
Чтобы завершить ваше API, создайте контроллер, чтобы определить методы вашего API:
[ApiController] [Route("[controller]")] public class ProductController : ControllerBase { private readonly ApplicationDbContext _context; public ProductController(ApplicationDbContext context) { _context = context; } [HttpPost] [Route("AddProduct")] public void AddProduct(Product product) { Product.AddProduct(_context, product); } [HttpPost] [Route("RemoveProduct")] public void RemoveProduct(int id) { Product.RemoveProductById(_context, id); } [HttpGet] [Route("GetAllProducts")] public IEnumerableGetAllProducts() { return Product.GetAllProduct(_context); } [HttpGet] [Route("GetProduct")] public Product GetProduct(int id) { return Product.GetProductById(_context, id); } }
Создайте тест нагрузки
Теперь, когда ваш API готов, вы можете двигаться вперед с тестами нагрузки. Для этого создайте новую папку и скопируйте следующий код в него в файле Script.js:
import http from 'k6/http'; import { check } from 'k6'; import { jUnit, textSummary } from 'https://jslib.k6.io/k6-summary/0.0.1/index.js'; export const options = { stages: [ { duration: '10s', target: 10 }, { duration: '20s' }, { duration: '10s', target: 5}, ], thresholds: { http_req_duration: ['p(95)<250'], }, }; export default function () { let res = http.get(`${__ENV.API_PROTOCOL}://${__ENV.API_BASEURL}/Product/GetAllProducts`); check(res, { 'is status 200': (r) => r.status === 200, }); } export function handleSummary(data) { let filepath = `./${__ENV.TESTRESULT_FILENAME}-result.xml`; return { 'stdout': textSummary(data, { indent: ' ', enableColors: true}), './loadtest-results.xml': jUnit(data), } }
Давайте найдя момент, чтобы объяснить, что делает этот код. Во-первых, он настраивает тест для увеличения количества виртуальных пользователей от 1 до 10 за 10 секунд в объекте параметров. Затем этот номер останется постоянным до 10 ВУ в течение 20 секунд. Наконец, он будет прессовать до 5 ВУ в последние 10 секунд вашего теста. Объект порогов определяет, что для успеха, по меньшей мере, 95% запросов этого теста должно быть ниже 250 мс. Теперь, давайте поговорим о функциях. В этом скрипте у нас есть две функции. Как я уже упоминал ранее в этой статье, функция по умолчанию — это точка входа каждого виртуального пользователя (VUS). Я использовал модуль K6/HTTP для выполнения HTTP в метод My API GetAllProducts. Я также добавил два переменных среды для изменения динамического изменения протокола и базового URL. Вторая функция — это рукоданство (). Эта функция вызывается в конце теста; Он содержит результаты в их параметре. Затем я использую функцию HS HELPER для генерации файлов Junit из сводных данных с использованием результатов.
Установите расширение K6
Чтобы использовать функциональные возможности K6, вы можете либо вручную запустить скрипт для установки инструмента на виртуальную машину, где агент работает или установка расширения K6 в вашей организации. Чтобы установить расширение, выполните следующие действия:
- Войдите в свою организацию Azure DevOps.
- Перейти к настройкам организации.
- Выберите расширения.
- Нажмите на Browse Marketplace в правом верхнем углу.
- Как открывается рынок, поиск K6. Нажмите на правильный результат K6, как показано ниже.
- Нажмите на кнопку получить бесплатно.
- Выберите свою целевую организацию из выпадающего списка, затем нажмите «Установить», чтобы завершить процедуру.
Где выполнить тест нагрузки в трубопроводах?
В Azure DEVOPS вы можете разработать как построить и освобождать трубопроводы. Возможно, вам может быть соблазн выполнить ваш тест нагрузки в вашем построенном конвейере, чтобы определить любую деградацию. Тем не менее, это освобождает его от пострадавших трубопроводных обязанностей. Также, чтобы быть надежным, тестирование нагрузки должно быть выполнено в среде, которая лучше представляет собой производство. С экономической точки зрения, среда развития обычно использует гораздо меньше ресурсов, чем производство для вычислений, хранения и сетей. Следовательно, я рекомендую выполнить тест нагрузки в выпускном трубопроводе.
Поскольку в центре внимания этой демонстрации тестирование нагрузки, я избегаю объяснения шагов, необходимых для создания сервисного подключения к вашему облачному провайдеру и вашу сборку, и я двигаюсь непосредственно на выпускной трубопровод.
- С помощью приборной панели выберите трубопроводы, а затем выпускают.
- Нажмите на новую кнопку трубопровода.
- Выберите Добавить артефакт.
- Выберите «Создать в качестве типа источника», затем выберите строительный конвейер из выпадающего источника (сборки конвейера).
- Нажмите на добавить сцену.
- Выберите пустую работу.
- Нажмите значок +, затем выберите задачи развертывания службы приложений Azure.
- Выберите сервисное подключение к менеджеру ресурсов Azure, который вы ранее создали.
- Вернитесь на вкладку трубопроводов.
- Нажмите кнопку + икона, затем выберите задачу K6.
- Затем укажите как расположение теста вашего нагрузки, так и значения ваших переменных среды, ранее определенные в вашем скрипте.
- Чтобы заключить ваш трубопровод, щелкните значок + и выберите задачу результатов публикации.
- Выберите формат Junit, укажите путь, в котором находится ваш отчет, и включите возможность сделать файл трубопровода, если есть тестовые сбои.
Запустить тест
Чтобы запустить ваш трубопровод, нажмите кнопку «Создать новую версию» на верхней правой части экрана. Если вы включите триггер непрерывного развертывания, просто выполните коммит к вашему репозитории.
Как видите, мы сможем увидеть результат теста нагрузки как в консоли, так и в плане теста на Azure. В этом случае тест был успешным, а выпускной трубопровод продолжался. Если приложение не достигло критериев, настроенных в файле параметров теста нагрузки, весь трубопровод не удался. Из этой неудачи вы бы знали, что с ним что-то не так, прежде чем оно достигло производственной среды.
- Azure DevOps Общественный проект: https://dev.azure.com/GTRekter/Training
- Официальная документация K6: https://k6.io/
Оригинал: «https://dev.to/gtrekter/load-testing-with-azure-devops-and-k6-3j7c»