Mein Team schreibt einen Compiler für eine domänenspezifische Sprache (DSL), die in eine IDE integriert wird. Im Moment konzentrieren wir uns auf die Analysephase des Compilers. Wir sind nicht mit allen vorhandenen Parser-Generatoren (wie ANTLR) , weil wir Echtzeit - Leistung benötigen und sehr detaillierte Fehlern / Warnung / Meldung Informationen. Wir haben
- Klassen, von denen jede einen Knoten im konkreten Syntaxbaum für die Sprache darstellt, sowie
- Klassen, die als Anmerkungen für jeden Knoten dienen (dh für Fehler und zusätzliche Informationen), sowie
- interne Klassen, die den konkreten Syntaxbaum erstellen und bearbeiten (dh Lexer, Parser, Cache für Zeichenfolgen, Syntaxbesucher).
Wir versuchen, eine Gesamtstrategie für die Organisation unserer Tests festzulegen. Unser Unternehmen treibt die verhaltensgesteuerte Entwicklung (BDD) und das domänengesteuerte Design (DDD) voran. Obwohl wir ein DSL für die Domäne unseres Unternehmens erstellen, ist die Domäne des Compilers eine Programmiersprache.
Wir sind noch dabei, den Compiler zu erstellen und haben bereits einige Tests. Wir streben eine 100% ige Abdeckung der Kontoauszüge an.
Wir haben derzeit Tests, bei denen wir Quellcode in den Syntaxbaum-Builder eingeben und dann eine Überprüfung für jede Eigenschaft jedes Knotens des resultierenden Syntaxbaums ausführen, um sicherzustellen, dass die erwarteten Informationen (Zeilennummer, relevante Fehler, untergeordnetes Element) vorliegen / übergeordnete Token, Breite des Tokens, Art des Tokens usw.). Da jeder Knoten eine eigene Klasse ist und bestimmte Anmerkungen und Fehler, die an einen Knoten angehängt sind, separate Klassen sind, verweist dieser Test auf viele Klassen.
Wir haben derzeit Tests für bestimmte Klassen wie den Lexer, in dem wir die Eingabe (eine Zeichenfolge) und die Ausgabe (eine Liste von Token) von anderen Klassen (z. B. den Klassen für die Knoten des Syntaxbaums) isolieren können. Diese Tests sind detaillierter.
Jetzt können die Tests im obigen Absatz in Übereinstimmung mit der zu testenden Klasse (z. B. Lexer, String-Cache) gestellt werden. Die Tests aus dem obigen zweiten Absatz testen jedoch wirklich die gesamte Analysephase des Compilers. Das heißt, jeder Test kann angesichts des eingegebenen Quellcodes weit über 300 Zusicherungen für den Syntaxbaum enthalten. Die Tests beziehen sich auf das Verhalten der Analysephase.
Ist dies eine geeignete Teststrategie? Wenn nicht, was sollen wir anders machen? Welche Organisationsstrategie sollten wir für unsere Tests verwenden?