Size: a a a

JPoint, Java-конференция

2020 July 08

AV

Alexei Vinogradov in JPoint, Java-конференция
Переслано от Alexei Vinogradov
Чтобы разницу пояснить:

Выбрали, что важнее всего покрыть класс CustomerServices.

В нём 8 методов.

Подход A: у кого есть день, открывает timeboxed таск, пишет тесты на 1-2-3 метода - так что бы за 3-4 часа код прошел ревью, был смерджен и закрыт.

Подход B: ставится таск покрыть CustomerServices полностью тестами. На код ревью он идёт только когда все 8 методов покрыты.  Опыт показывает, что задача невыполнима за 1 день, то есть с вероятностью 100% будут перерывы в обработке таска.
источник

AV

Alexei Vinogradov in JPoint, Java-конференция
Переслано от Alexei Vinogradov
Вы за какой вариант
Анонимный опрос
43%
А
16%
В
10%
Не понимаю в чем разница
5%
Свой вариант
26%
Просто посмотреть результат
Проголосовало: 61
источник

s

saksonov 👀 in JPoint, Java-конференция
вариант А тяжко ревьювить будет, с большой вероятностью к CustomerService уже никто никогда не вернется после того как там появятся какие-то тесты
источник

KR

Kirill Romanov in JPoint, Java-конференция
Ну если это классический AnythingService, то у него отдельные методы между собой мало связаны. Можно их считать отдельными юнитами. Не вижу проблемы покрывать их тестами не все вместе
источник

s

saksonov 👀 in JPoint, Java-конференция
потом следующему придется тратить время на то, чтобы понять каких инвариантов не хватает, чтобы покрытие обеспечить
источник

s

saksonov 👀 in JPoint, Java-конференция
Kirill Romanov
Ну если это классический AnythingService, то у него отдельные методы между собой мало связаны. Можно их считать отдельными юнитами. Не вижу проблемы покрывать их тестами не все вместе
ну так более логично, да
источник

AV

Alexei Vinogradov in JPoint, Java-конференция
saksonov 👀
вариант А тяжко ревьювить будет, с большой вероятностью к CustomerService уже никто никогда не вернется после того как там появятся какие-то тесты
Ну допустим, что есть метрики покрытия, то есть пробелы не будут совсем незаметными.

Если ближе к реальности, то тесты таки были уже, но покрытие около 10-25%, то есть фаза "хоть что-то написать для очистки совести" уже позади.
источник

KR

Kirill Romanov in JPoint, Java-конференция
saksonov 👀
потом следующему придется тратить время на то, чтобы понять каких инвариантов не хватает, чтобы покрытие обеспечить
мутационное тестирование спасет мир
источник

NG

Nikita Gryzlov in JPoint, Java-конференция
Alexei Vinogradov
Ну допустим, что есть метрики покрытия, то есть пробелы не будут совсем незаметными.

Если ближе к реальности, то тесты таки были уже, но покрытие около 10-25%, то есть фаза "хоть что-то написать для очистки совести" уже позади.
а вы на новую функциональность и багфиксы начали писать тесты?
источник

AV

Alexei Vinogradov in JPoint, Java-конференция
Nikita Gryzlov
а вы на новую функциональность и багфиксы начали писать тесты?
Да
источник

s

saksonov 👀 in JPoint, Java-конференция
Kirill Romanov
мутационное тестирование спасет мир
ну тут явно не та ситуация, тестированию время судя по всему по остаточному принципу уделяют
источник

s

saksonov 👀 in JPoint, Java-конференция
я не вижу смысла покрывать тестами те модули, в которые в данный момент не вносятся изменения
источник

s

saksonov 👀 in JPoint, Java-конференция
они же как-то работают в проде, значит там не совсем дичь. а когда будете вносить изменения - там тесты появятся сами собой, если следить за тем, чтобы нового кода не было без тестов
источник

AV

Alexei Vinogradov in JPoint, Java-конференция
saksonov 👀
потом следующему придется тратить время на то, чтобы понять каких инвариантов не хватает, чтобы покрытие обеспечить
Да, придётся, но есть орг. воркэраунды.

Если я пишу тест - то стараюсь лучше покрыть один кейс полностью со всеми инвариантами, чем добавлю во все методы один happy path тест.

Если почему-то я придумал восемь инвариантов, но срочно нужно было уехать за молоком, и успел реализовать только 6, то оставил в коде уже заготовки (тестовый метод без реализации или хотя бы коммент TODO) - для всех 8.

Да, для этого нужна культура и дисциплина.
источник

s

saksonov 👀 in JPoint, Java-конференция
т.е. мне кажется это время можно потратить с бОльшей пользой, если придумать какое-то изменение на эти 3-4 часа (наверняка в беклоге есть лоу-приорити баг до которого руки не доходят) и оформить его по всем правилам написания свежего кода (покрыть тестами, прогнать все линтеры на изменяемых файлах и т.д.)
источник

AV

Alexei Vinogradov in JPoint, Java-конференция
saksonov 👀
они же как-то работают в проде, значит там не совсем дичь. а когда будете вносить изменения - там тесты появятся сами собой, если следить за тем, чтобы нового кода не было без тестов
Не совсем так. Эти методы не будут часто меняться, но будут использоваться- как напрямую, так и служить болванкой для решения аналогичных проблем.

Иногда (по совести часто, на практике увы нет) - написание теста просто заставляет отрефакторить и сам код. Если не писать тесты и не рефакторить - то обычно вызывающие модули вносят костыли, которые долго и больно извлекать (потом они конечно остаются на всегда- "по историческим причинам").

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

AV

Alexei Vinogradov in JPoint, Java-конференция
saksonov 👀
т.е. мне кажется это время можно потратить с бОльшей пользой, если придумать какое-то изменение на эти 3-4 часа (наверняка в беклоге есть лоу-приорити баг до которого руки не доходят) и оформить его по всем правилам написания свежего кода (покрыть тестами, прогнать все линтеры на изменяемых файлах и т.д.)
И еще одна причина - в эти 3-4 часа чаще приходит идея взять новую стори и накодярить туда реализацию без тестов.
источник

s

saksonov 👀 in JPoint, Java-конференция
Alexei Vinogradov
И еще одна причина - в эти 3-4 часа чаще приходит идея взять новую стори и накодярить туда реализацию без тестов.
ну вот это надо пресекать
источник

AV

Alexei Vinogradov in JPoint, Java-конференция
saksonov 👀
ну вот это надо пресекать
Это да.
источник

s

saksonov 👀 in JPoint, Java-конференция
меньше вреда будет если разраб просто эти 3-4 часа попинает, чем замержит новое говно без тестов
источник