[Moscow.pm] Встреча Moscow.pm в феврале

Ivan Petrov i.petro.77.00 на gmail.com
Ср Янв 22 05:30:13 PST 2014


>> У вас в объекте есть несколько методов, которые по идеологии юнит
>> тестирования нужно/можно протестировать отдельно.
>> Например:
>> new - хорошо бы протестировать, что этот метод правильно производит
>> начальную инициализацию переменных в зависимости от переданныех параметров

> на такой бред я не буду тратить время.

+1 

если у вас в коде написано

sub foo { return 1 }

то совершенно не нужен тест

is foo, 1, 'foo работает как надо';

это уже удорожание системы тестов совершенно необоснованное.

вообще от тестов что требуется?

1. получить от них "обратную связь" о том, что "все работает"
2. получить от них "обратную связь" о том, что при внесении последних
'улучшений' в программу что-то работать перестало

теперь идем дальше.

стоимость.

допустим имеем программу X и тесты к ней Y.

стоимость написания X - 10 руб (рубли - условная единица!)
стоимость написания Y - 5 руб

я считаю это где-то с одной стороны оптимумом, а с другой стороны
максимумом стоимости Y.

оптимум этот еще и в контексте вероятности (которое от покрытия
зависит) обнаружения проблем тестов

допустим Y обнаруживает проблемы при внесении их в 80% кода, а 20% не
обнаруживает.
вероятность обнаружения проблем (или покрытие) Y при стоимости 1/2
равно 0.8. я считаю это ОЧЕНЬ хорошим покрытием.

как мне кажется (на основе моего опыта) начиная с уровня покрытия
где-то 60-70% стоимость дополнительного покрытия растет несоизмеримо.

то есть если у вас отношение стоимости Y/X = 1/2, покрытие при этом 0.6.
то увеличение покрытия с 0.6 до 0.7 зачастую приведет к Y/X == 1.
это _моя_ эмпирика (в основном событийно-ориентированные приложения).

при покрытии тестами 0.6, если мы вносим одно исправление, то
вероятность обнаружения проблемы считаем тоже 0.6.
вероятность того что мы проблему тоже внесли при этом - 0.5 (по
принципу "встречу динозавра или нет").
тогда в случае если тесты все прошли, то то что выкатка даст сбой в
продакшене - где-то 20%.

на самом деле на покрытии 0.6 я наблюдаю проблемы где-то в 2% случаев,
то есть видимо принцип "динозавра встречу или нет: 50%" тут наверно не
применим.

то есть моя оценка: человек делает ошибку в среднем в 2% случаев.

далее.
если у вас покрытие тестами 0.6, то это покрытие считают обычно
покрытием по алгоритмике. покрытие тестами на "компилируемость" при
общем покрытии 0.6 обычно около единицы.

интеграционнные тесты.

с одной стороны это очень хорошая штука (когда есть), а с другой -
обычно очень дорогая.
то есть например имеем http-RPC: сервер, клиент.

так вот если мы пишем на клиент _самостоятельные_ тесты которые
проверяют протокол, запросы итп, затем пишем _самостоятельные_ тесты
на сервер. то интеграционных тестов у нас вроде бы и нет.
но их написание реально обойдется где-то (опять моя оценка) в 1/2 от
стоимости имеющихся тестов вообще.
при этом мало что даст (то есть на большинстве шагов проблемы будут
находиться самостоятельными тестами в первую очередь и очень редко
интеграционными).



Подробная информация о списке рассылки Moscow-pm