Рефакторинг обработчиков. Финальное тестирование #21

This commit is contained in:
2026-05-18 14:37:59 +03:00
parent 40806df62a
commit 3abf5c94ee
21 changed files with 630 additions and 89 deletions

View File

@@ -0,0 +1,223 @@
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<clients>
<client host="localhost" use_controller_vm="true" maxusers="5000"/>
</clients>
<servers>
<server host="localhost" port="8080" type="tcp"/>
</servers>
<load>
<arrivalphase phase="1" duration="3" unit="minute">
<users interarrival="0.1" unit="second"/>
</arrivalphase>
</load>
<sessions>
<session name="eventhub_user" probability="100" type="ts_http">
<setdynvars sourcetype="random_number" start="1" end="9999999">
<var name="rand_id" />
</setdynvars>
<!-- 1. Регистрация -->
<request subst="true">
<http url="/v1/register" method="POST" content_type="application/json"
contents='{"email": "loadtest_%%_rand_id%%@example.com", "password": "testpassword123"}'/>
</request>
<thinktime min="1000" max="3000" random="true"/>
<!-- 2. Логин (извлекаем токен) -->
<request subst="true">
<dyn_variable name="token" re="(?:\{|,\s*)&quot;token&quot;\s*:\s*&quot;([^&quot;]+)"/>
<http url="/v1/login" method="POST" content_type="application/json"
contents='{"email": "loadtest_%%_rand_id%%@example.com", "password": "testpassword123"}'/>
</request>
<thinktime min="2000" max="5000" random="true"/>
<!-- 3. Создание календаря (с авто‑подтверждением бронирований) -->
<request subst="true">
<dyn_variable name="calendar_id" re="(?:\{|,\s*)&quot;id&quot;\s*:\s*&quot;([^&quot;]+)"/>
<http url="/v1/calendars" method="POST" content_type="application/json"
contents='{"title": "Tsung Calendar", "confirmation": "auto"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="3000" random="true"/>
<!-- 4. GET /v1/calendars/:id конкретный календарь -->
<request subst="true">
<http url="/v1/calendars/%%_calendar_id%%" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="500" max="2000" random="true"/>
<!-- 5. GET /v1/calendars/:id/view?month=2026-06 HTML-представление -->
<request subst="true">
<http url="/v1/calendars/%%_calendar_id%%/view?month=2026-06" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 6. Создание события -->
<request subst="true">
<dyn_variable name="event_id" re="(?:\{|,\s*)&quot;id&quot;\s*:\s*&quot;([^&quot;]+)"/>
<http url="/v1/calendars/%%_calendar_id%%/events" method="POST" content_type="application/json"
contents='{"title":"Tsung Event","start_time":"2027-01-01T10:00:00Z","duration":60}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="2000" max="4000" random="true"/>
<!-- 7. GET /v1/events/:id конкретное событие -->
<request subst="true">
<http url="/v1/events/%%_event_id%%" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="500" max="2000" random="true"/>
<!-- 8. Запись на событие -->
<request subst="true">
<dyn_variable name="booking_id" re="(?:\{|,\s*)&quot;id&quot;\s*:\s*&quot;([^&quot;]+)"/>
<http url="/v1/events/%%_event_id%%/bookings" method="POST" content_type="application/json"
contents='{}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 9. Подтверждение бронирования -->
<request subst="true">
<http url="/v1/bookings/%%_booking_id%%" method="PUT" content_type="application/json"
contents='{"action":"confirm"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="3000" random="true"/>
<!-- 10. GET /v1/bookings/:id конкретное бронирование -->
<request subst="true">
<http url="/v1/bookings/%%_booking_id%%" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="500" max="2000" random="true"/>
<!-- 11. Поиск -->
<request subst="true">
<http url="/v1/search?q=Tsung" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 12. Оставить отзыв (захватываем review_id) -->
<request subst="true">
<dyn_variable name="review_id" re="(?:\{|,\s*)&quot;id&quot;\s*:\s*&quot;([^&quot;]+)"/>
<http url="/v1/reviews" method="POST" content_type="application/json"
contents='{"target_type":"event","target_id":"%%_event_id%%","rating":5,"comment":"Excellent!"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 13. GET /v1/reviews/:id конкретный отзыв -->
<request subst="true">
<http url="/v1/reviews/%%_review_id%%" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="500" max="2000" random="true"/>
<!-- 14. Пожаловаться -->
<request subst="true">
<http url="/v1/reports" method="POST" content_type="application/json"
contents='{"target_type":"event","target_id":"%%_event_id%%","reason":"Spam"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 15. Создать тикет (захватываем ticket_id) -->
<request subst="true">
<dyn_variable name="ticket_id" re="(?:\{|,\s*)&quot;id&quot;\s*:\s*&quot;([^&quot;]+)"/>
<http url="/v1/tickets" method="POST" content_type="application/json"
contents='{"error_message":"Error during load test","stacktrace":"line 42"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 16. GET /v1/tickets/:id конкретный тикет -->
<request subst="true">
<http url="/v1/tickets/%%_ticket_id%%" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="500" max="2000" random="true"/>
<!-- 17. Активировать подписку -->
<request subst="true">
<http url="/v1/subscription" method="POST" content_type="application/json"
contents='{"action":"start_trial"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="2000" max="5000" random="true"/>
<!-- 18. GET /v1/subscription получить подписку -->
<request subst="true">
<http url="/v1/subscription" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="3000" random="true"/>
<!-- 19. GET /v1/user/me профиль -->
<request subst="true">
<http url="/v1/user/me" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 20. GET /v1/user/bookings свои бронирования -->
<request subst="true">
<http url="/v1/user/bookings" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 21. GET /v1/user/reviews свои отзывы -->
<request subst="true">
<http url="/v1/user/reviews" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="2000" random="true"/>
<!-- 22. GET /v1/calendars список календарей -->
<request subst="true">
<http url="/v1/calendars" method="GET">
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="2000" max="5000" random="true"/>
<!-- 23. Обновление токена -->
<request subst="true">
<http url="/v1/refresh" method="POST" content_type="application/json"
contents='{"refresh_token":"dummy"}'>
<http_header name="Authorization" value="Bearer %%_token%%"/>
</http>
</request>
<thinktime min="1000" max="3000" random="true"/>
</session>
</sessions>
</tsung>