run method
Ejecuta el benchmark y retorna métricas
Implementation
@override
Future<BenchmarkResult> run() async {
final measurements = <Duration>[];
final uri = Uri.parse(endpoint);
for (int i = 0; i < iterations; i++) {
final stopwatch = Stopwatch()..start();
try {
// ✅ USAR HTTP NATIVO - El interceptor global los captura automáticamente
final client = http.Client();
late final http.Response response;
switch (httpMethod.toUpperCase()) {
case 'GET':
response = await client.get(uri, headers: headers);
break;
case 'POST':
response = await client.post(uri, headers: headers, body: requestBody);
break;
case 'PUT':
response = await client.put(uri, headers: headers, body: requestBody);
break;
default:
throw UnsupportedError('HTTP method $httpMethod not supported');
}
stopwatch.stop();
// Solo medir requests exitosos
if (response.statusCode >= 200 && response.statusCode < 300) {
measurements.add(stopwatch.elapsed);
}
client.close();
// Delay realista entre requests
await Future.delayed(const Duration(milliseconds: 25));
} catch (e) {
stopwatch.stop();
// Incluir errores en mediciones para reflejar overhead total
measurements.add(stopwatch.elapsed);
}
}
return BenchmarkResult(
testName: name,
iterations: iterations,
measurements: measurements,
metadata: {
'endpoint': endpoint,
'method': httpMethod,
'hasPayload': requestBody != null,
'payloadSize': requestBody?.length ?? 0,
'headerCount': headers?.length ?? 0,
'successfulRequests': measurements.length,
},
);
}