Ich schreibe einen Parser und als Teil davon habe ich eine Expander
Klasse, die eine einzelne komplexe Anweisung in mehrere einfache Anweisungen "erweitert". Zum Beispiel würde es dies erweitern:
x = 2 + 3 * a
in:
tmp1 = 3 * a
x = 2 + tmp1
Jetzt überlege ich, wie ich diese Klasse testen soll, insbesondere, wie ich die Tests anordnen soll. Ich könnte den Eingabesyntaxbaum manuell erstellen:
var input = new AssignStatement(
new Variable("x"),
new BinaryExpression(
new Constant(2),
BinaryOperator.Plus,
new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));
Oder ich könnte es als String schreiben und analysieren:
var input = new Parser().ParseStatement("x = 2 + 3 * a");
Die zweite Option ist viel einfacher, kürzer und lesbar. Es führt aber auch eine Abhängigkeit von ein Parser
, was bedeutet, dass ein Fehler in Parser
diesem Test fehlschlagen könnte. Der Test würde also aufhören, ein Komponententest von Expander
und zu sein, und ich denke, er wird technisch zu einem Integrationstest von Parser
und Expander
.
Meine Frage ist: Ist es in Ordnung, sich zum Testen dieser Expander
Klasse größtenteils (oder vollständig) auf diese Art von Integrationstests zu verlassen ?
Parser
einen anderen Test nicht bestehen kann, ist kein Problem, wenn Sie gewohnheitsmäßig nur bei null Fehlern einen Fehler begehenParser
. Ich würde mir eher Sorgen machen, dass ein FehlerParser
diesen Test zum Erfolg führen könnte, wenn er fehlschlagen sollte . Unit-Tests sind schließlich da, um Fehler zu finden - ein Test ist kaputt, wenn er es nicht tut, aber sollte.