Referencia: POST /runs/ingest/junit
Endpoint para enviar un archivo JUnit XML a Qably: parámetros de consulta, la respuesta 202 y cómo se crean las ejecuciones.
Permite enviar archivos JUnit XML en formato original para su análisis en el servidor. Utiliza las mismas credenciales de autenticación que POST /runs/ingest.
Petición
El cuerpo de la petición contiene el archivo XML directo con cabecera Content-Type en application/xml o text/xml (hasta 10 MB). Los parámetros de configuración se transmiten mediante la cadena de consulta (query string).
| Parámetro de consulta | Obligatorio | Notas |
|---|---|---|
externalId | sí | Clave de idempotencia idéntica a POST /runs/ingest. |
source | no | "api" (valor por defecto) o "github_actions". |
suiteId / suiteName | no | Mismas reglas de resolución que en JSON. Si se omiten ambos, el nombre de la suite se toma del atributo name en <testsuite>. |
name | no | Si se omite, adopta el nombre de la suite del reporte. |
startedAt / finishedAt / commitSha / commitMessage / commitAuthor | no | Campos equivalentes a POST /runs/ingest. |
Ejemplo de petición
curl --fail --silent \
--request POST \
"https://api.qably.dev/runs/ingest/junit?externalId=ci-42" \
--header "Authorization: Bearer $QABLY_API_KEY" \
--header "Content-Type: application/xml" \
--data-binary @junit.xmlRespuesta
El endpoint responde 202 Accepted, a diferencia de POST /runs/ingest, que guarda la ejecución antes de responder: el reporte se analiza al recibirlo y cada ejecución se encola y se crea en segundo plano, por lo que puede tardar un momento en aparecer. El cuerpo de la respuesta incluye accepted (la cantidad de ejecuciones encoladas), runs (el externalId, el suiteName y el jobId de cada una), rejected (las suites que no pasaron la validación, con el motivo), caseIdentityCollisions y truncatedFields.
Una ejecución por suite
Cuando el XML contiene varios valores de <testsuite name="..."> y la petición no incluye suiteId ni suiteName, Qably crea una ejecución por cada nombre de suite distinto, y cada ejecución se asigna a la suite con ese nombre. Cada ejecución recibe su propio externalId, derivado como <externalId>-<slug>-<hash> (el nombre de la suite como slug más un hash corto), de modo que reenviar el mismo reporte actualiza las mismas ejecuciones. Si el XML tiene un solo nombre de suite, la ejecución conserva el externalId enviado. Para mantener todo el reporte en una sola ejecución, indique suiteId o suiteName.
Títulos de los casos y errores
El título de cada caso se extrae del atributo name en <testcase>, y se usa classname como valor de respaldo si name está ausente. Juntos, classname y name forman la identidad del caso. Los archivos con sintaxis XML inválida o cuerpos vacíos reciben una respuesta HTTP 400.