Тестовое покрытие в команде с Джанго - PullRequest
3 голосов
/ 15 декабря 2010

У меня работает teamcity, и он создает и запускает собственный тестовый прогон (http://pypi.python.org/pypi/teamcity-messages)

Я безрассудно обманул этот пост: TeamCity для непрерывной интеграции Python / Django

Мой метод run_suite выглядит следующим образом:

from teamcity import underTeamcity
from teamcity.unittestpy import TeamcityTestRunner
return TeamcityTestRunner().run(suite)

В настоящее время я использую django_coverage с cover.py и хотел бы, чтобы teamcity получила данные о тестовом покрытии.

Я не связан с teamcity, но я предпочитаю использовать его в качестве CI-сервера, но я могу перейти на другой, если это проще.

Как я могу получить данные, которые ./manage.py test_coverage печатает в teamcity?

Ответы [ 2 ]

1 голос
/ 18 апреля 2017

TeamCity Coverage

В TeamCity я освещаю Джанго следующим образом

Создание отчета о покрытии по вызову make ci_test Использование команды Makefile.

VENV_PATH := $(HOME)/venv/bin
PROJ_NAME := my_awesome_project

# ...

ci_test: cover_test cover_report

cover_test:
    $(VENV_PATH)/coverage run --source=$(PROJ_NAME) manage.py test -v 2 --noinput

cover_report:
    $(VENV_PATH)/coverage report -m
    $(VENV_PATH)/coverage html
    $(VENV_PATH)/coverage-badge > htmlcov/coverage.svg

Команда cover_test запускает тесты Django и измеряет охват кода. Команда cover_report выводит отчет об обложке на консоль, а также генерирует html-отчет и, используя утилиту cover-badge , создает красивый значок со статусом покрытия кода значка badge.svg.

После этого артефакты собираются в TeamCity (вкладка General Settings)

teamcity conf

Они собраны во вкладке Artifacts

artifacts

И доступно на сервере CI по пути:

  • /repository/download/%teamcity.project.id%/%teamcity.build.id%:id/htmlcov /index.html
  • /repository/download/%teamcity.project.id%/.lastFinished/htmlcov/index.html

Отчет GitHub

Наконец нажмите GitHub, чтобы отобразить состояние покрытия сборки в репо:

Ожидается покрытие (до сборки)

OWNER="<GITHUB OWNER>";
REPO="<REPO NAME>";
SHA="%build.vcs.number%";

curl "https://api.github.com/repos/$OWNER/$REPO/statuses/$SHA" \
    -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: token <GITHUB API TOKEN>" \
    -d '{
        "state": "pending",
        "description": "Coverage pending.",
        "context": "continuous-integration/coverage"
    }'

копия значка покрытия

BADGE="/path/to/public/dir/badges/%teamcity.project.id%/%teamcity.build.branch%-coverage.svg"
DIR=$(dirname "${BADGE}")
mkdir -p $DIR
cp -f htmlcov/coverage.svg $BADGE

Покрытие Финишный крюк

OWNER="<GITHUB OWNER>";
REPO="<REPO NAME>";
SHA="%build.vcs.number%";

REPORT_URL="http://<YOU TEAMCITY DOMAIN>/repository/download/%teamcity.project.id%/%teamcity.build.id%:id/htmlcov/index.html";

COVERAGE=$(cat ./htmlcov/index.html | grep '<span class="pc_cov">' | grep -o '[0-9]\+');

if [ "$COVERAGE" -ge "85" ]; then
    STATUS='success';
else
    STATUS='failure';
fi

curl "https://api.github.com/repos/$OWNER/$REPO/statuses/$SHA" \
    -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: token <GITHUB API TOKEN>" \
    -d '{
        "state": "'$STATUS'",
        "target_url": "'$REPORT_URL'",
        "description": "Coverage '$COVERAGE'%",
        "context": "continuous-integration/coverage"
    }'

Результат в github:

pending

fail

pass

Сообщение в блоге об этом ru: https://maks.live/articles/drugoe/otchety-coverage-v-teamcity/

1 голос
/ 09 сентября 2011

Я использую teamcity-nose со следующей конфигурацией в settings.py:

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = ['-v', '-s', '--rednose', '--with-selenium',]

if os.getenv('TEAMCITY_PROJECT_NAME') is not None:
   # whatever special teamcity settings you might have go here

Мой шаг сборки, который выполняет тестирование, выглядит следующим образом:

. /opt/teamcity/virtualenvs/myproj/bin/activate
 dropdb test_myproj-teamcity &> /dev/null # bug that is not destroying database
 manage.py test

Мой проект manage.py находится на пути (я устанавливаю в bin-файл virtualenv через setup.py), поэтому вам придется добавить путь, если вы сделаете иначе.

Мне никогда не удавалось добавить покрытие всам тест, так как есть проблемы с версионностью пакета, поэтому с последним пакетом покрытия я просто добавил его на дополнительном этапе сборки:

. /opt/teamcity/virtualenvs/myproj/bin/activate
 coverage html --include=myproj/*.*
 cloc . --out=./htmlcov/cloc.txt

Затем вы можете добавить вкладку, которая включает html покрытия, если вы добавитеэто к вашему артефакту:

./htmlcov/

Я также добавляю вкладку со счетчиком строк, вам нужно будет установить cloc или linecounter на ваш выбор.

У меня также есть дополнительныйсоздать конфигурацию для развертывания на промежуточном сервере один раз за ночь с помощью fab (просто активируйте и fab как обычно) и дополнительную сборку для автоматической установки требований к pip в случае изменения файлов pip, добавив это в командуПравила запуска сборки "pip install -r needs.pip":

+:**.pip

И я добавляю это в мою тестовую сборку, чтобы она не запускалась, когда pip и некоторые другие файлы изменяют это значение.t выполнить тест сборки:

+:.
-:**.pip
-:*fabfile.py
-:*myproj/conf/*
+:*myproj/conf/teamcity/*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...