Jenkins & Python: Code Coverage

2012-08-27 20:34

Dies ist eine kleine Ergänzung zu Jenkins & Python.

Nachdem wir bereits wissen, wie man Tests automatisch durch Jenkins ausführen lassen kann, ist es auch interessant zu wissen, welche Stellen unseres Codes bereits durch entsprechende Tests abgedeckt werden.

Zur Anzeige der Abdeckungsinformationen benötigen wir ein weiteres Plugin. Ich habe mich für Cobertura entschieden. Cobertura liest als XML-Datei vorliegende Reports ein und erstellt daraus Grafiken und aussagekräftige Code-Anzeigen, welche Teile noch abgedeckt werden müssen - oder es bereits sind.

Zur Ermittlung wird das coverage-Modul verwendet. Glücklicherweise bietet nose bei installiertem coverage die Möglichkeit bei unseren Tests entsprechende Daten zu sammeln. Aber Vorsicht: für alle Module, die noch nicht durch Tests berührt sind, findet keine Coverage Anzeige statt.

Wir modifzieren also unseren Build-Schritt so, dass er neben nose auch coverage installiert:

pip install coverage

Und nun müssen wir den folgenden Schritt noch anpassen

nosetests --with-xunit repo/tests/

so dass wir auch einen Report bekommen. Das sieht dann so aus:

nosetests --with-coverage --with-xunit repo/tests/

Anschließend finden wir aber nur eine .coverage-Datei im Workspace vor. Es fehlt noch eine Konvertierung in das von Cobertura lesbare XML. Dies erreichen wir durch eine neue Zeile in unserem  Build-Schritt:

coverage xml

Anschließend können wir unser Projekt so konfigurieren, dass es die Datei einliest und auswertet. Dazu weisen wir unser Projekt an die Cobertura-Testabdeckung zu veröffentlichen und geben als Datei mit Testergebnissen **coverage.xml an.

Das wars auch schon. Hier noch einmal den Build-Schritt in voller Eleganz:

virtualenv pyenv

. pyenv/bin/activate



pip install pep8

pip install pylint

pip install nose

pip install coverage



pip install -r repo/requirements.txt



PYTHONPATH=$WORKSPACE/repo:$PYTHONPATH

export PYTHONPATH



pylint --output-format=parseable repo/ > pylint.txt || echo 'pylint did not finish with return code 0'

pep8 repo/ > pep8.txt || echo 'pep8 did not finish with return code 0'

nosetests --with-coverage --with-xunit repo/tests/

coverage xml