読者です 読者をやめる 読者になる 読者になる

cloverrose's blog

Python, Machine learning, Emacs, CI/CD, Webアプリなど

django-coverageでテストカバレッジを測ってみた

Django Test

TDDでテスターやったのでどれくらい書けたのか気になって測ってみた

最初の疑問

どれを使ってテストカバレッジ測ればいいんだ?

coverage.pyというPythonでテストカバレッジを計測する有名なのがあった

sudo pip install coverage

Ubuntuでは/usr/local/lib/python2.7/dist-packages/coverageにインストールされた

参考:PythonでUnitTestとCodeCoverageをやってみる(2) - HDEラボ

次の疑問

俺Docstringで書いててUnittestじゃないけど大丈夫か?

結果からいうとできた!

落とし穴

例のdjangoモジュール読み込まないといけない

調べるとまさにそれっていう記事があった。

django-coverage を使う - Twisted Mind

なるほどdjango-coverage
kmike / django-coverage / source — Bitbucket
そんなものもあるのか。

sudo pip install django-coverage

Ubuntuでは/usr/local/lib/python2.7/dist-packages/django_coverageにインストールされた。
アンダーバーになってるので注意(importするときもdjango_coverage)。

設定

settings.pyに以下を追加

COVERAGE_ADDITIONAL_MODULES = [
    'question.views',
    'question.models'
    ]
COVERAGE_REPORT_HTML_OUTPUT_DIR = '.cover'
TEST_RUNNER = 'django_coverage.coverage_runner.CoverageRunner'

.gitignoreに以下を追加

.cover

requirements.txtに

pip freeze | grep coverage

の結果を追記

実行

python manage.py test question

といつも通りに実行するだけ

結果を見る

.coverディレクトリができて、その中にindex.htmlがあるので見ればいい。
非常に見やすい。


注意

COVERAGE_ADDITIONAL_MODULESには実行可能な文が含まれているモジュールのみを指定したほうがいい。Docstringのみで構成されるquestion.testを追加すると、しっかり動くものの、index.htmlを見ると、question.testを無視しました的な報告を受ける。

まとめ

Doctestもしっかり見てくれていて簡単なインストールと設定をするだけでDjangoアプリのテストカバレッジを見やすい形で知ることができるので、非常に役立つ。

またcoverage単体の時は-eとかで前回の結果をリセットしてーとか手順を踏まないといけないけどdjango-coverageはそこらへんもうまいことやってくれてる(?)

ちなみに自分のカバレッジは87.2%だった。初回でこれはまずまず(と思いたい)