|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Добрый день, подскажите, если у класса есть private метод, как его можно протестировать при помощи JUnit. Можно наверное его сделать public, состояние класса он не меняет и ничего страшного, но вот нигде кроме этого класса этот метод не нужен и хочется как-то иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 12:17 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Если кратко - не надо тестировать private методы. Подробнее написано в куче мест, например: https://anthonysciamanna.com/2016/02/14/should-private-methods-be-tested.html ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 12:28 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Но если все-таки захочется открыть метод, то его не обязательно делать public. Он может остаться package private ибо тесты обычно помещаются в тот же пакет что и тестируемые классы. Ну еще есть вариант Reflection конечно, но выглядеть такой тест будет так себе :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 15:41 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Конечно не надо тестировать private-методы. Если вы - owner кода - то сделайте его хотя-бы видимым в области пакета. Если код не ваш и чужой то тем более не стоит тестировать. Его владалец может в новой версии удалить этот метод и что вы будете с этим фактом делать. Я думаю что тема технически перекликается с модульностью (java9-modules) и обсуждать ее надо именно в таком ключе. Не ломать и хачить приватное, а разбираться почему вообще этот метод приватный и что за функционал от него нам понадобилось тестировать, и компетентны ли МЫ вообще брать информацию из чего-то внутреннего и закрытого от спецификаций. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2021, 16:22 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
если хочешь тестировать private методы- самое верное решение сделать из package private то есть в сигнатуре метода просто убрать модификатор доступа далее просто сгенерировать тесты на нужный класс- автоматом создаться пакет - в котором эти методы будут видны ну и извне эти методы не буду видны,как и private- тоесть безопасность не пострадает ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 19:40 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
mayton Конечно не надо тестировать private-методы. тут ты не прав- по факту все методы в коде private- кроме тех,что торчат на контроллерах- и все это нужно тестировать поэтому такие ситуации обыгрываются как package-private а тестировать надо обязательно иначе на прод будет уезжать то,чего вы не ждали ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 19:48 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
asv79 mayton Конечно не надо тестировать private-методы. тут ты не прав- по факту все методы в коде private- кроме тех,что торчат на контроллерах- и все это нужно тестировать поэтому такие ситуации обыгрываются как package-private а тестировать надо обязательно иначе на прод будет уезжать то,чего вы не ждали Приведи пример кода где тебе очень-очень нужно тестировать что-то приватное. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 20:21 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
mayton, легко- те же самые маперы ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 22:00 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Все равно непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2021, 23:47 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Вот решил попробовать Junit 5 и там уже кстати вроде разрешили тестить private методы. Хотя на своем примеры сам натолкнулся на то, что это не ОК, когда передал на вход ф-ии некорректные данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 12:18 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Должен быть принцип тестирования ящика. Подал а вход что-то. Проверил на выходе нечто. А если тебе надо взломать ящик - то тут... вроде как декомпозиция была сделана неверно. Тоесть тут уже либо SingleResp/OpenClosed либо взламывай private но тогда не жалуйся что плохое ООП. Абсурд получается. С одной стороны на каждом собесе тебя спросят зачем нужно сокрытие и с другой стороны ты сам-же пытаешся его нарушить в тестах. А тесты - это иммитация эксплуатации системы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 12:29 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
da17, Дай пример метода и пример кода. Ведь он никому больше в ИС не нужен кроме этого класса? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 12:48 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, а я подумал и понял идею о том, что не надо тестировать private методы. Если еще смогу придумать зачем это надо, пока все понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 12:54 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
mayton asv79 пропущено... тут ты не прав- по факту все методы в коде private- кроме тех,что торчат на контроллерах- и все это нужно тестировать поэтому такие ситуации обыгрываются как package-private а тестировать надо обязательно иначе на прод будет уезжать то,чего вы не ждали Приведи пример кода где тебе очень-очень нужно тестировать что-то приватное. имхо если хочется приватное что то тестировать то мне в скале нравится подход с хелпер объектами. ну или в джавке - статические методы в классе который не инстанциируется. оч круто. я иногда так делаю и основной класс чище получается и потестить что то этакое можно. опять же оставляем хотя бы пакадж прайват. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 16:40 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
asv79 mayton Конечно не надо тестировать private-методы. тут ты не прав- по факту все методы в коде private- кроме тех,что торчат на контроллерах- и все это нужно тестировать поэтому такие ситуации обыгрываются как package-private а тестировать надо обязательно иначе на прод будет уезжать то,чего вы не ждали так тестируй публичный метод который эти прайваты использует. или ты хочешь тестировать прайват методы в классе где никаких других кроме прайватов нет? :) и конструктар тоже прайват? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2021, 16:41 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
da17PetroNotC Sharp, а я подумал и понял идею о том, что не надо тестировать private методы. Если еще смогу придумать зачем это надо, пока все понял. Это ни зачем и никогда не надо. Eсли класс нельзя на 100% покрыть тестами через его не приватный интерфейс - у тебя плохой дизайн класса. всегда. без исключений. Cледствия: 1. если без PowerMock никак, то что не так 2. если в классе надо ослаблять видимость (например с private на package-private) только ради тестирования, то что-то не так 3. да, именно поэтому, Dependency Injection всегда и только - через конструктор 4. да, именно поэтому, private @PostConstruct/@PostLoad и т.п. - отвратительный anti-pattern которого надо избегать любой ценой 5. вообще любой вид инъекции в приватные поля и или методы - фу таким быть. И то что так можно даже в родных API (JPA, JAXB и т.д.) не оправдание ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 14:40 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Да и есть хорошее правило что код должен быть - testable by design изначально. Mockito/PowerMock - играют на особенностях ООП в Java но в то-же время противоречат идеям ООП в принципе. Поэтому их нельзя считать "честным" тестированием. Тоже самое что если-бы С++ делали reinterpret_cast или что-то подобное по отношению к инкапсулируемым полям. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 15:17 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
gmugar Eсли класс нельзя на 100% покрыть тестами через его не приватный интерфейс - у тебя плохой дизайн класса. всегда. без исключений. Реальный пример: есть робот который умеет переливать жидкость из пробирок в другие пробирки. Одна из команд представленна в виде: ВсосатьЖидкость(сколько, откуда, еще доп параметры) . Робот принимает на вход CSV, соответственно классу нужен только один публичный метод: toCsv(). Но в тестах парсить CSV для проверки расчетов очень не удобно из-за чего приходится открывать кой-какие внутренности. А некоторые вещи тестировать через public API в принципе невозможно. Например, мы не можем протестировать в какой момент HashMap делает rehashing, хотя это обязательная составляющая алгоритма без которой весь класс превращается в тыкву. В общем и целом вопреки всеобщему убеждению - тесты по большей части ухудшают дизайн нашего приложения, делая его более гибким (и соответственно сложным) без надобности, ну и открывая внутренности когда не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 17:23 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
В данном топике речь идет о тестах на correctness. Здесь мы проверяем бизнес сценарии использования компонентов. Тесты перформанса (в т.ч) с использованием JMH - это отдельная и сложная тема. Они настолько не похожи на тесты корректности что я-бы их даже не объединял. В проектах для них создают отдельные группы тестирования и заводят отдельные фазы CI. Вообще занятие задачами перформанса - последовательно "калечит код". Это фраза Шипилева. Он даже рисовал кривую качества кода / перформанса и эта гривая имеля ярко выраженный экстремум. Тоесть была точка где и код красив и перформанс - более-менее и дальше чтоб хоть немножко (на 2-3%) поднять speed-up нужно было сломать 50% кода и сделать его нечитабельным и неудобным к использованию. Появляются работы с byte[], char[], c пакетом unsafe e.t.c. Яркий пример - BlockingQueue и Disruptor. Если их сравнивать по способу использования то видно что первый - удобен а второй нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 17:49 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Stanislav BashkyrtsevЛогику очень часть неудобно покрывать через public интерфейс. Потому как наружу класс может отдавать только конечные результаты вычислений, а нам удобней протестировать сначала промежуточные результаты. В итоге нам приходится идти на поводу у тестов ухудшая дизайн: разбивать логику на доп классы или же открывать какие-то методы. Реальный пример: есть робот который умеет переливать жидкость из пробирок в другие пробирки. Одна из команд представленна в виде: ВсосатьЖидкость(сколько, откуда, еще доп параметры). Робот принимает на вход CSV, соответственно классу нужен только один публичный метод: toCsv(). Но в тестах парсить CSV для проверки расчетов очень не удобно из-за чего приходится открывать кой-какие внутренности. Это вот как раз и есть то, как делать нельзя. Никогда. Вы тут фактически сказали "мне не удобно тестировать через честное паблик API класса, поэтому я буду срезать углы". Тем самым закладываются сразу две мины: 1. вы протестировали класс не так как он будет реально использоваться. 2. вы подставили людей, которые при рефакторинге private кишок класса, напорятся на какие-то странные тесты. Да, бывает протестировать класс сложнее чем его написать. Да, бывает что тесты в разы больше по размеру, чем собственно лигика которую тестируют. И наконец, если написать тест реально сдожно, это, опять же, яркий сигнал, что что-то не так с дизаном класса. Но тестировать приваты - это не номральный путь. В нормальном проекте такое никогда не пройдет code review. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 19:46 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
maytonТесты перформанса (в т.ч) с использованием JMH - это отдельная и сложная тема.Я ничего не говорил про JMH и пр. Я не хочу сравнивать две реализации хеш таблиц, я хочу убедиться что свою хеш таблицу с external chaining'ом я реализовал правильно . Т.е. что сам алгоритм написан by the book. И это было бы легко сделать, если бы бакеты были доступны в тестах. Однако это нарушение инкапсуляции. gmugarЭто вот как раз и есть то, как делать нельзя. Никогда.Сразу видно что веду дискуссию с опытным человеком :) gmugar1. вы протестировали класс не так как он будет реально использоваться.Я протестирую его и через public API тоже. Но таких тестов я напишу меньше потому как мне останется проверить лишь то что в строку все собирается верно. А саму математику я смогу протестировать нарушив инкапсуляцию. gmugar2. вы подставили людей, которые при рефакторинге private кишок класса, напорятся на какие-то странные тесты.В сложность создания и поддержки проекта входит как написание prod, так и тестового кода. Если мне при рефакторинге прийдется порефакторить так же тесты и я потрачу на это дополнительных 10 мин, я не буду сильно переживать. А если моему коллеге прийдется потратить доп день на написание сложных тестов в которых еще попробуй разберись потом, то не уверен что оценю этот труд. В какой-то момент эти тесты тоже прийдется рефакторить, а т.к. они будут сложными, то этот рефакторинг опять же усложнится. gmugarИ наконец, если написать тест реально сдожно, это, опять же, яркий сигнал, что что-то не так с дизаном класса.Это уже какое-то новое правило, я тут идею не совсем понял. Почему сложные тесты - это сигнал плохого дизайна? Я видел много простых тестов в ужасных проектах. И там же видел много сложных тестов. И в хороших проектах видел и те, и другие. В общем не замечал пока никакой корреляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2021, 23:10 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev maytonТесты перформанса (в т.ч) с использованием JMH - это отдельная и сложная тема. Я понял ваш месседж. Я просто добавлю что есть некое промышленное тестирование качества бизнес-логики которому вполне достаточно протестировать чёрный ящик. Если ящика по каким-то причинам не достаточно - то его выбрасывают и берут другой ящик или декомпозицию на несколько более мелких. То о чем рассказываете вы насколько далекО от тестинга качества бизнес-логики что его можно просто выделить в одельную категорию и отменить для нее законы ООП. В самом деле. Зачем вам ООП когда вы создаете свою структуру данных. Вот создайте ее. Доработайте до конца. И после этого уже займитесь инкапсуляцией. Это будет в духе SingleResp/OpenClosed. Вот такое вот IMHO. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 00:07 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Stanislav BashkyrtsevЯ протестирую его и через public API тоже. Но таких тестов я напишу меньше потому как мне останется проверить лишь то что в строку все собирается верно. А саму математику я смогу протестировать нарушив инкапсуляцию. При всем уважении, я вашу аргументацию не понимаю и не принимаю. Если для вас нарушение инкапсуляции это нормально - то мы в разных мирах. Вы, уже несколько раз написали, что (в вашем примере) так делается потому что через public API тестировать сложно. Но с каких пор "сложно" стало аргументом в пользу нарушения инкапсуляции? это аргумент ровно в пользу того, что надо что-то менять чтобы сложно не было. Stanislav BashkyrtsevА если моему коллеге придется потратить доп день на написание сложных тестов в которых еще попробуй разберись потом ну так не делайте такие тесты. меняйте дизайн. да хоть декомпозицию тут же применяйте. чтобы все это было легко тестировать и тесты были просты и понятны (что, безусловно, важно, потому что тест, это еще и документация для тестируемого метода) возвращаюсь к вашему примеру с роботом. мне отсюда конечно сложно судить, но я бы это просто на два класса разбил: 1. класс который делает расчеты и возвращает их в виде какой-то "простотестируемой" структуры данных 2. класс который по этой структуре данных генерирует CSV Stanislav BashkyrtsevЭто уже какое-то новое правило, я тут идею не совсем понял. Почему сложные тесты - это сигнал плохого дизайна? Я видел много простых тестов в ужасных проектах. И там же видел много сложных тестов. И в хороших проектах видел и те, и другие. В общем не замечал пока никакой корреляции. мой опыт как раз обычно четко показывал эту зависимость. к самим unit test-ам обычно предъявляют ряд требований. как минимум: Stateless, Easy to write, Readable, Reliable, Fast, "unit, but not integration". и логика дальше простая: если тест не соответствуют требованиям - менять тест, чтобы соответсвовал если привести в соответствие не удается из-за тестируемого кода - менять код, чтобы тест соответсвовал отсюда появляется понятие Untestable Code и разные проистекающие из этого понятия anti-patters. "Unit tests also aid the design" (c) Robert C. Martin (Uncle Bob) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 11:32 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
gmugarПри всем уважении, я вашу аргументацию не понимаю и не принимаю.Я не удивлен :) gmugarЕсли для вас нарушение инкапсуляции это нормально - то мы в разных мирах.Инкапсуляция, как и другие принципы - они не просто из ниоткуда пришли. Если не следовать этим принципам слепо, а понимать зачем и почему, то появляется намного больше вариантов решения проблем. Потому как теперь мы можем взвешивать что хуже: соблюсти этот принцип, но сделать что-то другое сложней. Либо нарушить принцип, но сделать что-то другое проще. Когда встает такой вопрос - мы в любом случае отхватываем проблем, осталось только решить какая из проблем дешевле. gmugarно я бы это просто на два класса разбил: 1. класс который делает расчеты и возвращает их в виде какой-то "простотестируемой" структуры данных 2. класс который по этой структуре данных генерирует CSVЯ ждал когда будет предложен этот вариант. Ведь именно он якобы решает все проблемы: и тестировать проще, и инкапсуляцию можем соблюдать. Но: 1. Если этот доп класс будет public, то тут два варианта: 1.а Мы его предаем в конструктор тому кто создает CSV. В таком случае мы усложнили клиентский код. Т.е. ради тестов мы усложнили прод код . 1.б Мы его создаем внутри класса который в итоге генерит CSV. И если мы их тестируем отдельно, то мы предполагаем что CSV класс использует класс вычислениями и тем самым опять же нарушаем инкапсуляцию. 2. Если этот доп класс будет package private, то: 2.а Мы все равно тестируем не Public API. Т.е. по сути это то же самое что тестировать не public метод. 2.б То же что и в 1.б gmugar"Unit tests also aid the design" (c) Robert C. Martin (Uncle Bob)Не верь всему что пишут на заборах. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 14:16 |
|
Тестирование private методов
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev, +++ gmugar Вы, уже несколько раз написали, что (в вашем примере) так делается потому что через public API тестировать сложно. Но с каких пор "сложно" стало аргументом в пользу нарушения инкапсуляции? А что есть инкапсуляция и что в ней настолько ценного, что ради нее нужно гланды череж ж... лечить? Если инкапсуляция мешает разработке, тестированию, использованию в продуктиве - да ну нафиг такую инкапсуляцию. Бизнес задачи писать/решать нужно, а не перед статуей инкапсуляции UML-диаграммы из распечатанных листингов выкладывать. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 14:24 |
|
|
start [/forum/topic.php?fid=59&msg=40072212&tid=2120410]: |
0ms |
get settings: |
23ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
520ms |
get tp. blocked users: |
1ms |
others: | 392ms |
total: | 1015ms |
0 / 0 |