Как упростить мои юнит-тесты, используя макеты - PullRequest
1 голос
/ 13 февраля 2020

У меня реальная проблема с моими юнит-тестами. В настоящее время я работаю над 2-летним проектом и пишу юнит-тесты в течение 2 месяцев. Из-за сложности кода большинство функций, которые необходимо протестировать, вызывают от 5 до 15 других функций, и в каждой функции используется около 5 объектов с 10 параметрами. Вначале я тестировал только простые функции basi c с Junit и EasyMock, но сейчас я работаю с этим типом сложной функции, настройка макетов и их поведения занимает около 300 строк для каждого тестового примера, что для меня.

У вас есть какие-нибудь альтернативные решения для решения этой проблемы?

1 Ответ

2 голосов
/ 13 февраля 2020

Во-первых, сделайте различие, какие зависимости действительно беспокоят вас. См. { ссылка } для списка критериев, которые делают зависимости проблематичными. Те зависимости, которые не доставляют хлопот, не требуют проверки.

Во-вторых, если у вас есть такая возможность, попробуйте изменить дизайн кода: отделить код с преобладанием вычислений (код без проблемных зависимостей) от кода с преобладанием взаимодействия ( код в основном имеет дело с вызовом другого кода). Теперь посмотрим на части кода, где вы могли бы достичь такого разделения идеально: из этих частей кода протестируйте код с помощью вычислений (и, возможно, без проблемных зависимостей) с модульным тестированием - здесь, очевидно, нет необходимости в насмешках. Код, который состоит только из взаимодействий, которые вы будете тестировать с помощью интеграционного тестирования, опять же без насмешек.

В-третьих, скорее всего, останутся части кода, где такое идеальное разделение сложно, и вы останетесь с вычислениями, смешанными с взаимодействиями. Здесь вам, возможно, придется провести юнит-тестирование с двойниками. Для этих случаев существуют также некоторые стратегии перепроектирования, которые могут уменьшить усилия по издевательству. Например, концентрируя доступ к определенным зависимостям в вспомогательных методах (например, вспомогательный метод, который выполняет работу по извлечению, аутентификации и распаковке некоторых данных): после такой перепроектировки вместо того, чтобы имитировать несколько зависимостей (тот же пример: в базу данных, библиотеку аутентификации, библиотеку сжатия) вам нужно только смоделировать вашу вспомогательную функцию.

Эта стратегия может сэкономить вам много усилий для создания двойников.

...