Piszę parser i jako część tego mam Expander
klasę, która „rozwija” jedną złożoną instrukcję w wiele prostych instrukcji. Na przykład rozwinąłby to:
x = 2 + 3 * a
w:
tmp1 = 3 * a
x = 2 + tmp1
Teraz zastanawiam się, jak przetestować tę klasę, a konkretnie jak zorganizować testy. Mógłbym ręcznie utworzyć wejściowe drzewo składni:
var input = new AssignStatement(
new Variable("x"),
new BinaryExpression(
new Constant(2),
BinaryOperator.Plus,
new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));
Lub mógłbym napisać go jako ciąg i przeanalizować:
var input = new Parser().ParseStatement("x = 2 + 3 * a");
Druga opcja jest znacznie prostsza, krótsza i czytelna. Ale wprowadza także denpendencję Parser
, co oznacza, że błąd w tym Parser
może zakończyć się niepowodzeniem. Test przestałby być testem jednostkowym Expander
i wydaje mi się, że technicznie staje się testem integracyjnym Parser
i Expander
.
Moje pytanie brzmi: czy można polegać głównie (lub całkowicie) na tego rodzaju testach integracyjnych w celu przetestowania tej Expander
klasy?
Parser
może się nie powieść w jakimś innym teście, nie stanowi problemu, jeśli zwykle popełniasz tylko błędy zerowe, przeciwnie, oznacza to, że masz większy zasięgParser
. Wolałbym się martwić, że błądParser
może sprawić, że test się powiedzie, gdy powinien się nie udać . W końcu testy jednostkowe służą do znajdowania błędów - test jest przerywany, kiedy nie, ale powinien.