Начнем с очевидного:
Как работает тестирование? При разработке через тестирование вы сначала думаете о функциональности, которую хотите реализовать, а затем пишете тест для нее. В приведенном вами примере функции суммы совершенно очевидно, что она должна делать. Затем вы пишете тест, который проверяет, что суммирование сработало.
Модульные тесты должны быть максимально легкими, чтобы вы могли запускать их при каждом нажатии кнопки сборки. Когда вы сделаете это сейчас, в этом примере ваш тест не пройден, потому что вы еще не реализовали функцию суммы.
Теперь вы пишете реальную функцию и продолжаете отладку и реализацию, пока тест не пройдет. Тогда вы уверены, что реализовали нужную функцию.
Теперь, как вы должны разработать свой тест? Вы не можете проверить все, это невозможно. В качестве примера, скажем, вы берете пользовательский ввод, который вы должны проверить. Тогда было бы естественным написать по крайней мере два контрольных примера для этого кода проверки: один, который гарантирует, что действительный ввод анализируется как таковой. Второй тестовый случай получает неверный ввод, и вы убедитесь, что он не работает, вызывает исключение или любое другое поведение по вашему желанию. Так что в этом случае хорошо иметь положительный тест, который, как ожидается, будет пройден, и отрицательный тест, который проверяет, не подтвержден ли неверный ввод.
Когда должен проводиться один тест? Как я уже говорил, тест должен быть достаточно легким, чтобы его можно было запускать в каждой сборке. И да, запустите их все. Это гарантирует, что вы не пропустите зависимость в своем коде, которая разрушает вещи далеко от точки, которую вы редактировали.
Можно ли что-нибудь проверить? Ну, обычно методы, основанные на внешних ресурсах, трудно проверить. Под этим я подразумеваю базы данных, сетевые подключения или конкретное оборудование и драйверы. Это может быть сделано, но тогда вам нужно настроить тестовую установку большего размера.
Исправление ошибок и тесты Типичный сценарий, когда тестирование становится действительно полезным, - это если вы сжимаете ошибки. Не буквально конечно. Если у вас есть ошибка, которую нужно исправить, сначала попробуйте написать тест для нее. И затем исправьте свой код, пока ваш тест не пройдет. С этого момента этот тест «следит за вашим кодом», что эта ошибка больше никогда не вернется.
Что вы получаете, тестируя? На мой взгляд, есть много вещей
- Более модульный, более простой в обслуживании код, потому что он должен быть тестируемым
- Уверенность. Наличие базы кода, которая в значительной степени протестирована, дает вам уверенность в том, что она работает так, как ожидалось, и остается такой.
- Вы рано находите ошибки. Это означает, что вы можете легко их исправить.
Требуется некоторое усилие, чтобы привыкнуть к использованию тестов, но я думаю, что оно того стоит. Особенно, если вы пишете какие-то библиотеки.