Я пишу парсер, и как часть этого, у меня есть Expander
класс, который «расширяет» одно сложное утверждение в несколько простых операторов. Например, это расширило бы это:
x = 2 + 3 * a
в:
tmp1 = 3 * a
x = 2 + tmp1
Сейчас я думаю о том, как тестировать этот класс, в частности, как организовать тесты. Я мог бы вручную создать дерево синтаксиса ввода:
var input = new AssignStatement(
new Variable("x"),
new BinaryExpression(
new Constant(2),
BinaryOperator.Plus,
new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));
Или я мог бы написать это как строку и разобрать это:
var input = new Parser().ParseStatement("x = 2 + 3 * a");
Второй вариант гораздо проще, короче и удобочитаемее. Но он также вводит зависимость от Parser
, что означает, что ошибка Parser
может не пройти этот тест. Таким образом, тест перестанет быть модульным тестом Expander
, и я думаю, что технически станет интеграционным тестом Parser
и Expander
.
Мой вопрос: можно ли в основном (или полностью) полагаться на такого рода интеграционные тесты для тестирования этого Expander
класса?
Parser
может провалиться в каком-то другом тесте, не является проблемой, если вы обычно делаете коммит только при нулевых сбоях, напротив, это означает, что у вас больше охватаParser
. То, о чем я бы предпочел беспокоиться, это то, что ошибкаParser
могла сделать этот тест успешным, если он не прошел . В конце концов, есть модульные тесты, чтобы найти ошибки - тест не работает, но он должен быть.