# Guía de importación CSV

> Crea o adapta un CSV que Probara importe sin errores: cada columna, cada separador y los errores que tumban un archivo entero.

La mayoría de los casos de prueba llegan en una hoja de cálculo, no con la forma de Probara. Esta guía trata del único formato que puedes construir a mano: el **CSV de Probara**, el mismo archivo que Probara exporta y vuelve a leer. Es también el formato al que conviene recurrir cuando migras desde una herramienta cuyo export Probara no entiende, porque un CSV que controlas tú es un CSV que puedes dejar bien.

Una importación no es una lectura aproximada. Probara lee tu archivo fila por fila contra una estructura fija, así que una columna renombrada, una cabecera que falta o un separador equivocado pueden hacer fallar el archivo entero antes de crear un solo caso. Cada sección cubre una parte de esa estructura.

| Pregunta                           | Respuesta                                                                               |
| ---------------------------------- | --------------------------------------------------------------------------------------- |
| ¿De qué formato habla esta guía?   | Del **CSV de Probara**, el archivo que Probara exporta y reimporta.                     |
| ¿Cuál es el archivo válido mínimo? | Una fila de cabecera más una fila cuya primera celda es el título de un caso.           |
| ¿Cómo escribo varios pasos?        | Una fila por paso; las filas siguientes a la primera dejan `title` vacío.               |
| ¿Cómo escribo una ruta de suites?  | `Catalog/Product detail`: los niveles se unen con `/`.                                  |
| ¿Cómo escribo varias etiquetas?    | `smoke;checkout;e2e`: se separan con `;`, nunca con una coma.                           |
| ¿Cómo escribo un caso Gherkin?     | `step_format` = `gherkin` en su primera fila, y un `step_keyword` en cada fila de paso. |
| ¿Hay un archivo del que partir?    | Sí: [descarga el CSV de ejemplo](#descarga-el-csv-de-ejemplo), una exportación real.    |

## Descarga el CSV de ejemplo

**[⬇ Descargar el CSV de ejemplo](https://drive.google.com/file/d/1Th-sujbKRj2mAHJbpfI0jcTN0XE-hmrG/view?usp=sharing)** — una exportación real de un repositorio de comercio electrónico pequeño: 21 casos repartidos en 4 suites de primer nivel y 3 de sus hijas, 52 pasos y todos los campos del sistema rellenados — prioridad, severidad, estado, tipo, capa, comportamiento, estado de automatización, precondiciones, postcondiciones y flaky — además de etiquetas, rutas de suite y claves de automatización.

No es una maqueta: es una exportación real que puedes abrir junto a tu propia hoja de cálculo y de la que copiar la forma. El archivo es un CSV UTF-8 normal: ábrelo en Google Sheets o Excel, o léelo como texto.

¿Prefieres tus propios datos? Exporta uno de tus proyectos desde Probara y abre ese archivo aquí: las columnas y la distribución de filas son las mismas que documenta esta guía.

## Las diez columnas fijas

Estas diez columnas se leen **por posición**, no por el texto de la cabecera. Su orden forma parte del formato: renombrar una, reordenar dos u omitir una no es el mismo archivo. Mantén la fila de cabecera exactamente como viene en la exportación.

| #   | Columna         | Qué contiene                            | Reglas                                                                                           |
| --- | --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------ |
| 1   | `title`         | El título del caso                      | Obligatoria. La única que no admite celda vacía: una fila sin título continúa el caso de arriba. |
| 2   | `description`   | Texto libre que describe el caso        | Opcional. Déjala vacía si no hay. Se entrecomilla sola cuando contiene comas.                    |
| 3   | `suite`         | Dónde vive el caso en el árbol          | Niveles unidos con `/`, por ejemplo `Checkout/Payment`. Vacía para la raíz del proyecto.         |
| 4   | `priority`      | Prioridad del caso                      | Se empareja por nombre con tus opciones existentes, sin distinguir mayúsculas.                   |
| 5   | `type`          | Tipo del caso                           | Se empareja por nombre.                                                                          |
| 6   | `status`        | Estado del ciclo de vida del caso       | Se empareja por nombre.                                                                          |
| 7   | `tags`          | Nombres de las etiquetas                | Separadas con `;`. Los nombres se crean si aún no existen.                                       |
| 8   | `step_action`   | Qué hace quien ejecuta la prueba        | Un paso por fila.                                                                                |
| 9   | `step_data`     | La entrada, el valor, el dato de prueba | Opcional.                                                                                        |
| 10  | `step_expected` | Qué debería ocurrir                     | Opcional.                                                                                        |

Un archivo cuya **primera celda de cabecera no sea `title`** se rechaza entero: no se crea ningún caso y el diálogo informa que el archivo no se pudo leer como una exportación CSV.

## Un caso, varias filas

Los pasos viven en filas, no en celdas. La **primera fila de un caso** lleva las columnas del caso más su primer paso; cada fila siguiente del mismo caso deja **vacías** las columnas del caso y aporta un paso más.

```csv
title,description,suite,priority,type,status,tags,step_action,step_data,step_expected
Add to the cart updates the badge and the line item,"The header badge and the cart line item are two views of the same fact.",Cart/Cart totals,Critical,Smoke,Active,cart;smoke,Add the product to the cart,Trail Runner GTX,The header badge shows 1 without a reload.
,,,,,,,Open the cart,—,One line item for SKU SHO-1001 appears.
```

Dos reglas deciden dónde termina un caso:

- **Un `title` con contenido empieza un caso nuevo.** Todo lo de esa fila — suite, campos, etiquetas — pertenece al caso nuevo.
- **Un `title` vacío continúa el caso de arriba**, y de esa fila solo se leen `step_action`, `step_data` y `step_expected`. Lo que dejes en las demás columnas se ignora, y no es un error.

Un caso sin ningún paso se importa con una fila de paso vacía, así que una fila con solo el título ya es un caso válido.

## Columnas opcionales después de las diez fijas

Cinco columnas son opcionales. Probara reconoce cada una por su cabecera, esté donde esté después de `step_expected`. Se usa la primera columna con cada cabecera; una cabecera repetida se lee como columna extra.

| Columna                 | Qué va en ella                                                                                                                                                                                        |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `automation_key`        | La clave que vincula un caso con una ejecución automatizada. Ponla en la primera fila del caso; omite la columna para que ningún caso tenga clave.                                                    |
| `step_format`           | El formato del caso, `classic` o `gherkin`. Ponla en la primera fila del caso. Un caso sin ella es clásico.                                                                                           |
| `step_keyword`          | La palabra clave Gherkin de un paso: `Given`, `When`, `Then`, `And`, `But` o `*`. Ponla en cada fila de paso. Déjala vacía en un paso clásico.                                                        |
| `parameters`            | Los parámetros del caso como array JSON, en la primera fila del caso. Déjala vacía en un caso sin parámetros. Consulta [Parámetros y combinaciones excluidas](#parámetros-y-combinaciones-excluidas). |
| `excluded_combinations` | Las combinaciones excluidas del caso como array JSON, en la primera fila del caso. Déjala vacía cuando no se excluya ninguna combinación.                                                             |

Dale una clave a los casos que quieras que los informes de CI encuentren, y déjala vacía en los que ejecuta una persona. Las claves son únicas dentro de un proyecto: dos filas con la misma clave son un conflicto, no una combinación.

Un paso Gherkin no tiene resultado esperado, así que deja `step_expected` vacío en su fila. La palabra clave no distingue mayúsculas de minúsculas. Este ejemplo es un caso Gherkin con tres pasos:

```csv
title,description,suite,priority,type,status,tags,step_action,step_data,step_expected,step_format,step_keyword
El checkout exige una tarjeta válida,,Carrito/Pago,High,Smoke,Active,pago,el usuario está en el paso de pago,,,gherkin,Given
,,,,,,,el usuario introduce una tarjeta caducada,,,,When
,,,,,,,el pago se rechaza,,,,Then
```

## Parámetros y combinaciones excluidas

Los parámetros de un caso van en la columna `parameters`, y sus combinaciones excluidas en `excluded_combinations`. Cada una es un array JSON escrito en la primera fila del caso. Cada parámetro es un parámetro simple o un grupo:

- Un simple: `{"kind":"single","name":"Sitio","values":["EU","US","APAC"]}`.
- Un grupo: `{"kind":"group","name":"Red","columns":["VPN","Cookies"],"rows":[["activa","sí"],["inactiva","no"]]}`.

Una combinación excluida indica un valor para cada parámetro del caso. Para un caso con el parámetro simple anterior, la exclusión de APAC es `[[{"name":"Sitio","value":"APAC"}]]`. Una exclusión que no coincide con ninguna combinación del caso se descarta al importar, sin aviso.

Las comillas dentro de una celda se duplican en el archivo, y una hoja de cálculo pone la celda entre comillas por ti. Este ejemplo es un caso con un parámetro:

```csv
title,description,suite,priority,type,status,tags,step_action,step_data,step_expected,parameters
Inicia sesión en ${Sitio},,Autenticación,High,Smoke,Active,login,Abre la página de inicio de sesión de ${Sitio},,,"[{""kind"":""single"",""name"":""Sitio"",""values"":[""EU"",""US"",""APAC""]}]"
```

## Columnas extra: campos del sistema y los tuyos

Toda otra columna posterior a las diez fijas y a las columnas opcionales de arriba es una columna **extra**, y las extras llevan campos. Así se ve la exportación de un proyecto que usa el conjunto completo de campos:

```csv
title,description,suite,priority,type,status,tags,step_action,step_data,step_expected,automation_key,step_format,step_keyword,severity,layer,behavior_test,automation_status,preconditions,postconditions,is_flaky,component,test_environment,requirement,automation_framework,estimated_minutes
```

Las columnas extra de ese ejemplo y de dónde salen:

| Columna                                                                                     | Campo                                                                         |
| ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `severity`, `layer`, `behavior_test`, `automation_status`                                   | Campos del sistema. La cabecera es el nombre del campo, en minúsculas.        |
| `preconditions`, `postconditions`                                                           | Campos del sistema, texto libre.                                              |
| `is_flaky`                                                                                  | Una casilla: `true` o `false`.                                                |
| `component`, `test_environment`, `requirement`, `automation_framework`, `estimated_minutes` | Tus campos personalizados. La cabecera es el nombre del campo, en minúsculas. |

Tres reglas deciden qué pasa con un valor, y ninguna hace fallar la importación:

- **Los valores se emparejan con tus campos y opciones existentes por nombre, sin distinguir mayúsculas.** `High`, `high` y `HIGH` llegan todos a la prioridad `High`.
- **La importación nunca crea un campo ni una opción.** Una columna cuya cabecera no coincide con ningún campo de tu organización se omite con un aviso; un valor que no coincide con ninguna opción existente deja ese campo sin definir, o cae en la opción por defecto que tenga configurada ese campo.
- **El caso se importa igual en ambos casos.** Un valor sin equivalencia es un aviso en la lista de avisos del diálogo, nunca una fila fallida. Si importa, corrígelo después en el propio caso.

La cabecera de una columna extra se normaliza siempre igual: a minúsculas y con cada grupo de caracteres no alfanuméricos sustituido por un único guion bajo. `Test environment` pasa a ser `test_environment`, y así coincide con tu campo `Test environment`. Las cabeceras `parameters` y `excluded_combinations` están reservadas para las columnas de parámetros, así que un campo personalizado con cualquiera de esos títulos no guarda valor.

## Crear el archivo desde una hoja de cálculo

La mayoría empieza en Google Sheets o Excel, y ambos sirven: las reglas que importan son las que una hoja de cálculo rompe en silencio.

1. **Conserva la fila de cabecera.** La fila 1 es la cabecera; los datos empiezan en la fila 2.
2. **Exporta como CSV (UTF-8)**, no como `.xlsx`. Probara también lee `.xlsx`, pero el CSV es el formato que puedes inspeccionar en un editor de texto cuando algo va mal.
3. **No dejes que la hoja reformatee tus separadores.** Una hoja configurada en una configuración regional que usa `;` como separador de listas escribirá `Catalog;Product detail` sin avisar: escribe tú las rutas con `/` y las etiquetas con `;`.
4. **Cuidado con las conversiones automáticas.** Una celda que empieza por `=`, `+`, `-` o `@` se convierte en fórmula, número de teléfono o fecha. Formatea esas columnas como texto antes de rellenarlas.
5. **Un caso por grupo de filas**, con la regla del `title` vacío. No fusiones celdas y no pongas dos casos en la misma fila.
6. **Guarda y entonces importa.** Guarda el archivo como CSV y sube ese archivo; el diálogo de importación deduce el formato a partir del archivo.

## Reimportar una exportación de Probara

El viaje de ida y vuelta es la forma más segura de construir el archivo: exporta tus casos desde Probara, edita el CSV hasta que contenga lo que quieres e impórtalo de vuelta. En el camino no se pierde nada: todos los campos del sistema, los valores de tus campos personalizados, las etiquetas, las claves de automatización, los formatos de pasos, las palabras clave Gherkin, los parámetros, las combinaciones excluidas y el árbol de suites vuelven, porque el CSV es el formato de exportación.

Dos comportamientos conviene conocer antes de apoyarte en esto:

- **El árbol de suites se recrea a partir de la columna `suite`.** Elige la **Parent suite** en el diálogo para colocar todo el árbol importado debajo de una suite existente.
- **Activa "Replace matching test cases"** para sobrescribir los casos cuyo título ya exista en la suite de destino, en lugar de crear duplicados. Si lo dejas desactivado, un título idéntico produce un segundo caso.

## Lo que un CSV no puede llevar

- **Adjuntos.** Las imágenes incrustadas en los pasos no se importan; que falte una imagen después es lo esperado, no un error.
- **Pasos compartidos.** Un paso compartido en el origen llega como pasos normales dentro del caso; el paso compartido en sí no se crea.
- **Parámetros compartidos.** Una exportación escribe un parámetro compartido como copia local de sus valores, así que una reimportación conserva los valores como parámetros propios del caso. Un archivo no puede llevar una referencia a un parámetro compartido: una celda que nombre uno importa el caso sin sus parámetros.
- **Markdown.** `.md` no es un formato de importación. Exporta CSV (o JSON, o XML).

## Límites y resolución de problemas

| Límite                | Valor |
| --------------------- | ----- |
| Tamaño del archivo    | 10 MB |
| Casos por importación | 5.000 |

Ambos límites se comprueban antes de escribir nada: un archivo que supere cualquiera de los dos se rechaza con un mensaje, no se importa a medias. Divide una exportación grande en lotes e impórtalos uno a uno.

| Mensaje que ves                                      | Qué significa                                                                                   |
| ---------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| El archivo no se pudo leer como una exportación CSV  | La primera celda de cabecera no es `title`, o el archivo no es CSV. Revisa la fila de cabecera. |
| No se encontró ningún caso de prueba en este archivo | Todas las filas tenían el `title` vacío, así que no había ningún caso que empezar.              |
| Este archivo contiene demasiados casos de prueba     | Más de 5.000 casos. Divide la exportación.                                                      |
| El archivo supera el tamaño máximo de importación    | Más de 10 MB. Exporta un subconjunto o divide el archivo.                                       |
| Una fila aparece como fallida con su número de fila  | Lee el `title` de esa fila: está vacío donde se esperaba un título, o le falta el título.       |

Una fila también puede importarse con un aviso en lugar de un fallo: _Importado con pasos clásicos — los pasos no coincidían con el formato indicado_. Sus pasos Gherkin no tienen `step_keyword`, o tienen un `step_expected`. El caso se importa igual, con cada palabra clave al inicio de su paso.

Una celda `parameters` o `excluded_combinations` que no es JSON válido, o que incumple una regla de parámetros, importa el caso sin sus parámetros y muestra el aviso _Parámetros no aplicados — el caso se importó sin ellos_. Una importación con reemplazo conserva entonces los parámetros existentes del caso.

Una celda que empieza por `=`, `+`, `-` o `@` se exporta con un `'` delante para que una hoja de cálculo no pueda ejecutarla; el importador vuelve a quitar ese `'`, así que el caso conserva el texto que escribiste.

## Continuar por aquí

- [Importar casos de prueba](https://docs.probara.net/es/guides/import-test-cases/) — el diálogo en sí: herramientas de origen, formatos, reemplazo de coincidencias y qué no se importa.
- [Repositorio de pruebas](https://docs.probara.net/es/guides/test-repository/) — suites, casos y pasos, una vez que el archivo ya está dentro.
- [API de exportación de casos de prueba](https://docs.probara.net/es/developers/api/export/) — todos los formatos de exportación, si quieres ir en la dirección contraria.
