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