Ir al contenido

API de importación de casos de prueba

Los endpoints de importación cargan un archivo exportado y luego lo confirman directamente en un proyecto — no hay paso de vista previa ni de simulación. Una confirmación exitosa crea (o reemplaza) casos de prueba y suites en una sola petición; cualquier fila que no se pudo importar se reporta individualmente, y el resto del archivo se importa igual.

Probara es la plataforma de reimportación predeterminada. Reimportar un archivo que esta API exportó previamente (ver la API de exportación) es el camino sin configuración: las exportaciones JSON, XML, CSV y XLSX pueden reimportarse cada una, y la importación conserva la fidelidad completa. También se aceptan exportaciones de Qase y TestRail, con una superficie de mapeo de campos más reducida (ver abajo). También se acepta un archivo Gherkin .feature como gherkin_feature, de un archivo por importación (ver Archivos Gherkin .feature).

Todas las peticiones requieren autenticación (token de API Bearer o cookie de sesión) con el permiso de importación/exportación (que tienen owner/admin/member). Los usuarios con rol viewer reciben 403 forbidden.

POST/api/v1/projects/{projectId}/imports:stage

{projectId} es el código del proyecto (por ejemplo ACME). El cuerpo de la petición es multipart/form-data con una única parte file que lleva el archivo exportado.

200 con:

{ "uploadUlid": "01J...", "byteSize": 4821, "filename": "acme-export.json" }

uploadUlid identifica el archivo cargado para la llamada de confirmación de abajo. Los archivos cargados no se conservan indefinidamente — confirma poco después de cargar.

EstadoCódigoCondición
403forbiddenEl rol del llamante es viewer
413file_too_largeEl archivo subido supera IMPORT_MAX_FILE_BYTES (10 MB)
422validation_failedLa petición no lleva ninguna parte file
429too_many_requestsSe superó el límite de tasa de carga de la organización
POST/api/v1/projects/{projectId}/imports/commit
{
"uploadUlid": "01J...",
"sourceFormat": "probara_json",
"targetSuiteUlid": null,
"replaceMatching": false
}
CampoNotas
uploadUlidEl valor devuelto por la llamada de carga anterior.
sourceFormatUno de probara_json, probara_xml, probara_csv, probara_xlsx, qase_xml, qase_json, qase_csv, qase_xlsx, testrail_xml, testrail_csv, gherkin_feature. El asistente web resuelve este valor automáticamente a partir de la extensión/contenido del archivo subido — un integrador que llama a la API directamente debe establecerlo explícitamente.
targetSuiteUlidnull importa debajo de la raíz del proyecto; en otro caso, la jerarquía de suites del archivo se recrea debajo de la suite indicada.
replaceMatchingCuando es true, un caso del origen cuyo título coincida exactamente con un caso existente en la suite destino sobrescribe el contenido de ese caso en lugar de crear un duplicado.

200 con el reporte de la confirmación:

{
"counts": {
"suitesCreated": 2,
"casesCreated": 8,
"casesReplaced": 1,
"rowsFailed": 0,
"reviewRequestsCreated": 0
},
"created": [{ "caseUlid": "01J...", "displayId": "ACME-42", "title": "Login succeeds" }],
"replaced": [],
"reviewRequests": [],
"failures": [],
"warnings": []
}

failures lista las filas que no se importaron (el resto del archivo sí se confirmó); warnings lista filas que sí se importaron pero con un aviso no crítico — ver abajo.

Cuando la revisión de casos de prueba del proyecto es obligatoria (plan Pro o Enterprise), la confirmación no escribe ningún caso. Las suites se crean; cada caso que la importación crearía se convierte en una solicitud de revisión create, y cada caso que reemplazaría en una solicitud update, con quien llama como autor y los revisores por defecto del proyecto. casesCreated y casesReplaced valen 0, reviewRequestsCreated cuenta las solicitudes y reviewRequests las lista:

{
"reviewRequests": [
{
"reviewUlid": "01J...",
"displayId": "RV-7",
"kind": "update",
"caseUlid": "01J...",
"title": "Login succeeds"
},
{
"reviewUlid": "01J...",
"displayId": "RV-8",
"kind": "create",
"caseUlid": null,
"title": "Signup works"
}
]
}

Un caso solo se escribe cuando se fusiona su solicitud, con la misma validación que POST .../test-cases (por ejemplo, los campos personalizados obligatorios deben tener un valor). Igual que la importación directa, la confirmación no es todo o nada: las solicitudes abiertas antes de un fallo posterior siguen abiertas.

Reimportación de Probara: fidelidad completa

Sección titulada «Reimportación de Probara: fidelidad completa»

Reimportar una exportación de Probara (cualquiera de los cuatro formatos) mapea de vuelta todos los campos de clasificación del sistema — prioridad, severidad, estado, tipo, capa, comportamiento, es inestable (flaky), precondiciones y poscondiciones — además de cada valor de campo personalizado definido por el usuario que ya exista, emparejado automáticamente por nombre (título para JSON/XML, encabezado de columna convertido a slug para CSV/XLSX). Los pasos, etiquetas, descripción y ruta de suite siempre se conservan íntegramente sin importar la plataforma de origen. También se conservan el formato de pasos del caso y la palabra clave Gherkin de cada paso.

Nunca se crea un campo ni una opción al importar. Cada coincidencia se resuelve contra los campos personalizados y las opciones existentes de la organización en el momento de confirmar — no hay carga de mapeo de campos en la petición, ni un paso de vinculación interactivo. Esto hace que la reimportación sea segura de ejecutar repetidamente (por ejemplo, para restaurar un respaldo o migrar casos entre proyectos) sin contaminar el esquema del proyecto.

Los parámetros y las combinaciones excluidas del caso también hacen el viaje de ida y vuelta. CSV y XLSX los llevan en dos columnas JSON, parameters y excluded_combinations, después de las columnas de campos personalizados; JSON y XML los llevan como parameters y excludedCombinations. Las columnas y las claves solo aparecen cuando un caso tiene parámetros o combinaciones excluidas, así que una exportación sin ellos no cambia. Un parámetro compartido vuelve como parámetro local con los valores que tenía. Los nombres parameters y excluded_combinations están reservados: un campo personalizado con cualquiera de esos títulos no importa sus valores. Un archivo de Probara o .feature que no trae parámetros borra los parámetros del caso que reemplaza, mientras que un archivo de Qase o TestRail, que no los trae, los conserva.

Las exportaciones de Qase y TestRail mapean un conjunto más reducido — solo prioridad, tipo y estado. Los campos personalizados definidos por el usuario no se mapean para esas dos plataformas. Un archivo Gherkin .feature no mapea campos del sistema ni personalizados; sus etiquetas y suites se importan.

La clave de automatización del caso también hace el viaje de ida y vuelta. Un caso reemplazado conserva su clave actual cuando el archivo no trae ninguna, y una clave vacía o solo con espacios la borra. Una clave que la importación no puede aplicar — porque ya la tiene otro caso del proyecto (incluidos los archivados), la repite una fila anterior del mismo archivo o no es válida — nunca hace fallar la fila: el caso se importa sin ella y el informe incluye un aviso automation_key_skipped. Las claves se comprueban contra el proyecto tal como estaba antes de la importación, así que una clave que el mismo archivo quita de un caso no puede asignarse a otro en esa importación.

Comportamiento ante campos y opciones desconocidos

Sección titulada «Comportamiento ante campos y opciones desconocidos»

Una importación nunca falla una fila solo porque el valor de un campo no se pudo mapear — en su lugar, confirma el caso y registra un aviso:

Código de avisoSignificado
unmapped_valueUn valor de opción del sistema o definido por el usuario no coincidió con ninguna opción existente, y el campo no tiene un valor predeterminado configurado — el campo queda sin asignar.
defaulted_valueIgual que el anterior, pero el campo tiene una opción predeterminada configurada — el campo usa esa opción predeterminada.
unmapped_fieldEl título de un campo definido por el usuario (o el slug de una columna CSV/XLSX) no coincidió con ningún campo existente en el proyecto — el valor se omite, no se crea nada.
automation_key_skippedLa clave de automatización ya la usa otro caso del proyecto, la repite una fila anterior o no es válida — el caso se importa sin ella.
shared_step_skippedEl caso hacía referencia a un paso compartido cuyo texto el archivo no incluye — esa referencia se omite y el caso importa sus demás pasos.
step_format_foldedLos pasos del caso no encajan con su formato indicado: un paso Gherkin sin palabra clave o con resultado esperado, o un paso clásico con palabra clave. El caso se importa como clásico, con cada palabra clave al inicio de su acción.
parameters_skippedLos parámetros del archivo incumplen una regla de parámetros, como un nombre o una fila repetidos, o más de 100 valores en un parámetro simple — el caso se importa sin ellos. Un reemplazo conserva los parámetros existentes del caso, y los Examples de un archivo .feature no se conservan.
image_reference_droppedUn paso, una descripción o un valor de párrafo menciona una imagen que no está guardada en esta organización, como en un archivo exportado desde otra organización — esa imagen se quita y el resto del texto se importa.

Cada fila fallida y cada aviso nombra la sourceRow y el title del caso afectado, de modo que una importación parcialmente exitosa se puede diagnosticar por completo solo con la respuesta.

Una fila falla (y su caso no se importa) solo por estas razones — cualquier otro desajuste de valor pertenece a la familia de avisos de arriba, nunca a un fallo:

CódigoCondición
missing_titleLa fila no tiene título.
ambiguous_matchreplaceMatching está activo y el título coincide con más de un caso existente en la suite destino.
review_already_openSolo con revisión obligatoria: el caso que la fila reemplazaría ya tiene una solicitud de revisión abierta.
review_proposal_invalidSolo con revisión obligatoria: el contenido de la fila no puede ser una solicitud de revisión (por ejemplo, un título de más de 400 caracteres o un paso sin acción).

Carga un archivo .feature como de costumbre y luego confírmalo con sourceFormat en gherkin_feature. El archivo debe contener un único Feature, escrito con palabras clave en inglés. Cada Scenario y cada Scenario Outline se convierte en un caso Gherkin dentro de una suite con el nombre del Feature, y una Rule añade una suite anidada. El Background pasa a ser las precondiciones del caso. Las etiquetas pasan a ser etiquetas de Probara, y las del Feature y las de la Rule se aplican a cada escenario que contienen. Los Examples de un Scenario Outline se convierten en un único parámetro llamado Examples: los encabezados de sus tablas forman las columnas, en el orden en que aparecen por primera vez, y se conserva cada fila, en orden, con una celda vacía donde una tabla no tiene esa columna. Una tabla de una sola columna se convierte en un parámetro simple con el nombre de su encabezado. Varios bloques Examples se fusionan en ese parámetro, y sus nombres y etiquetas no se conservan. Cuando los Examples incumplen una regla de parámetros, el caso se importa sin ellos y el informe incluye un aviso parameters_skipped. La exportación .feature escribe los parámetros de un caso de vuelta como una tabla Examples, con una fila por cada combinación que el caso ejecuta. Una sincronización Gherkin rechaza ese escenario con 422, porque la sincronización no informa avisos. La descripción del Feature o de la Rule no se importa. Un archivo que el analizador no puede leer falla con 422 parse_failed, y su mensaje indica la línea. La guía de casos de prueba Gherkin describe el mismo mapeo para clientes. Los archivos .feature de un repositorio pueden mantenerse sincronizados en su lugar con la sincronización Gherkin, para que sus casos sigan a los archivos.

Una importación está acotada a IMPORT_MAX_CASES (5000) casos analizados y IMPORT_MAX_FILE_BYTES (10 MB) de bytes cargados. Un archivo que supere cualquiera de los dos límites se rechaza antes de escribir cualquier suite o caso.

Tanto la carga como la confirmación están limitadas por organización (10 peticiones/hora cada una). Superar el límite devuelve 429 con { "error": { "code": "too_many_requests", ... } }.

Markdown no es un formato de importación admitido

Sección titulada «Markdown no es un formato de importación admitido»

Markdown nunca ha sido, ni es, un formato de origen importable. El asistente rechaza un archivo .md del lado del cliente con un error en línea traducido; un integrador que carga un archivo .md y trata de confirmarlo con cualquier sourceFormat recibe 422 parse_failed — el archivo no se podrá analizar como el formato declarado.

EstadoCódigoCondición
403forbiddenEl rol del llamante es viewer
404not_foundprojectId, targetSuiteUlid, o el uploadUlid cargado no se resuelve en la organización activa
413file_too_largeLos bytes cargados superan IMPORT_MAX_FILE_BYTES (nueva verificación de refuerzo al confirmar)
422parse_failedLos bytes cargados no se analizaron como el sourceFormat declarado, o la jerarquía de suites anida demasiado; para gherkin_feature, el mensaje indica la línea que falló
422empty_importEl archivo se analizó y arrojó cero casos
422too_many_casesLa cantidad de casos analizados supera IMPORT_MAX_CASES
429too_many_requestsSe superó el límite de tasa de importación de la organización

Carga un archivo y luego confírmalo como una reimportación de Probara en JSON:

Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-F "file=@acme-export.json" \
"https://app.probara.net/api/v1/projects/ACME/imports:stage"
Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"uploadUlid":"01J...","sourceFormat":"probara_json","targetSuiteUlid":null,"replaceMatching":false}' \
"https://app.probara.net/api/v1/projects/ACME/imports/commit"