Вы проверяете вещи там, где вы
- хочу убедиться, что ваш алгоритм работает
- хочу защитить от случайных изменений в будущем
Так что в вашем примере нет смысла тестировать сгенерированные классы. Вместо этого проверьте генератор.
Рекомендуется сначала протестировать основные варианты использования (для чего была разработана проверяемая функция). Затем вы проверяете основные случаи ошибок. Затем вы пишете тесты для угловых случаев (то есть нижних и верхних границ). Случаи необычных ошибок, как правило, настолько трудно воспроизвести, что нет смысла их модульное тестирование.
Если вам необходимо проверить большой диапазон наборов параметров, используйте управляемое данными тестирование.
Сколько тестируемых вами вещей зависит от усилий и отдачи, так что это действительно зависит от конкретного проекта. Обычно вы пытаетесь следовать правилу 80/20, но могут быть приложения, где вам нужно больше тестового покрытия, потому что сбой будет иметь очень серьезные последствия.
Вы можете значительно сократить время, необходимое для написания тестов, если вы используете подход, основанный на тестировании (TDD). Это связано с тем, что код, который написан не с точки зрения тестируемости, намного сложнее, иногда почти невозможно протестировать. Но поскольку ничто в жизни не является бесплатным, код, разработанный с использованием TDD, сам по себе более сложен.