21. Archivos, almacenamiento y recursos compartidos

21.1 Introducción

No todas las integraciones ocurren mediante bases de datos, APIs o colas. Muchas aplicaciones también integran componentes a través de archivos, carpetas, almacenamiento externo, cachés, recursos compartidos o ubicaciones temporales.

Un sistema puede generar reportes, importar archivos, guardar imágenes, leer configuraciones, escribir logs, compartir documentos o procesar lotes de datos. Cada una de estas operaciones tiene riesgos de integración.

En este tema veremos cómo probar integraciones que involucran archivos, almacenamiento y recursos compartidos de forma segura y repetible.

21.2 Qué se considera almacenamiento

En pruebas de integración, almacenamiento puede significar varios tipos de recursos:

  • Sistema de archivos local.
  • Carpetas compartidas en red.
  • Almacenamiento de objetos.
  • Archivos temporales.
  • Repositorios de documentos.
  • Cachés compartidas.
  • Directorios de entrada y salida para procesos por lote.

Lo importante es que la aplicación lee o escribe información fuera de la memoria inmediata del proceso.

21.3 Qué se prueba en estas integraciones

Las pruebas de integración con archivos y almacenamiento pueden verificar:

  • Que el archivo se genere en la ubicación correcta.
  • Que el contenido tenga el formato esperado.
  • Que la aplicación pueda leer archivos válidos.
  • Que los errores de lectura o escritura se manejen bien.
  • Que los permisos sean suficientes.
  • Que los archivos temporales se limpien.
  • Que dos procesos no interfieran al usar el mismo recurso.
En integraciones con archivos, no alcanza con verificar que el archivo exista. También importa su contenido, ubicación, permisos y limpieza.

21.4 Rutas y configuración

Las rutas de archivos suelen variar entre ambientes. Una ruta válida en desarrollo puede no existir en el ambiente de pruebas o puede apuntar a una ubicación incorrecta.

Conviene probar y configurar:

  • Directorios de entrada.
  • Directorios de salida.
  • Carpetas temporales.
  • Rutas relativas y absolutas.
  • Permisos de lectura y escritura.
  • Nombres de archivos generados.

Las pruebas deben usar rutas de prueba, no carpetas productivas ni ubicaciones compartidas sin control.

21.5 Lectura de archivos

Muchas integraciones comienzan leyendo un archivo. Por ejemplo, importar clientes desde CSV, procesar una planilla o leer un archivo de configuración.

Una prueba de integración puede verificar:

  • Archivo válido con datos esperados.
  • Archivo vacío.
  • Archivo con columnas faltantes.
  • Archivo con formato incorrecto.
  • Archivo con caracteres especiales.
  • Archivo inexistente o sin permisos de lectura.

El objetivo es comprobar que el componente lector colabore correctamente con el resto del sistema y maneje errores sin dejar estados inconsistentes.

21.6 Escritura de archivos

Otras integraciones generan archivos: reportes, comprobantes, exportaciones, logs de auditoría o archivos para otro sistema.

Una prueba puede verificar:

  • Que el archivo se cree.
  • Que el nombre sea correcto.
  • Que el contenido sea el esperado.
  • Que el formato pueda ser leído por otro componente.
  • Que no se sobrescriban archivos indebidamente.
  • Que se manejen errores de escritura.

Si otro proceso depende del archivo generado, la prueba debe representar ese contrato de salida.

21.7 Formatos de archivo

El formato del archivo es parte del contrato entre componentes. Puede tratarse de CSV, JSON, XML, texto plano, planillas u otros formatos.

Conviene revisar:

  • Separadores de columnas.
  • Codificación de caracteres.
  • Encabezados.
  • Orden de campos si el formato lo requiere.
  • Formato de fechas e importes.
  • Campos obligatorios y opcionales.

Un archivo puede existir y aun así ser inútil para el consumidor si su formato no respeta el contrato.

21.8 Permisos

Los permisos son una fuente frecuente de errores. La aplicación puede funcionar en desarrollo y fallar en pruebas porque el usuario del proceso no tiene permisos para leer, escribir o borrar archivos.

Casos a considerar:

  • Directorio sin permiso de escritura.
  • Archivo sin permiso de lectura.
  • Recurso bloqueado por otro proceso.
  • Credenciales insuficientes para almacenamiento externo.
  • Permisos diferentes entre ambientes.

Una prueba de integración puede ayudar a detectar estos problemas temprano, siempre que el ambiente represente permisos realistas.

21.9 Archivos temporales

Los archivos temporales se usan para procesar datos intermedios. Deben manejarse con cuidado para no dejar residuos ni interferir con otras pruebas.

Buenas prácticas:

  • Usar carpetas temporales específicas para pruebas.
  • Generar nombres únicos.
  • Borrar archivos al terminar.
  • No asumir que una carpeta está vacía si no se limpió.
  • Evitar rutas fijas compartidas por varias pruebas.

Un archivo temporal viejo puede hacer que una prueba lea datos incorrectos o falle por duplicados.

21.10 Recursos compartidos

Un recurso compartido es usado por más de un componente, prueba o proceso. Puede ser una carpeta, un archivo, una caché, un bucket, una cola de archivos o una ubicación de intercambio.

Riesgos:

  • Una prueba borra archivos que otra necesita.
  • Dos procesos escriben el mismo archivo.
  • Un consumidor procesa un archivo incompleto.
  • Un archivo viejo queda disponible para una prueba nueva.
  • Una caché compartida devuelve datos de otra ejecución.

Los recursos compartidos requieren nombres únicos, aislamiento o limpieza controlada.

21.11 Concurrencia y bloqueo

Cuando varios procesos acceden al mismo archivo o recurso, pueden aparecer problemas de concurrencia.

Ejemplos:

  • Un proceso intenta leer un archivo mientras otro lo está escribiendo.
  • Dos procesos intentan crear el mismo nombre de archivo.
  • Un archivo queda bloqueado y no puede eliminarse.
  • Un consumidor procesa un archivo antes de que esté completo.

Las pruebas de integración pueden incluir escenarios donde el recurso no está disponible o está parcialmente preparado.

21.12 Almacenamiento externo

El almacenamiento externo puede ofrecer APIs o servicios para subir, descargar y eliminar archivos. En pruebas, debemos decidir si usar un ambiente real de prueba, una simulación o una implementación local.

Enfoque Ventaja Cuidado
Almacenamiento real de prueba Mayor realismo. Puede tener costos, permisos y limpieza más compleja.
Simulación Permite controlar errores y respuestas. Debe respetar el contrato real.
Filesystem local Simple y rápido para muchos casos. Puede no representar permisos o comportamiento del proveedor real.

21.13 Limpieza de almacenamiento

La limpieza es fundamental. Una prueba que genera archivos debe eliminarlos o usar una ubicación aislada que pueda descartarse.

Conviene definir:

  • Qué archivos crea la prueba.
  • Dónde los crea.
  • Cómo se identifican.
  • Cuándo se eliminan.
  • Qué ocurre si la prueba falla antes de limpiar.

En almacenamiento externo, también puede ser necesario limpiar objetos antiguos para evitar costos o interferencias.

21.14 Verificación de contenido

Verificar contenido es más importante que verificar solo existencia. Si una exportación genera un archivo vacío, la prueba no debería pasar solo porque el archivo fue creado.

Se puede verificar:

  • Cantidad de registros.
  • Encabezados esperados.
  • Valores principales.
  • Formato de fechas e importes.
  • Ausencia de datos que no deberían aparecer.
  • Compatibilidad con el proceso que consume el archivo.

21.15 Ejemplo: importar clientes desde CSV

Supongamos una integración que importa clientes desde un archivo CSV y los guarda en la base de datos.

Paso Qué se verifica
Preparar archivo CSV válido. El formato de entrada es reconocido.
Ejecutar importación. El proceso lee el archivo y transforma datos.
Consultar base de datos. Los clientes fueron guardados correctamente.
Probar archivo inválido. El proceso informa error y no deja datos inconsistentes.
Limpiar archivo y datos. La prueba no afecta ejecuciones posteriores.

21.16 Ejemplo: exportar reporte

En una exportación de reporte, la prueba puede preparar datos, ejecutar la generación y verificar el archivo producido.

Se debería comprobar:

  • El archivo se genera en la ubicación esperada.
  • El nombre sigue la convención definida.
  • El contenido incluye los registros correctos.
  • No incluye registros que no corresponden.
  • El formato puede ser leído por el consumidor previsto.

21.17 Errores comunes

Al probar archivos y almacenamiento, suelen aparecer errores como:

  • Usar rutas productivas en pruebas.
  • Verificar solo existencia del archivo.
  • No limpiar archivos temporales.
  • Usar nombres fijos que chocan entre pruebas.
  • No probar archivos inválidos o vacíos.
  • Ignorar diferencias de permisos entre ambientes.
  • Procesar archivos incompletos o viejos.

21.18 Lista de verificación

Antes de confiar en una prueba con archivos o almacenamiento, conviene revisar:

  • ¿La prueba usa rutas de prueba y no productivas?
  • ¿Los nombres de archivos son únicos o controlados?
  • ¿Se verifica contenido y formato?
  • ¿Se prueban errores de lectura o escritura relevantes?
  • ¿Los permisos del ambiente son representativos?
  • ¿Los archivos creados se limpian?
  • ¿La prueba puede ejecutarse varias veces sin interferencias?

21.19 Qué debes recordar de este tema

  • Los archivos y recursos compartidos también son puntos de integración.
  • Rutas, permisos, formato y contenido forman parte del comportamiento probado.
  • Los archivos temporales deben tener nombres únicos y limpieza confiable.
  • Los recursos compartidos requieren aislamiento para evitar interferencias.
  • El almacenamiento externo puede probarse con ambiente real de prueba, simulación o implementación local.
  • Verificar solo que un archivo exista suele ser insuficiente.

21.20 Conclusión

Las integraciones con archivos, almacenamiento y recursos compartidos son comunes y pueden producir fallas difíciles de diagnosticar si no se controlan rutas, permisos, contenido y limpieza.

Una prueba de integración útil debe verificar que los datos se lean o escriban correctamente, que los formatos respeten el contrato y que el ambiente no quede contaminado para futuras ejecuciones.

En el próximo tema veremos manejo de errores, timeouts y reintentos.