Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Есть ли какие -либо соображения по производительности при широком использовании матчевых матчеров аргументов


Есть ли какие -либо соображения по производительности при широком использовании матчевых матчеров аргументов


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

1. Обработка маттера **

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

2. Правила комбинации маттера **

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

3. Пользовательские совпадения **

- Комплексная логика: в то время как Mockito предоставляет широкий спектр встроенных совпадений, вам может потребоваться создание пользовательских матчеров для конкретной логики. Пользовательские совпадения могут быть более дорогими вычислительными, если они связаны с сложной логикой или операциями. Это связано с тем, что они требуют реализации интерфейса `arcyrymatcher` и определения метода` matches () `, который может выполнять произвольные проверки.

4. Проверка накладных расходов **

- Проверка с помощью сопоставщиков: При проверке взаимодействия с макетными объектами с использованием `revify ()`, Mockito также использует совпадения, чтобы проверить, были ли переданы правильные аргументы. Подобно заглушке, проверка с маттерами может ввести некоторые накладные расходы, особенно если вы проверяете несколько вызовов со сложными совпадами.

5. Лучшие практики для производительности **

- Используйте специфичность с умом: используйте совпадения с правильным уровнем специфичности. Например, `anyint ()` менее специфичен и быстрее, чем `eq (4)`, но использование `eq (4)`, когда вам нужно проверить конкретное значение, является более точным и не влияет на производительность.
- Избегайте ненужной сложности: избегайте использования пользовательских совпадений, если это необходимо. Если тест требует сложной логики для соответствия аргументам, рассмотрите возможность упрощения теста или творческого использования существующих совпадений.
- Профилируйте ваши тесты: если вы заметите проблемы с производительностью в своих тестах, профилируйте их, чтобы идентифицировать узкие места. Для матчеров Mockito редко станет основной причиной значительных проблем с производительностью, но всегда хорошо проверить.

Таким образом, в то время как матчеры аргументов Mockito вводят некоторые накладные расходы, это, как правило, не является серьезной проблемой, если вы не имеете дело с чрезвычайно сложными или критическими тестами. Преимущества использования маттера, такие как гибкость и ясность в коде тестирования, обычно перевешивают незначительные затраты на производительность.

Цитаты:
[1] https://stackoverflow.com/questions/56559146/junit-using-eq-argument-matcher-vs-passing-string-directly/56572275
[2] https://www.digitalocean.com/community/tutorials/mockito-argument-matchers-any-eq
[3] https://kenkousen.substack.com/p/tales-from-the-jar-side-a-mockito
[4] https://www.softwaretestinghelp.com/mockito-matchers/
[5] https://www.toptal.com/java/a-guide-te-everyday-mockito
[6] https://github.com/etorreborre/specs2/issues/854
[7] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.mockito.additionalmatchers
[8] https://stackoverflow.com/questions/73046134/when-should-i-use-argument-matcher-or-passing-argument-directly-when-mockito-uni