t.me/atinfo_chat Telegram группа по автоматизации тестирования

final test class есть ли в этом необходимость?

Теги: #<Tag:0x00007fd76ddc1dc8> #<Tag:0x00007fd76ddc1c10>

Всем привет.
В общем и целом, такой вопрос. Насколько целесообразно помечать тест класс как final? Влияет ли это каким-то образом на производительность или компиляцию. Может есть какие статьи на эту тему? В гугле похожего ничего не нашел(
Спасибо.

Скорее не влияет, чем влияет. Лучше не забивать этим голову. Оно не для перфоманса было сделано. Обычно узкие места в совсем иных местах. Вот тут пишут, что делали тест и влияния на производительность не зафиксировано:
https://www.javamex.com/tutorials/java_final_performance_vs_non_final_timings.shtml
Но тесты на производительность очень тонкая материя. Доверять этим выводам или нет - решать вам. К тому же оптимизации могут отличатся в разных реализациях java-машины.

Типичное использование модификатора final на классе хоть как-то обосновано лишь в случае утилитных классов (аля хэлперы). Ибо по факту, таким образом мы запрещаем наследование, которое, к слову, бессмысленно при наличии одних лишь статических методов и приватного конструктора. Т.е. это скорее подсказка людям, использующим этот класс, что он - stateless и это сделано by design.

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

В общем, использовать final на тестовых классах можно, но практического смысла в этом мало. И это скорее вызовет уйму вопросов у ревьюверов: мол, зачем?

2 Симпатий

Eсли это еще и ui тесты то оптипизациями на уровне синтаксиса вобще забейте. Вон в Селениуме в основной либе три обращения к апи драйвера при проверке тега элемента, в SelectElement классе, вот про такие оптимизации нужно думать)

уже пофиксили)

На скорость компиляции и производительность не повлияет. Если у вас будет миллион final классов и 10 миллионов инстансов этих классов скорость компиляции, загрузки классов, работы с отражениями и объектами по сравнения с открытыми классами не будет.

final повлияет на архитектуру приложения и безопасность.
На основании советов из Эффективное програмирование на Java нужно максимально ограничивать ваш класс, то есть использовать final и открывать для наследования, только если вы уверены в безопасности наследования. Хотя для тестовых классов, которые будет расширять максимум один человек абсолютно не важно final он или нет.