Сначала и часто.
Если я создаю какую-то новую функциональность для системы, я постараюсь сначала определить интерфейсы, а затем написать модульные тесты для этих интерфейсов. Чтобы выяснить, какие тесты нужно написать, рассмотрите API интерфейса и предоставляемые им функциональные возможности, достаньте ручку и бумагу и немного подумайте о возможных ошибках или способах доказать, что они работают правильно. Если это слишком сложно, то, скорее всего, ваш API недостаточно хорош.
Что касается тестов, посмотрите, можете ли вы написать «интеграционные» тесты, которые тестируют более одного конкретного объекта и сохраняют их как «модульный» тест.
Затем создайте реализацию интерфейса по умолчанию (которая ничего не делает, возвращает мусорные значения, но не выдает исключений), подключите ее к тестам, чтобы убедиться, что тесты не пройдены (это тесты, которые ваши тесты работают! :)) , Затем напишите в функциональности и перезапустите тесты.
Этот механизм не идеален, но будет охватывать множество простых ошибок кодирования и даст вам возможность запустить новую функцию, не подключая ее ко всему приложению.
После этого вам необходимо протестировать его в главном приложении с комбинацией существующих функций.
Именно здесь тестирование является более сложным, и, если возможно, его следует частично поручить хорошему тестировщику качества, так как у него будет ловкость ломать вещи. Хотя это помогает, если у вас есть эти навыки тоже.
Правильное тестирование - это ловкость, которую вы должны понять, если честно. Мой собственный опыт основан на моих собственных наивных развертываниях и последующих ошибках, о которых сообщали пользователи, когда они использовали это в гневе.
Сначала, когда это случилось со мной, меня раздражало, что пользователь намеренно пытался сломать мое программное обеспечение, и я хотел отметить все "ошибки" как "проблемы с обучением". Однако, подумав об этом, я понял, что наша роль (как разработчиков) - сделать приложение максимально простым и надежным в использовании, насколько это возможно даже для идиотов. Наша задача - расширить возможности идиотов, и именно поэтому нам платят доллар. Обработка идиота.
Для эффективного тестирования, подобного этому, вы должны попытаться сломать все. Примите на себя мантию пользователя, который разбивает кнопки и обычно пытается уничтожить ваше приложение странными и чудесными способами.
Предположим, что если вы не найдете недостатков, то они будут обнаружены в производстве вашей компании серьезной потере лица. Возьмите на себя полную ответственность за все эти проблемы и прокляните себя, если в работе обнаружена ошибка, за которую вы несете ответственность (или даже частично).
Если вы делаете большинство из вышеперечисленного, то вам следует начать создавать гораздо более надежный код, однако это немного художественная форма и требует большого опыта, чтобы хорошо разбираться.