Никрасива, я проще в двух словах тут напишу:
1. используйте разделение задач на компоненты с понятным интерфейсом. Это позволит использовать в каждом компоненте независимые капабилити, разделить зоны отвественности и повысит тестируемость
2. Разделяйте интеграционные и юнит тесты, первые должны использовать всю программу как есть без моков (кроме как всяких вещей слишком сильно стреляющих ракетами, но если пункт 1 выполнен то тут проблемы нет), а вторые должны запускать компоненты и блоки в изоляции
3. Переиспользуйте код и библиотечные функции, которыми пользуются многие
4. Проектируйте программу так, чтобы независимые вещи были независимыми