import http from "k6/http"; import { check, sleep } from "k6"; const BASE_URL = __ENV.BASE_URL || "http://localhost:3000"; export const options = { vus: 10, iterations: 100, thresholds: { http_req_duration: ["p(95)<30000"], }, }; /** TC-301:RPA P95 < 30s(需后端 RPA_MOCK_MODE=true) */ export default function rpaP95Test() { const customerId = `CUST_LOAD_${__VU}`; const headers = { "Content-Type": "application/json", "x-auth-type": "service", "x-customer-id": customerId, "x-permissions": "pricing:markup:write", }; const requestId = `00000000-0000-4000-8000-${String(__ITER).padStart(12, "0")}`; const body = JSON.stringify({ request_id: requestId, customer_id: customerId, pickup_address: { street: "1234 Warehouse Blvd", city: "Los Angeles", state: "CA", zip: "90001", place_id: "ChIJ_pickup", formatted_address: "1234 Warehouse Blvd, Los Angeles, CA 90001, USA", selected_from_suggestions: true, }, delivery_address: { street: "5678 Distribution Dr", city: "Dallas", state: "TX", zip: "75201", place_id: "ChIJ_delivery", formatted_address: "5678 Distribution Dr, Dallas, TX 75201, USA", selected_from_suggestions: true, }, weight: { value: 500, unit: "lb" }, dimensions: { length: 48, width: 40, height: 48, unit: "in" }, pallet_count: 2, cargo_type: "general_freight", }); const createRes = http.post(`${BASE_URL}/api/quotes`, body, { headers }); check(createRes, { "create 200": (r) => r.status === 200 }); if (createRes.status !== 200) { return; } const quoteId = createRes.json("data.quote_id"); if (!quoteId) { return; } const deadline = Date.now() + 35_000; while (Date.now() < deadline) { const pollRes = http.get(`${BASE_URL}/api/quotes/${quoteId}`, { headers }); if (pollRes.status === 200) { const status = pollRes.json("data.status"); if (status === "done" || status === "failed") { check(pollRes, { "poll terminal": () => true }); return; } } sleep(1); } }