Sto scrivendo un compilatore Tiger
in C#
e ho intenzione di tradurre il codice Tiger
in IL
.Test di unità di scrittura nel mio compilatore (che genera IL)
Durante l'implementazione del controllo semantico di ogni nodo nel mio AST, ho creato un sacco di unit test per questo. Che è piuttosto semplice, perché il mio metodo CheckSemantic
assomiglia a questo:
public override void CheckSemantics(Scope scope, IList<Error> errors) {
...
}
così, se voglio scrivere qualche unit test per la verifica semantica di qualche nodo, tutto quello che devo fare è costruire un AST, e la chiamata quel metodo. Allora posso fare qualcosa di simile:
Assert.That(errors.Count == 0);
o
Assert.That(errors.Count == 1);
Assert.That(errors[0] is UnexpectedTypeError);
Assert.That(scope.ExistsType("some_declared_type"));
ma sto iniziando la generazione del codice in questo momento, e non so che cosa potrebbe essere una buona pratica durante la scrittura di unit test per quella fase.
Sto utilizzando la classe ILGenerator
. Ho pensato a quanto segue:
- generare il codice del programma di esempio che voglio testare
- Salva che eseguibile
- Esegui il file, e memorizzare l'output in un file di
- valere nei confronti quel file
ma mi chiedo se c'è un modo migliore di farlo?
È bello saperlo. Lo farò in quel modo allora. Ero solo un po 'preoccupato per le prestazioni di molti test in esecuzione e per la creazione, la lettura e l'eliminazione di file sul disco. –
@OscarMederos: Se le prestazioni non sono abbastanza buone allora (1) fai il profiling per capire cosa è lento e correggilo se puoi, oppure (2) cambia la tua strategia di test in modo che alcuni test vengano eseguiti su ogni check-in, alcuni test correre durante la notte, e alcuni correre nel fine settimana. In questo modo si ottiene un buon equilibrio tra la scoperta rapida dei problemi e l'esecuzione di test approfonditi. –