Пытаюсь решить две задачи.
- Процент покрытия тестами кода (собственно).
- Оптимизация проверки коммитов тестами.
Насчет первого всё более-менее понятно:
- парсим замер прозводительности (например, так делает @pumbaE )
- генерируем отчет в каком-нибудь принятом формате (covertura, lcov). Хотя мне больше понравился отчет, который показывает Istanbul.
Примеры отчетов:
https://raw.githubusercontent.com/jenkinsci/cobertura-plugin/master/src/test/resources/hudson/plugins/cobertura/coverage-with-data.xml
http://dev-builds.libreoffice.org/lcov_reports/bugzilla-docs/index.html
http://gotwarlost.github.io/istanbul/public/coverage/lcov-report/index.html
Насчет пункта “два”, я ещё не определился.
Смысл действа в том, чтобы при каждом коммите не прогонять все тесты, а только те что действительно пересекаются с данным коммитом. Это имеет смысл, когда имеем группу разработчиков (у меня 7 человек), которые делают много мелких коммитов. Если на каждый из них делать полный прогон тестов, то легко получить ситуацию, когда сервер, занимающийся будет затыкаться.
Ситуация более чем реальна, т.к. есть примеры проектов, где прогон всех тестов уже занимает больше 20 минут, а степень покрытия тестами сильно далека от 100%. Т.е. если за час каждый разработчик сделает по одному коммиту (что довольно мало), то уже получаем два часа тестов. Следовательно получаем медленную реакция системы на “поломку” теста. В идеале хочется увидеть это мгновенно.
Поэтому хочу при активной разработке сделать прогон только необходимых для этого коммита тестов.
Для этого:
- для каждого теста вычисляются модули, с которыми он работает
- для каждого коммита вычисляются модули, которые он затронул
- запускаем тесты из пересечения данных множеств
- профит
Есть ли у кого идеи, как это всё лучше хранить и рассчитывать?
Буду признателен за конструктив.
ЗЫ: Замечу, что при ночном билде остаётся полный запуск ВСЕХ тестов. Это никуда не девается.