Desarrollo guiado por pruebas: ¿Una forma buena / aceptada de probar las operaciones del sistema de archivos?

14

Estoy trabajando en un proyecto en este momento 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 se deben escribir las pruebas alrededor de esto, o configurarlas? ¿Hay una manera fácil de burlarse de esto? ¿O debería configurar una "caja de arena"?

    
pregunta Kirbinator 07.10.2013 - 05:31
fuente

5 respuestas

13

Como lo hace siempre en TDD con recursos externos: crea una o más interfaces para las operaciones de su sistema de archivos y las "imita". Desea probar su "generador de tablas" y su código de modificación de metadatos, no las operaciones del sistema de archivos en sí (lo más probable es que esté utilizando implementaciones de bibliotecas ya hechas para acceder al sistema de archivos).

    
respondido por el Doc Brown 07.10.2013 - 08:07
fuente
10

¿Qué tiene de malo tener un sistema de archivos de "prueba"?

Cree una estructura de carpeta / directorio de plantillas que tenga suficiente contenido para probar sus operaciones.

Durante la configuración de su prueba de unidad, copie esta estructura inicial (le recomendaría que comprima la plantilla y descomprima en su área de prueba). Ejecuta tus pruebas. Eliminar todo durante el desmontaje.

El problema con el simulacro es, en primer lugar, que los sistemas de archivos, los sistemas operativos y las bases de datos que pertenecen a su proyecto en realidad no califican como recursos externos, y en segundo lugar, burlarse de las llamadas al sistema de bajo nivel requiere mucho tiempo y es propenso a errores.

    
respondido por el James Anderson 07.10.2013 - 10:13
fuente
2

Entiendo tu pregunta como "Una forma buena / aceptada de probar una clase que depende de las operaciones del sistema de archivos". No asumo que desea probar el sistema de archivos de su sistema operativo.

Con el fin de mantener el esfuerzo de 'las interfaces con las operaciones de su sistema de archivos y "simularlas" como lo sugiere la respuesta de @Doc Brown, lo más pequeño posible es una buena idea usar java flujos binarios o 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 en tdd.

Ejemplo:

Usando Java, he implementado una clase CsvReader

public class CsvReader {
    private Reader reader;

    public CsvReader(Reader reader) {
        this.reader = reader;
    }
}

Para las pruebas que utilicé en datos de memoria como este

String contentOfCsv = "TestColumn1;TestColumn2\n"+
    "value1;value2\n";

CsvReader sut = new CsvReader(java.io.StringReader(contentOfCsv));

o integrar testdata en los recursos

CsvReader sut = new CsvReader(getClass().getResourceAsStream("/data.csv"));

En producción utilizo el sistema de archivos

CsvReader sut = new CsvReader(new BufferedReader( new FileReader( "/import/Prices.csv" ) ));

De esta manera, mi CsvReader no depende del sistema de archivos, sino de una abstracción "Reader" donde existe una implementación para el sistema de archivos.

    
respondido por el k3b 07.10.2013 - 17:07
fuente
2

Este es el tipo de cosa 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 permite eliminar un archivo si algún proceso, incluido el eliminador, lo tiene) abierto).

Por lo tanto, 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 será suficiente; así que trabajo hecho, detente, vete a casa .

Si no, habrá una complejidad interna que no será fácil de probar adecuadamente al organizar los archivos. En cuyo caso, simplemente elimine esa complejidad, póngala en una clase y escriba pruebas de unidad 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., también.

En ningún caso tomaría el núcleo fundamental del código que está escribiendo y se "burlará" para escribir pruebas que pasen si la unidad en prueba es incorrecta o no.

    
respondido por el soru 08.04.2015 - 23:55
fuente
0

Cree un contenedor para las operaciones del sistema de archivos. En las pruebas, pase un simulacro que implemente la misma interfaz que la envoltura. En producción, pasar en el envoltorio.

    
respondido por el jhewlett 07.10.2013 - 08:15
fuente

Lea otras preguntas en las etiquetas