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

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

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

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

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

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

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

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

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

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир