Я пытаюсь привыкнуть регулярно писать модульные тесты с моим кодом, но я прочитал, что сначала важно написать тестируемый код . Этот вопрос касается твердых принципов написания тестируемого кода, но я хочу знать, полезны ли эти принципы проектирования (или, по крайней мере, не вредны), не планируя писать тесты вообще. Чтобы уточнить - я понимаю важность написания тестов; это не вопрос их полезности.
Чтобы проиллюстрировать мою путаницу, в статье, которая вдохновила этот вопрос, автор приводит пример функции, которая проверяет текущее время и возвращает некоторое значение в зависимости от времени. Автор указывает на это как на плохой код, потому что он выдает данные (время), которые он использует внутри, что затрудняет его тестирование. Мне, однако, кажется, что излишне убивать время в качестве аргумента. В какой-то момент значение должно быть инициализировано, и почему бы не приблизиться к потреблению? Плюс, цель метода в моем уме - вернуть некоторое значение, основанное на текущем времени , делая его параметром, который подразумевает, что эта цель может / должна быть изменена. Этот и другие вопросы заставляют меня задаться вопросом, является ли тестируемый код синонимом «лучшего» кода.
Является ли написание тестируемого кода хорошей практикой даже при отсутствии тестов?
Действительно ли тестируемый код более стабилен? был предложен в качестве дубликата. Однако этот вопрос касается «стабильности» кода, но я спрашиваю более широко о том, является ли код лучше по другим причинам, таким как читаемость, производительность, связывание и так далее.
func(X)
возвращается "Morning"
, то замена всех вхождений func(X)
с "Morning"
не изменит программу (то есть призвание. func
Ничего, кроме возвращения значения не делать). Идемпотентность подразумевает либо то func(func(X)) == X
(что не является корректным по типу), либо то, что имеет func(X); func(X);
те же побочные эффекты, что и func(X)
(но здесь нет побочных эффектов)