В прошлом году я написал небольшую заметку о нефункциональном тестировании — т.е. о тестах пытающихся выявить уродливый и сложный в сопровождении код. Конечно такие тесты не гарантируют идеального кода, но какой-то минимальный уровень качества обеспечат т.к. несмотря на очевидность требований этих тестов многие их игнорируют и потом приходиться разбираться в процедурах на 5 000 строк.
Заметка в ЖЖ не вызвала ожидаемой мной обратной связи (хотелось бы знать что я упустил), поэтому несмотря на сопротивление хабра решил выложить продолжение тут (спасибо людям добавившим кармы).
Со времени публикации первой заметки произошли следующие изменения:
— добавил тест на цикломатическую сложность и количество строк блока кода (04_complexity.t ), для цикломатической сложности максимум выставил в 20 (некоторые предлагают 30, но это каждый сам корректирует — рост вероятности ошибочного фикса см. тут), максимальное число строк в блоке выставил наобум — 50, правьте по себе, но помните — если в блоке есть вложенные ветвления и его нужно скроллить на экране, то это уже неэффективно.
— добавил тест на наличие use warnings (05_warnings.t)
— варнинги в 08-code-coverage.t появляются у меня только на FreeBSD, на Ubuntu тест нормально отрабатывает, но пришлось уменьшить величину покрытия
— полученный результат выложил на github
Что мы знаем если все тесты прошли успешно?
Мы знаем что:
— код компилируется без ошибок
— включены строгие прагмы
— не осталось пометок FIXME
— Perl::Critic считает что наш код соответствует Perl Best Practice
— цикломатическая сложность и число строк функции (или кода вне функции) не превышают пороговых значений
— в коде есть POD, он корректен и покрывает все функции
— определённый процент кода покрыт тестами
— состав дистрибутива соответствует формальным требованиям CPAN
Надо бы ещё проверять максимальную вложенность условий (5) и циклов (2) и возможно ещё какие-нибудь метрики кода, но готового модуля пока не нашёл, возможно нужно писать.
upd. уже есть патч от cub.uanic, завтра гляну — вроде полезный
Заметка в ЖЖ не вызвала ожидаемой мной обратной связи (хотелось бы знать что я упустил), поэтому несмотря на сопротивление хабра решил выложить продолжение тут (спасибо людям добавившим кармы).
Со времени публикации первой заметки произошли следующие изменения:
— добавил тест на цикломатическую сложность и количество строк блока кода (04_complexity.t ), для цикломатической сложности максимум выставил в 20 (некоторые предлагают 30, но это каждый сам корректирует — рост вероятности ошибочного фикса см. тут), максимальное число строк в блоке выставил наобум — 50, правьте по себе, но помните — если в блоке есть вложенные ветвления и его нужно скроллить на экране, то это уже неэффективно.
— добавил тест на наличие use warnings (05_warnings.t)
— варнинги в 08-code-coverage.t появляются у меня только на FreeBSD, на Ubuntu тест нормально отрабатывает, но пришлось уменьшить величину покрытия
— полученный результат выложил на github
git clone git@github.com:worldmind/perl-test-code-quality-template.git
Что мы знаем если все тесты прошли успешно?
Мы знаем что:
— код компилируется без ошибок
— включены строгие прагмы
— не осталось пометок FIXME
— Perl::Critic считает что наш код соответствует Perl Best Practice
— цикломатическая сложность и число строк функции (или кода вне функции) не превышают пороговых значений
— в коде есть POD, он корректен и покрывает все функции
— определённый процент кода покрыт тестами
— состав дистрибутива соответствует формальным требованиям CPAN
Надо бы ещё проверять максимальную вложенность условий (5) и циклов (2) и возможно ещё какие-нибудь метрики кода, но готового модуля пока не нашёл, возможно нужно писать.
upd. уже есть патч от cub.uanic, завтра гляну — вроде полезный