Ir al contenido

API de planes de prueba

Los planes de prueba son colecciones de casos de prueba seleccionados dentro de un proyecto. Cada plan contiene una selección ordenada de casos activos; desde esa selección puedes generar una ejecución de prueba que toma una instantánea de los casos en el momento de la generación. Cada plan tiene un ULID asignado por el servidor, un número de plan asignado de forma monotónica dentro del proyecto y una descripción opcional.

POST/api/v1/projects/{projectId}/plans

{projectId} es el código del proyecto (por ejemplo, ACME).

CampoRequeridoNotas
nameCadena no vacía, máximo 200 caracteres. Debe ser único entre los planes activos del proyecto
descriptionnoDescripción en texto libre, máximo 2000 caracteres
statusnoEstado inicial: draft, active o completed. Por defecto es draft si se omite

Los campos ulid o planNumber provistos por el cliente son rechazados. Un nombre duplicado entre planes activos del proyecto devuelve 409 conflict. Campos faltantes o inválidos devuelven 422 validation_failed.

201 con el objeto del plan creado. Ver Campos de respuesta.

Ventana de terminal
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Sprint 24","description":"Lanzamiento de funcionalidad"}' \
"https://probara.net/api/v1/projects/ACME/plans"
GET/api/v1/projects/{projectId}/plans

Devuelve los planes activos (no eliminados) del proyecto, ordenados por número de plan ascendente. Paginación por página.

ParámetroNotas
pageNúmero de página (base 1, valor predeterminado 1)
pageSizeElementos por página (predeterminado 20, máximo 200)

200 con { items, page, pageSize, total }. Cada elemento sigue la estructura de respuesta.

Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/projects/ACME/plans?page=1&pageSize=20"
GET/api/v1/plans/{planUlid}

Devuelve un plan activo perteneciente a la organización activa, incluyendo el conteo actual de casos.

Devuelve 404 not_found cuando el plan está fuera de la organización activa o ha sido eliminado.

Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000"
PATCH/api/v1/plans/{planUlid}

Actualiza uno o más campos de un plan activo. Se debe proporcionar al menos un campo. Un nombre duplicado devuelve 409 conflict.

CampoRequeridoNotas
namenoNuevo nombre (máximo 200 caracteres). Debe ser único entre planes activos del proyecto
descriptionnoDescripción actualizada (máximo 2000 caracteres). Enviar null para borrarla
statusnoNuevo estado del ciclo de vida: draft, active o completed. Cualquier transición entre estados distintos es válida. Enviar el estado actual del plan es un no-op (aceptado, sin evento). Un valor de estado inválido devuelve 422 validation_failed
milestoneIdnoULID de un hito activo del mismo proyecto para vincular, o null para borrar el vínculo existente. Un ULID que no corresponde a un hito activo del proyecto del plan devuelve 404 not_found y deja el plan sin cambios. Un hito de otro proyecto u organización también es 404 not_found

Un cuerpo vacío (sin campos) devuelve 422 validation_failed.

200 con el objeto del plan actualizado. Ver Campos de respuesta.

  • Todas las transiciones entre draft, active y completed son válidas en cualquier dirección.
  • No hay estados terminales: un plan completed puede volver a active o draft.
  • Un PATCH con el mismo valor de estado (el campo status coincide con el estado actual del plan) se acepta como no-op — no se registra ningún cambio de estado y el plan devuelve 200 sin modificaciones.
  • Un valor de estado inválido (que no sea uno de los tres valores válidos) devuelve 422 validation_failed.
  • El estado es estrictamente manual: la API nunca avanza el estado de un plan automáticamente según el estado de sus ejecuciones.
Ventana de terminal
# Cambiar el estado a activo
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"active"}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000"
Ventana de terminal
# Vincular un hito
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"milestoneId":"01HZMILESTONE0000000000000"}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000"
Ventana de terminal
# Borrar el vínculo de hito
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"milestoneId":null}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000"
Ventana de terminal
# Combinado: renombrar y marcar como completado
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Sprint 25 Final","status":"completed"}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000"
DELETE/api/v1/plans/{planUlid}

Elimina el plan de forma lógica. El plan deja de aparecer en la lista y su nombre queda disponible para reutilizarse. Las ejecuciones generadas a partir del plan no se ven afectadas.

Devuelve 204 en caso de éxito, 404 not_found si no se encuentra.

Ventana de terminal
curl -sS -X DELETE \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000"
PUT/api/v1/plans/{planUlid}/cases

Semántica de reemplazo total: la selección completa se reemplaza por la lista ordenada de ULIDs de casos proporcionada. Omitir un caso de la lista lo elimina; enviarlo en una posición diferente lo mueve. Envía un array caseUlids vacío para vaciar la selección.

Opcionalmente puedes asignar un miembro del equipo a cada caso en la misma llamada enviando caseAssignees. Las entradas cuyo caseUlid no aparezca en caseUlids se ignoran silenciosamente. La resolución de todos los responsables ocurre antes de que se reemplace la selección: un assigneeUlid inválido deja la selección actual sin cambios.

CampoRequeridoNotas
caseUlidsArray ordenado de ULIDs de casos activos. Los ULIDs duplicados son rechazados (422). Los casos deben pertenecer al proyecto del plan
caseAssigneesnoArray de pares { caseUlid, assigneeUlid }. Cada assigneeUlid debe ser miembro de la organización activa — un assigneeUlid de otra organización devuelve 404 not_found y deja la selección sin cambios. Las entradas cuyo caseUlid no aparezca en caseUlids se ignoran. Omitir este campo (o no incluir una entrada para un caso en particular) almacena ese caso sin responsable

Devuelve 404 not_found si algún ULID no corresponde a un caso activo del proyecto o si algún assigneeUlid no es miembro de la organización. Devuelve 422 validation_failed por ULIDs duplicados.

200 con { items } — la nueva selección en orden de posición. Ver Campos de elemento de selección.

Ventana de terminal
curl -sS -X PUT \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"caseUlids":["01HZCASEA","01HZCASEB","01HZCASEC"]}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/cases"

Ejemplo — selección con responsables por caso

Sección titulada «Ejemplo — selección con responsables por caso»
Ventana de terminal
curl -sS -X PUT \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"caseUlids": ["01HZCASEA","01HZCASEB","01HZCASEC"],
"caseAssignees": [
{ "caseUlid": "01HZCASEA", "assigneeUlid": "01HZMEMBER000000000000000001" },
{ "caseUlid": "01HZCASEB", "assigneeUlid": "01HZMEMBER000000000000000002" }
]
}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/cases"

01HZCASEC no tiene entrada en caseAssignees y se almacena sin responsable.

Actualizar el responsable de un caso del plan

Sección titulada «Actualizar el responsable de un caso del plan»
PATCH/api/v1/plans/{planUlid}/cases/{planCaseUlid}

Actualiza el responsable de un único caso del plan sin modificar el resto de la selección. Este endpoint es la actualización en línea por caso — no reemplaza la lista de casos del plan.

Semántica de instantánea: actualizar el responsable de un caso del plan no se propaga a ninguna ejecución ya generada desde el plan. Los casos de ejecución existentes conservan el responsable que tenían en el momento en que se generó la ejecución.

ParámetroDescripción
planUlidULID del plan
planCaseUlidULID de la fila del caso en el plan (el campo ulid de un elemento de selección, no el ULID del caso de prueba)
CampoRequeridoNotas
assigneeUlidULID de un miembro activo de la organización, o null para quitar el responsable

El cuerpo debe contener exactamente una clave. Las claves desconocidas devuelven 422 validation_failed.

200 con el objeto del caso del plan actualizado (misma estructura que un elemento de selección). Ver Campos de elemento de selección.

EstadoCódigoCuándo
403 ForbiddenEl llamante tiene rol viewer
404 Not Foundnot_foundplanUlid o planCaseUlid no existe o pertenece a otra organización
404 Not Foundnot_foundassigneeUlid no corresponde a un miembro activo de la organización
422 Unprocessable Entityvalidation_failedClave assigneeUlid faltante, valor que no es ULID, o clave desconocida
Ventana de terminal
# Asignar un responsable a un caso del plan
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"assigneeUlid":"01HZMEMBER000000000000000001"}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/cases/01HZPLANCASE000000000000000"
# Quitar el responsable (enviar null)
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"assigneeUlid":null}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/cases/01HZPLANCASE000000000000000"
GET/api/v1/plans/{planUlid}/cases

Devuelve la selección actual de casos del plan, ordenada por posición ascendente.

200 con { items }. Ver Campos de elemento de selección.

Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/cases"
PUT/api/v1/plans/{planUlid}/configurations

Semántica de reemplazo total: la selección completa de configuraciones del plan se reemplaza por la lista de ULIDs de valores de configuración proporcionada. Envía un array configurationUlids vacío para vaciar la selección.

Cada ULID proporcionado debe corresponder a un valor de configuración activo (no eliminado) en el proyecto del plan. Un ULID no resuelto, eliminado de forma lógica o de otro proyecto devuelve 404 not_found y deja la selección sin cambios. Los ULIDs duplicados en la solicitud devuelven 422 validation_failed.

CampoRequeridoNotas
configurationUlidsArray de ULIDs de valores de configuración activos. Los duplicados son rechazados (422). Los valores deben pertenecer al proyecto del plan

200 con { items } — la nueva selección de configuraciones. Ver Campos de elemento de configuración.

Ventana de terminal
curl -sS -X PUT \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"configurationUlids":["01HZCHROME000000000000000000","01HZWINDOWS00000000000000000"]}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/configurations"
GET/api/v1/plans/{planUlid}/configurations

Devuelve la selección de configuraciones actual del plan — el conjunto de ULIDs de valores de configuración que el plan usa para calcular su matriz de combinaciones.

200 con { items }. Ver Campos de elemento de configuración.

Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/configurations"
PUT/api/v1/plans/{planUlid}/excluded-combinations

Semántica de reemplazo total: las claves de combinación excluidas del plan se reemplazan exactamente por el conjunto proporcionado. Una comboKey que no coincide con ninguna combinación candidata actual es aceptada y almacenada como exclusión inerte — no genera un error.

CampoRequeridoNotas
comboKeysArray de cadenas de clave de combinación. Una clave de combinación es la lista de ULIDs de valores de configuración de la combinación, ordenados de forma ascendente y unidos con : (por ejemplo, 01HZCHROME:01HZWINDOWS). Los duplicados son rechazados (422). Envía un array vacío para borrar todas las exclusiones

200 con { comboKeys } — el nuevo conjunto de claves de combinación excluidas del plan.

Ventana de terminal
curl -sS -X PUT \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"comboKeys":["01HZFIREFOX0000000000000000:01HZWINDOWS00000000000000000"]}' \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/excluded-combinations"
GET/api/v1/plans/{planUlid}/combinations

Devuelve las combinaciones candidatas calculadas como el producto cartesiano de la selección de configuraciones actual del plan (un valor por grupo participante). Cada combinación incluye su comboKey, los valores por grupo ordenados por posición de grupo, y un indicador included (false cuando la comboKey está en el conjunto de excluidas del plan). La respuesta también devuelve el total de combinaciones candidatas y el conteo de combinaciones incluidas.

Un plan sin selección de configuraciones devuelve exactamente una combinación candidata (la combinación vacía, totalCount = 1, includedCount = 1).

200 con:

CampoTipoNotas
itemsarrayObjetos de combinación candidata. Ver Campos de elemento de combinación
totalCountnumberNúmero total de combinaciones candidatas (incluyendo las excluidas)
includedCountnumberNúmero de combinaciones con included = true
Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/plans/01HZPLANULID00000000000000/combinations"

No existe POST /api/v1/plans/{planUlid}/runs. Para crear una ejecución para un plan, usa POST /api/v1/projects/{projectId}/runs, pasando planUlid y, si el plan tiene configuraciones, los configurationUlids de la combinación. Esta llamada siempre crea exactamente una ejecución — vincula un plan, siembra sus casos y etiqueta una combinación, todo en una sola solicitud. Para cubrir varias combinaciones, llama una vez por combinación.

Cuando se envía planUlid y se omite caseUlids, la selección de casos de la ejecución y sus responsables por caso se siembran desde la selección actual del plan, siguiendo esta precedencia (gana la primera coincidencia):

  1. Una entrada explícita por caso en caseAssignees (del cuerpo de la solicitud)
  2. El responsable almacenado por caso en el plan para ese caso
  3. defaultAssigneeUlid del cuerpo de la solicitud
  4. Sin responsable (null)

Un responsable del plan que ya no es miembro de la organización en el momento de la solicitud resulta en null (sin responsable) sin que la solicitud falle.

Ventana de terminal
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Smoke — Chrome","planUlid":"01HZPLANULID00000000000000","configurationUlids":["01HZCFGVALCHROME0000000000"]}' \
"https://probara.net/api/v1/projects/PROJ/runs"

Las ejecuciones del plan se listan de la más reciente a la más antigua mediante GET /api/v1/plans/{planUlid}/runs.

El detalle del plan (GET /api/v1/plans/{planUlid}) y la respuesta del PATCH devuelven el objeto completo del plan. La lista de planes (GET /api/v1/projects/{projectId}/plans) devuelve la misma estructura por elemento pero omite progress.

CampoTipoNotas
ulidstringULID asignado por el servidor para el plan
projectUlidstringULID del proyecto al que pertenece el plan
planNumbernumberNúmero asignado de forma monotónica dentro del proyecto
namestringNombre del plan
descriptionstring | nullDescripción opcional
authorobject | nullInstantánea de autoría (ver más abajo). null para registros heredados
caseCountnumberCantidad actual de casos activos en la selección
statusstringEstado actual del ciclo de vida: draft, active o completed
milestoneUlidstring | nullULID del hito vinculado, o null cuando no hay hito vinculado
milestoneobject | nullReferencia al hito vinculado ({ ulid, name }), o null cuando no hay hito vinculado
progressobjectResumen de progreso calculado (solo en el detalle y en la respuesta del PATCH — ver más abajo)
createdAtnumberMarca de tiempo de creación (milisegundos epoch Unix)
updatedAtnumberMarca de tiempo de última actualización (milisegundos epoch Unix)
CampoTipoNotas
kind"user" | "api_token"Cómo fue creado el plan
ulidstringULID del usuario o token de API
displayNamestringNombre para mostrar (solo tipo usuario)
avatarKeystring | nullClave del objeto de avatar (solo tipo usuario)
namestringNombre del token (solo tipo api_token)

progress se calcula en el momento de la lectura a partir de las ejecuciones del plan. Está presente en el detalle del plan (GET /api/v1/plans/{planUlid}) y en la respuesta del PATCH. La lista de planes no incluye progress.

CampoTipoNotas
totalRunsnumberNúmero total de ejecuciones generadas desde este plan
closedRunsnumberCantidad de esas ejecuciones que están en estado closed
countsobjectConteos de resultados generales sumados de todas las ejecuciones del plan (ver más abajo)
byConfigurationarrayFilas del desglose por configuración (ver más abajo). Vacío cuando el plan no tiene ejecuciones

Conteos de resultados (counts y counts por fila de desglose)

Sección titulada «Conteos de resultados (counts y counts por fila de desglose)»
CampoTipoNotas
passednumberSuma de resultados pasados
failednumberSuma de resultados fallidos
blockednumberSuma de resultados bloqueados
skippednumberSuma de resultados omitidos
untestednumberSuma de resultados sin probar (pendientes)

Estos valores se suman a partir de los contadores por estado que se mantienen en cada fila de test_run. No se hace un re-análisis de los resultados individuales en el momento de la lectura.

Desglose por configuración (elementos de byConfiguration)

Sección titulada «Desglose por configuración (elementos de byConfiguration)»

Cada elemento de byConfiguration corresponde a una combinación de configuración (o al grupo sin configuración):

CampoTipoNotas
comboKeystringClave de combinación: los ULIDs de valores de configuración de la ejecución ordenados de forma ascendente y unidos con :. Cadena vacía ("") para el grupo sin configuración (ejecuciones sin etiquetas de configuración)
valuesarrayEntradas de valor por grupo ordenadas ({ groupName, valueName }). Array vacío para el grupo sin configuración
totalRunsnumberNúmero de ejecuciones en esta combinación
closedRunsnumberNúmero de esas ejecuciones que están cerradas
countsobjectConteos de resultados para esta combinación (misma estructura que counts a nivel general)

La suma de todos los byConfiguration[*].counts es igual al counts de nivel general. Las ejecuciones sin etiquetas de configuración aparecen en un único grupo sin configuración (con comboKey vacío y values vacío).

Devueltos por GET /plans/{planUlid}/cases y PUT /plans/{planUlid}/cases.

CampoTipoNotas
ulidstringULID asignado por el servidor para la fila de selección
caseUlidstringULID del caso de prueba referenciado
displayIdstringID de visualización del caso (por ejemplo, TC-42)
titlestringTítulo actual del caso de prueba
suiteNamestring | nullNombre del conjunto para agrupar, o null
positionnumberPosición dentro de la selección del plan (base 0)
assigneeUlidstring | nullULID del miembro asignado a este caso en el plan, o null cuando el caso no tiene responsable

Cada elemento en las respuestas de GET /plans/{planUlid}/configurations y PUT /plans/{planUlid}/configurations:

CampoTipoNotas
configurationUlidstringULID del valor de configuración
groupUlidstringULID del grupo de configuración al que pertenece este valor
groupNamestringNombre del grupo (por ejemplo, Navegador)
valueNamestringNombre del valor (por ejemplo, Chrome)

Cada elemento en la respuesta de GET /plans/{planUlid}/combinations:

CampoTipoNotas
comboKeystringClave de combinación determinista: los ULIDs de valores de configuración de la combinación ordenados de forma ascendente y unidos con :. Usa esta clave en PUT /excluded-combinations para excluir la combinación
valuesarrayEntradas de valor por grupo, ordenadas por posición de grupo. Cada entrada contiene groupUlid, groupName, configurationUlid y valueName
includedbooleantrue cuando esta combinación no está en el conjunto de excluidas del plan; false cuando está excluida