Я концептуально разделил свое тестирование на две категории (как это делают довольно многие специалисты по TDD): интеграционные тесты и модульные тесты. Модульный тест должен проверить одну вещь, и я должен быть дисциплинирован в отношении тестирования единственного контракта, который я пишу в любой момент - в общем, один метод требует одного теста. Это вынуждает меня писать небольшие тестируемые методы, в которых я уверен в себе. Это, в свою очередь, ведет меня к написанию небольших тестируемых классов.
Интеграционные тесты - это высокоуровневые тесты, которые доказывают проблемы взаимодействия между компонентами, которые в противном случае оказались бы работающими, как и ожидалось, изолированно модульными тестами. Я пишу меньше из них, и они должны применяться разумно, поскольку никогда не может быть полного охвата уровня интеграции. Они сосредоточены на доказательстве рискованных областей взаимодействия между различными компонентами и могут использовать письменные приемочные тесты в качестве руководства.
Определение областей, которые требуют интеграционного тестирования, - это скорее «чувство». Если вы были дисциплинированы относительно модульных тестов, у вас должна быть хорошая идея, где нужны интеграционные тесты, то есть те области с более глубокими стеками вызовов или межпроцессным взаимодействием или тому подобное, где вы знаете, что существует более высокий риск. Или вы можете решить, что интеграционные тесты являются хорошим способом доказать поведенческие ожидания высокого уровня, которые соответствуют письменным требованиям владельца продукта. Это также хорошее применение.