Как тестировать приватные методы у классов со сложным поведением? Всем привет.
TDD нам говорит, что все приватные методы класса должны тестироваться через его публичные контракты. И это вполне работает в том случае, если все возможные выводы класса можно получить используя достаточно простые к нему запросы (аля классические примеры из книг по TDD про "имя сотрудника" etc.).
Но когда речь заходит о классах, реализующих какой-нибудь сложный алгоритм, то возникает вот такая загвоздка:
С точки зрения инкапусляции и удобства для пользователя, весь magic, как правило, скрывается за методм с имене вроде process()/compute() etc. внутри которого уже вызывается конвейер из приватных методов, реализующих алгоритм.
В таком случае, если тестировать класс через его публичный контракт, то тест по сложности может не уступать самому алгоритму, а для проверки всех кейсов и превосходить его. Но, при этом, если бы тесты писались для отдельных частей алгоритма, то они, скорей всего, были бы довольно простыми.
И вот тут возникает вопрос: каким образом лучше всего организовать тестирование скрытой от пользователя функциональности класса?
з.ы. на ум приходит, конечно, мысль о разбиении класса на модули, но тогда у них появляются "жирные" интерфейсы, т.к. придется в интерфейсе передавать всю необходимую для вычислений информацию из основного класса. Ну либо в тесте наследоваться от тестируемого класса и явно вызывать приватные методы, что не является красивым решением.
з.з.ы чтобы было понятно о чем я говорю, вот пример мной когда-то написанного класса с ужасным, с точки зрения тестирования, дизайном.

21 Авг 2019 в 07:08
264 +1
0
Ответы
1

Для тестирования приватных методов классов со сложным поведением можно использовать различные подходы. Некоторые из них включают в себя:

Рефакторинг: Переносите сложные алгоритмы из приватных методов в отдельные классы или модули, которые могут быть легко протестированы. Это позволит вам тестировать каждую часть алгоритма отдельно, что облегчит отладку и обнаружение ошибок.

Разбиение на более мелкие методы: Если ваш приватный метод выполняет слишком много задач, разбейте его на более мелкие методы, которые могут быть протестированы независимо.

Использование рефлексии: Хотя это не рекомендуется из-за потенциальных проблем с безопасностью, иногда можно использовать рефлексию для вызова приватных методов в тестах.

Использование mock-объектов: Если приватный метод зависит от внешних ресурсов (например, базы данных или внешних сервисов), вы можете использовать mock-объекты для эмуляции этих ресурсов и тестирования метода независимо от них.

Использование white-box testing: Если вы не можете изменить дизайн класса или разбить его на модули, попробуйте провести white-box testing, при котором вы будете анализировать код и тестировать каждую ветку выполнения отдельно.

Выбор подхода зависит от конкретной ситуации и предпочтений команды. Важно помнить, что цель тестирования - обеспечить работоспособность и надежность кода, поэтому выберите подход, который наилучшим образом соответствует вашим потребностям и условиям проекта.

20 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир