3 votes

Couverture de test dans teamcity avec Django

J'ai fait fonctionner teamcity qui construit et exécute un testrunner personnalisé ( http://pypi.python.org/pypi/teamcity-messages )

J'ai vaguement avalé ce message : TeamCity pour l'intégration continue de Python/Django

Ma méthode run_suite ressemble à ceci :

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

J'utilise actuellement django_coverage avec coverage.py et je voudrais que teamcity obtienne les données de couverture des tests.

Je ne suis pas lié à teamcity mais je préfère l'utiliser comme serveur de CI mais je peux changer pour un autre si c'est plus facile.

Comment puis-je obtenir les données que ./manage.py test_coverage imprime dans teamcity ?

2voto

Maks Skorokhod Points 407

Couverture de TeamCity

Dans TeamCity, je couvre Django de la manière suivante

Créer un rapport de couverture par appel make ci_test utilisation des commandes 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

El cover_test exécute les tests de Django, et mesure la couverture du code. Le site cover_report imprime un rapport de couverture sur la console, et génère également un rapport html et, en utilisant la commande couverture-badge l'utilitaire génère un beau badge avec l'état de couverture du code de badge badge.svg .

Après cela, les artefacts sont collectés dans la base de données TeamCity (onglet General Settings )

teamcity conf

Ils sont rassemblés dans un onglet Artifacts

artifacts

Et disponible sur le serveur CI par le chemin :

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

Couverture du rapport GitHub

Enfin, pousser le hook GitHub pour afficher l'état de la couverture de la construction dans le repo :

Couverture en attente (avant la construction)

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"
    }'

Copie du badge de couverture

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

Couverture Crochet de finition

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"
    }'

Résultat dans github :

pending

fail

pass

Article de blog à ce sujet ru : https://maks.live/articles/drugoe/otchety-coverage-v-teamcity/

1voto

ashwoods Points 1479

J'utilise teamcity-nose avec la configuration suivante dans 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

Mon étape de construction qui effectue les tests ressemble à ceci :

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

Le manage.py de mon projet est sur le chemin (j'installe dans le bin de virtualenv via setup.py) donc vous devrez ajouter le chemin si vous faites autrement.

Je n'ai jamais réussi à ajouter la couverture dans le test lui-même car il y a des problèmes avec les versions des paquets, donc avec le dernier paquet de couverture, je l'ai juste ajouté dans une étape de construction supplémentaire :

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

Vous pouvez ensuite ajouter un onglet qui inclut le html de couverture si vous l'ajoutez à votre artefact :

./htmlcov/

J'ai également ajouté un onglet avec le compteur de lignes, vous devrez avoir installé cloc ou le compteur de lignes de votre choix.

J'ai également une configuration de build supplémentaire pour déployer le serveur de staging une fois par nuit via fab (il suffit d'activer et fab comme d'habitude), et un build supplémentaire pour installer automatiquement les exigences de pip si les fichiers pip changent, en ajoutant ceci aux règles de déclenchement du build "pip install -r requirements.pip" :

+:**.pip

Et je l'ajoute à mon build de test pour qu'il ne s'exécute pas lorsque pip et d'autres fichiers changent sans affecter le test du build :

+:.
-:**.pip
-:*fabfile.py
-:*myproj/conf/*
+:*myproj/conf/teamcity/*

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X