Skip to content

Instantly share code, notes, and snippets.

@bbrodriges
Created December 30, 2013 05:44
Show Gist options
  • Save bbrodriges/8178248 to your computer and use it in GitHub Desktop.
Save bbrodriges/8178248 to your computer and use it in GitHub Desktop.
Автоматическая генерация отчетов покрытия кода тестами по номеру задачи в коммитах.
# шаблон конфига phpunit.xml
XMLDUMMY="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<phpunit bootstrap=\"work/tests/TestHelper.php\"
backupGlobals=\"false\"
backupStaticAttributes=\"false\"
colors=\"true\"
processIsolation=\"true\"
verbose=\"true\">
<filter>
<whitelist processUncoveredFilesFromWhitelist=\"true\">
#ORIGINAL_FILES
</whitelist>
</filter>
<testsuites>
<testsuite name=\"Test\">
#TEST_FILES
</testsuite>
</testsuites>
<logging>
<log type=\"coverage-html\" target=\"build/coverage\" title=\"Coverage Report\"
charset=\"UTF-8\" yui=\"true\" highlight=\"true\"
lowUpperBound=\"35\" highLowerBound=\"70\" />
<log type=\"coverage-text\" target=\"php://stdout\" showUncoveredFiles=\"true\"/>
</logging>
<php>
<ini name=\"memory_limit\" value=\"2048M\" />
</php>
</phpunit>
"
# счетчик для массива с файлами
COUNTER=0
# обязательно нужен номер задачи
if [ $# -eq 0 ]
then
echo "Usage: autopu.sh #task_number (e.g. AA-6423)"
exit 1
fi
# получаем коммиты по номеру задачи
for COMMIT in $(git log --grep=$1 --pretty=oneline | awk '{print $1}')
do
# получаем файлы из коммита
for FILE in $(git diff-tree --no-commit-id --name-only -r $COMMIT)
do
# проверяем, что файл не относится к тестам. Если относится - пропускаем
if [[ "$FILE" == *tests/* || "$FILE" == *Test.php* || "$FILE" == *AllTests.php* || "$FILE" == *views/* || "$FILE" != *.php* ]]
then
continue
fi
# проверяем, что файла нет в массиве файлов (уникальный путь к файлу)
case "${FILES_ARRAY[@]}" in *$FILE*)
continue
;;
esac
# пишем файл в массив файлов
FILES_ARRAY[$COUNTER]=$FILE
# прибавляем счетчик для массива
COUNTER=$COUNTER+1
done
done
ORIGINAL_FILES=""
TEST_FILES=""
# итерируемся через файлы и прогоняем тесты для каждого с генерацией отчета по покрытию
for FILE in "${FILES_ARRAY[@]}"
do
ORIGINAL_FILES="$ORIGINAL_FILES<file>work/$FILE</file>"
# разбиваем путь к файлу по "/""
FILE_PARTS=(${FILE//\// })
# определяем проект файла
FILE_PROJECT="${FILE_PARTS[0]}"
# определяем имя файла
FILE_NAME=$(basename $FILE)
# определяем имя теста
TEST_FILENAME=(${FILE_NAME//\.php/Test\.php})
# ищем файл теста в папке тестов проекта и пишем в массив
TEST_FILES="$TEST_FILES<file>$(find ~/work/tests/projects/$FILE_PROJECT/ -name "$TEST_FILENAME")</file>"
done
# формируем xml-файл конфига с нужными файлами
TMP=${XMLDUMMY/"#TEST_FILES"/$TEST_FILES}
TMP=${TMP/"#ORIGINAL_FILES"/$ORIGINAL_FILES}
echo $TMP > ~/tmp-phpunit.xml
mkdir -p ~/coverage-html/$1
/usr/bin/phpunit --coverage-html ~/coverage-html/$1 --configuration ~/tmp-phpunit.xml
rm -f ~/tmp-phpunit.xml
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment