Вам не нужно тестировать реализацию вашей функции. Если вы написали foo = 'bar'
внутри своей функции, то вам не нужно проверять, правильно ли foo
было присвоено значение 'bar'
;Вы можете просто ожидать, что это сработает. С юнит-тестами вы хотите быть на один шаг более абстрактным . Вы хотите проверить, верна ли ваша функция multidim_interp_function
правильные результаты при некотором известном вводе. Относитесь к функции так же, как к другим функциям в Python: вы не написали бы модульный тест, чтобы выяснить, как работает max()
, вместо этого вы бы написали тест, утверждающий, что max(3, 4)
возвращает значение 4
.
Мало того, что нецелесообразно проверять "внутренние" функции, это то, что внутренние функции могут изменить . Если вы пишете свои модульные тесты и обнаруживаете, что в вашем коде есть какая-то ошибка, то вы собираетесь изменить свой код. Или вы можете позже вернуться и реорганизовать внутренние компоненты, чтобы сделать их более эффективными, или дедуплицировать некоторый код в вашем модуле, или что-то еще. Вы не хотели бы переписывать свои юнит-тесты каждый раз. Так что не стоит писать свои юнит-тесты, чтобы быть слишком конкретными. Ваши модульные тесты должны протестировать открытый интерфейс функции (аргументы и возвращаемые значения), чтобы вы могли убедиться, что этот интерфейс не изменится (т. Е. Функция продолжает вести себя одинаково), даже если вы переместили некоторыекод вокруг. Если с помощью вашего модульного теста или иным образом вы обнаружите, что внутри функции есть какое-то неправильное поведение, то вы можете вмешаться с помощью отладчика и подтвердить каждое отдельное утверждение один за другим, чтобы найти причину проблемы.
Чтобы прийти к правильному мышлению, попробуйте Разработка на основе тестов , в которой вы сначала пишете свои тесты, по существу решая, как должна вести себя функция , а затемвы реализуете внутреннюю часть функции, все время имея возможность проверить, соответствует ли ваша реализация ожидаемому.