Estoy escribiendo un compilador Tiger
en C#
y voy a traducir el código Tiger
en IL
.Pruebas de unidad de escritura en mi compilador (que genera IL)
Al implementar la comprobación semántica de cada nodo en mi AST, creé muchas pruebas unitarias para esto. Eso es bastante simple, ya que mi método CheckSemantic
se ve así:
public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
así, si quiero escribir algo de unidad de prueba para la comprobación semántica de algún nodo, todo lo que tengo que hacer es construir un AST, y la llamada ese método. Entonces puedo hacer algo como:
Assert.That(errors.Count == 0);
o
Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));
pero estoy empezando la generación de código en este momento, y no sé lo que podría ser una buena práctica al escribir pruebas unitarias para esa fase.
Estoy usando la clase ILGenerator
. He pensado en lo siguiente:
- generar el código del programa de ejemplo quiero probar
- Guardar ese ejecutable
- ejecutar ese archivo y almacenar el resultado en un archivo
- oponer ese archivo
pero me pregunto si hay una mejor manera de hacerlo?
Es bueno saber eso. Lo haré de esa manera entonces. Estaba un poco preocupado por el rendimiento de muchas pruebas en ejecución y por la creación, lectura y eliminación de archivos en el disco. –
@OscarMederos: si el rendimiento no es lo suficientemente bueno, entonces (1) haga un perfil para determinar qué es lento y solucione si puede, o (2) cambie su estrategia de prueba para que algunas pruebas se ejecuten en cada registro, algunas pruebas corre durante la noche, y algunos pasan el fin de semana. De esta forma obtendrá un buen equilibrio entre descubrir problemas rápidamente y seguir realizando pruebas exhaustivas. –