Провести комплексное нагрузочное тестирование веб-приложения, используя инструменты Locust (Python) и K6 (JavaScript)
Запустить проверяемое приложение (API на Flask):
import time
import random
from flask import Flask, jsonify, request
app = Flask(__name__)
posts = [
{"id": 1, "author": "Admin", "title": "First Post", "content": "Hype Rocks!"},
{"id": 2, "author": "User1", "title": "Another One", "content": "Totally agree"},
]
next_id = 3
@app.route("/posts", methods=['GET'])
def get_posts():
return jsonify(posts)
@app.route("/posts/<int:post_id>", methods=['GET'])
def get_post(post_id):
post = next((p for p in posts if p["id"] == post_id), None)
if post:
time.sleep(random.uniform(0.1, 0.3))
return jsonify(post)
return jsonify({"error": "Post not found"}), 404
@app.route("/posts", methods=['POST'])
def create_post():
global next_id
if not request.json or not 'title' in request.json or not 'author' in request.json:
return jsonify({"error": "Bad"}), 400
time.sleep(random.uniform(0.5, 1.5))
new_post = {
"id": next_id,
"author": request.json['author'],
"title": request.json['title'],
"content": request.json.get('content', "")
}
posts.append(new_post)
next_id += 1
return jsonify(new_post), 201
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
Установить Locust и K6
Создать класс BlogUser
Реализовать последовательный сценарий:
пользователь авторизуется (метод on_start), генерируя себе имя (self.username = f"user_{uuid.uuid4()}")
пользователь создает новый пост (POST /posts), используя свое self.username в качестве автора
пользователь извлекает id из JSON-ответа на создание поста
пользователь читает только что созданный им пост (GET /posts/<id>), используя id поста
Следует использовать SequentialTaskSet
Добавить задачи на чтение (GET /posts и GET /posts/1) и сбалансируйте все задачи весами
id (как одна задача): 1id=1: 3Запустить тест в веб-интерфейсе Locust:
Реализовать сценарий смешанной нагрузки:
GET /postsPOST /postsДобавить проверки для каждого запроса:
GET /posts должен возвращать status 200POST /posts должен возвращать status 201Задать строгие критерии прохождения теста:
checks < 0.01 (доля проваленных проверок < 1%)http_req_duration{name: "GET /posts"}{p(95) < 500} (p95 для чтения списка < 500 мс)http_req_duration{name: "POST /posts"}{p(95) < 2000} (p95 для создания поста < 2 с)Задать профиль нагрузки:
stage 1: плавный рост до 50 VUs за 1 минутуstage 2: удержание 50 VUs в течение 1 минутыstage 3: плавное снижение до 0 VUs за 30 секундЗапустить тест и проанализировать сводку
Locust и для K6)Locust и произвести нагрузочное тестирование