Il mio team sta scrivendo un compilatore per un linguaggio specifico del dominio (DSL) che sarà integrato in un IDE. Al momento, ci concentriamo sulla fase di analisi del compilatore. Noi siamo non utilizzando qualsiasi generatore di parser esistente (come ANTLR) perché abbiamo bisogno di prestazioni in tempo reale e di informazioni di errore / avvertimento / messaggio altamente dettagliate. Abbiamo
- classi, ognuna delle quali rappresenta un nodo nell'albero di sintassi concreto per la lingua, nonché
- classi che fungono da annotazioni per ogni nodo (ad esempio, per errori e informazioni aggiuntive), nonché
- classi interne che creano e manipolano l'albero di sintassi concreto (cioè lexer, parser, cache per le stringhe, visitatori della sintassi).
Stiamo cercando di decidere una strategia globale per organizzare i nostri test. La nostra azienda sta spingendo lo sviluppo orientato al comportamento (BDD) e il design basato sul dominio (DDD). Sebbene stiamo costruendo una DSL per il dominio della nostra azienda, il dominio del compilatore è un linguaggio di programmazione.
Siamo ancora in fase di costruzione del compilatore e abbiamo già alcuni test. Puntiamo ad avere una copertura informativa del 100%.
Al momento disponiamo di test in cui inseriamo il codice sorgente nel tree builder della sintassi e quindi eseguiamo una verifica su ogni proprietà di ogni nodo dell'albero di sintassi risultante per assicurarci che le informazioni attese (numero di riga, errore pertinente (s ), token figlio / genitore, larghezza del token, tipo di token, ecc.). Ora, dato che ogni nodo è una sua classe, e alcune annotazioni e errori collegati a un nodo sono classi separate, questo test finisce per riferirsi a molte classi.
Al momento abbiamo test per alcune classi come il lexer in cui possiamo isolare l'input (una stringa) e l'output (una lista di token) da altre classi (ad esempio, le classi per i nodi dell'albero della sintassi) . Questi test sono più granulari.
Ora, i test nel paragrafo immediatamente precedente possono essere messi in corrispondenza con la classe sotto test (ad es. lexer, cache delle stringhe). Tuttavia, i test del secondo paragrafo sopra testano davvero l'intera fase di analisi del compilatore; cioè, ogni test può avere oltre 300 asserzioni per l'albero di sintassi, dato il codice sorgente di input. I test sono per il comportamento della fase di analisi.
Questa è una strategia di test appropriata? Se no, cosa dovremmo fare diversamente? Quale strategia organizzativa dovremmo utilizzare per i nostri test?