3

我已经让 teamcity 工作了,它构建并运行了一个自定义测试运行程序(http://pypi.python.org/pypi/teamcity-messages

我把这篇文章弄糊涂了:TeamCity for Python/Django 持续集成

我的 run_suite 方法如下所示:

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

我目前将 django_coverage 与 coverage.py 一起使用,我希望 teamcity 获取测试覆盖率数据。

我不受 teamcity 的约束,但我更喜欢将其用作 CI 服务器,但如果更容易,我可以更改为另一个。

如何获取 ./manage.py test_coverage 在 teamcity 中打印的数据?

4

2 回答 2

2

TeamCity 覆盖范围

在 TeamCity 中,我通过以下方式介绍 Django

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 报告,并使用coverage-badge实用程序生成一个带有徽章代码覆盖状态的漂亮徽章徽章.svg

之后,将工件收集在 TeamCity(选项卡General Settings)中

团队城市会议

它们被收集在一个选项卡中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 钩子以在 repo 中显示构建覆盖状态:

覆盖待定(构建前)

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中的结果:

待办的

失败

经过

关于此的博客文章ruhttps ://maks.live/articles/drugoe/otchety-coverage-v-teamcity/

于 2017-04-18T07:49:59.457 回答
1

我在 settings.py 中使用teamcity-nose和以下配置:

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 位于路径上(我通过 setup.py 安装在 virtualenv bin 中),因此如果不这样做,则必须添加路径。

我从来没有设法在测试本身中添加覆盖,因为包版本控制存在问题,所以对于最新的覆盖包,我只是在一个额外的构建步骤中添加了它:

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

然后,如果您将其添加到您的工件中,您可以添加一个包含覆盖 html 的选项卡:

./htmlcov/

我还添加了一个带有行计数器的选项卡,您需要安装 cloc 或您选择的行计数器。

我还有一个额外的构建配置,用于每晚通过 fab 部署到登台服务器一次(只需像往常一样激活和 fab),以及一个额外的构建,用于在 pip 文件更改时自动安装 pip 要求,方法是将其添加到触发规则中“pip install -r requirements.pip”构建:

+:**.pip

我将它添加到我的测试构建中,以便当 pip 和其他一些不影响构建测试的文件发生更改时它不会运行:

+:.
-:**.pip
-:*fabfile.py
-:*myproj/conf/*
+:*myproj/conf/teamcity/*
于 2011-09-09T08:12:17.267 回答