Причина, по которой не тестируются частные методы, заключается в том, что рекомендуется проверять только то, что клиент может использовать из библиотеки.
Многие люди объясняют " «цели юнит-тестирования, но на самом деле они описывают свои цели при проведении юнит-тестирования. Модульное тестирование применяется во многих различных областях и контекстах, начиная с игрушечных проектов, но заканчивая программным обеспечением для атомных станций, относящимся к безопасности, самолетами и т. Д. c.
Другими словами, разработано много программного обеспечения. где вышеупомянутая рекомендация может быть в порядке. Но вы можете применить модульное тестирование гораздо дальше. Если вы не хотите начинать с ограниченного представления о том, что такое модульное тестирование, вам лучше взглянуть на него следующим образом: Одна из основных целей тестирования в целом, а также для модульного тестирования - найти ошибки (см. Myers, Badgett, Sandler: Искусство тестирования программного обеспечения или Beizer: методы тестирования программного обеспечения, а также многие другие).
Полагая, что модульное тестирование связано с поиском ошибок, вы можете также проверить детали реализации: ошибки в реализации - разные реализации одной и той же функциональности имеют разные ошибки. Возьмем простую функцию Фибоначчи: ее можно реализовать как рекурсивную функцию, как итеративную функцию, как закрытое выражение (Moivre / B inet), используя рукописную таблицу поиска, используя автоматически сгенерированную таблицу поиска и др * * тысяча двадцать-одна. Для каждой из этих реализаций набор вероятных ошибок будет существенно отличаться.
Другой пример - сортировка: существует множество функций сортировки, которые с функциональной точки зрения делают одно и то же, а многие даже имеют одного и того же пользователя. интерфейс. Алгоритм IntroSort довольно интересен с точки зрения тестирования, потому что он реализует быструю сортировку, но когда он понимает, что сталкивается с вырожденной сортировкой, он возвращается к другому алгоритму (обычно кучи-сортировка). Тестирование IntroSort означает также создание такого вырожденного набора данных, который заставляет алгоритм войти в сортировку кучи, просто чтобы быть уверенным, что потенциальные ошибки в части сортировки кучи могут быть найдены. Глядя на один только интерфейс publi c, вы никогда бы не придумали такой тестовый случай (по крайней мере, это было бы совпадением).
Подведем итог: тестирование деталей реализации ни в коем случае не является плохой практикой , Это обходится дорого: проверки того, что go в деталях реализации, безусловно, с большей вероятностью сломаются или станут бесполезными при изменении реализации. Следовательно, от вашего проекта зависит, является ли поиск большего числа ошибок более важным, чем экономия усилий по обслуживанию тестов.
Относительно возможностей сделать частные функции доступными для тестов, но все же не сделать их частью "официальной" публикации c interface: @ Cubi c хорошо объяснил разницу между а) тем, что public
в техническом смысле правил видимости данного языка программирования, и б) принадлежностью к "официальному" и документированному API publi c .