WEB-APP/ Optimization/ Build fix/ Hotkey edit mode/ Log rotation/ Form a11y/ E2E non-blocking
This commit is contained in:
Executable
+89
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
BASE_URL="${BASE_URL:-http://127.0.0.1:3004}"
|
||||
REQUESTS="${REQUESTS:-1000}"
|
||||
CONCURRENCY="${CONCURRENCY:-50}"
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${BLUE}═══════════════════════════════════════════${NC}"
|
||||
echo -e "${BLUE} Load Test — $BASE_URL${NC}"
|
||||
echo -e "${BLUE} $REQUESTS requests, $CONCURRENCY concurrent${NC}"
|
||||
echo -e "${BLUE}═══════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
|
||||
run_endpoint() {
|
||||
local name="$1"
|
||||
local path="$2"
|
||||
local method="${3:-GET}"
|
||||
local body="${4:-}"
|
||||
|
||||
echo -e "${YELLOW}▶ $name${NC} ($method $path)"
|
||||
local out
|
||||
if [ "$method" = "POST" ] && [ -n "$body" ]; then
|
||||
local tmpfile=$(mktemp)
|
||||
echo "$body" > "$tmpfile"
|
||||
out=$(ab -q -n "$REQUESTS" -c "$CONCURRENCY" -T "application/json" -p "$tmpfile" "$BASE_URL$path" 2>&1)
|
||||
rm -f "$tmpfile"
|
||||
else
|
||||
out=$(ab -q -n "$REQUESTS" -c "$CONCURRENCY" "$BASE_URL$path" 2>&1)
|
||||
fi
|
||||
|
||||
local rps=$(echo "$out" | awk '/Requests per second/ {print $4}')
|
||||
local p50=$(echo "$out" | awk '/^ 50%/ {print $2}')
|
||||
local p95=$(echo "$out" | awk '/^ 95%/ {print $2}')
|
||||
local p99=$(echo "$out" | awk '/^ 99%/ {print $2}')
|
||||
local failed=$(echo "$out" | awk '/^Failed requests/ {print $3}')
|
||||
local non200=$(echo "$out" | awk '/^Non-2xx responses/ {print $3}')
|
||||
|
||||
local status_text="OK"
|
||||
local status_color="$GREEN"
|
||||
if [ -n "$non200" ] && [ "$non200" -gt 0 ]; then
|
||||
status_text="FAIL (non-2xx: $non200)"
|
||||
status_color="$RED"
|
||||
elif [ -n "$failed" ] && [ "$failed" -gt "$((REQUESTS / 20))" ]; then
|
||||
status_text="FAIL (failed: $failed)"
|
||||
status_color="$RED"
|
||||
fi
|
||||
|
||||
echo -e " ${status_color}${status_text}${NC} ${rps:-?} rps | p50=${p50:-?}ms p95=${p95:-?}ms p99=${p99:-?}ms"
|
||||
echo ""
|
||||
}
|
||||
|
||||
if ! curl -s -o /dev/null -m 3 "$BASE_URL/api/health"; then
|
||||
echo -e "${RED}✗ Backend $BASE_URL не отвечает на /api/health${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✓ Backend жив${NC}"
|
||||
echo ""
|
||||
|
||||
run_endpoint "health" "/api/health"
|
||||
run_endpoint "landing page data" "/api/web/pages/landing"
|
||||
run_endpoint "tariffs public" "/api/tariffs/public"
|
||||
run_endpoint "site config" "/api/site-config"
|
||||
run_endpoint "flow default" "/api/flows/default"
|
||||
|
||||
echo -e "${YELLOW}▶ Rate limit stress test (register endpoint, same IP)${NC}"
|
||||
hit_counts=$(for i in $(seq 1 20); do
|
||||
curl -s -o /dev/null -w "%{http_code}\n" -X POST "$BASE_URL/api/auth/register" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"email":"loadtest@example.com","password":"testpass123"}' 2>/dev/null
|
||||
done | sort | uniq -c | sort -rn)
|
||||
echo "$hit_counts" | sed 's/^/ /'
|
||||
echo ""
|
||||
|
||||
if echo "$hit_counts" | grep -q "429"; then
|
||||
echo -e " ${GREEN}✓ Rate limit сработал (получено 429)${NC}"
|
||||
else
|
||||
echo -e " ${YELLOW}⚠ Rate limit не сработал (нет 429) — проверь Redis/конфиг${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${BLUE}═══════════════════════════════════════════${NC}"
|
||||
echo -e "${BLUE} Load test завершён${NC}"
|
||||
echo -e "${BLUE}═══════════════════════════════════════════${NC}"
|
||||
Reference in New Issue
Block a user