En este momento estoy trabajando en un proyecto que genera una tabla (entre otras cosas) basada en el contenido de un sistema de archivos y, a su vez, realiza algunas modificaciones de metadatos en las cosas que encuentra. La pregunta es: ¿cómo deben escribirse las pruebas en torno a esto, o configurarse? ¿Hay una manera fácil de burlarse de esto? ¿O debería configurar un "sandbox"?
fuente
¿Qué tiene de malo tener un sistema de archivos de "prueba"?
Cree una estructura de carpeta / directorio de plantilla que tenga suficiente contenido para probar sus operaciones.
Durante la configuración de su unidad de prueba, copie esta estructura inicial (le recomendaría que comprima la plantilla y la descomprima en su área de prueba). Ejecute sus pruebas. Eliminar todo durante el desmontaje.
El problema con la burla es, en primer lugar, que los sistemas de archivos, los sistemas operativos y las bases de datos que pertenecen a su proyecto realmente no califican como recursos externos y, en segundo lugar, burlarse de las llamadas a sistemas de bajo nivel es lento y propenso a errores.
fuente
Este es el tipo de cosas que definitivamente necesita para la prueba de integración, ya que los sistemas de archivos del mundo real tienen todo tipo de comportamiento extraño (como la forma en que Windows no permitirá eliminar un archivo si algún proceso, incluido el eliminador, lo tiene abierto).
Entonces, el enfoque de TDD es escribir primero la prueba de integración (TDD, estrictamente hablando, no tiene conceptos distintos de 'prueba unitaria' y 'prueba de integración'; son solo pruebas). Muy probablemente eso sea suficiente; así que trabajo hecho, detente, vete a casa .
Si no, habrá cierta complejidad interna que no es fácil de probar adecuadamente organizando los archivos. En cuyo caso, simplemente elimina esa complejidad, la coloca en una clase y escribe pruebas unitarias para esa clase . Es muy probable que encuentre que esa clase común también se puede usar en la base de datos, archivos xml, etc.
En ningún caso tomaría el núcleo fundamental del código que está escribiendo y lo 'burlará' para escribir pruebas que pasarán si la unidad bajo prueba está o no equivocada.
fuente
'unit test' and 'integration test'; they are just tests.
creo que de manera realista, esta será la mejor solución para mi caso, realmente necesito probar las bibliotecas del sistema de archivos que estoy usando para casos extremos y cómo debería responder la aplicación aquellos. Si cambio a una biblioteca de sistema de archivos diferente, no quiero tener que volver a escribir un montón de simulacros / código de prueba para trabajar con la nueva biblioteca, pero tener una estructura de carpetas de prueba y pruebas de integración lo haría mucho más simple.Entiendo su pregunta como "Una forma buena / aceptada de probar una clase que depende de las operaciones del sistema de archivos". No asumo que quieres probar el sistema de archivos de tu sistema operativo.
Para mantener el esfuerzo de 'interactuar con las operaciones de su sistema de archivos y "burlarse de ellos", como sugirió la respuesta de @Doc Brown lo más pequeño posible, es una buena idea usar flujos binarios de Java o un lector de texto (o su equivalente en c # o el lenguaje de programación que está usando) en lugar de usar Archivos con nombres de archivo directamente en su clase desarrollada por tdd.
Ejemplo:
Usando Java he implementado una clase CsvReader
Para probar, utilicé datos de memoria como este
o incluir datos de prueba en los recursos
En producción uso el sistema de archivos
De esta forma, mi CsvReader no depende del sistema de archivos sino de un "Lector" de abstracción donde hay una implementación para el sistema de archivos.
fuente
Cree un contenedor para las operaciones del sistema de archivos. En las pruebas, pase un simulacro que implemente la misma interfaz que el contenedor. En producción, pase la envoltura.
fuente