DjangoのCoverageテスト
前回のテストの続き
Coverage.py
unittestを一通り書いたのならば、coverageを確かめる。テスト駆動開発ではないことが前提となるが、テストというものは書いたコードを余すことなく動作確認することが重要となる。プロジェクトが小さいうちはまぁ目視できるが、大きくなればなるほどにヒトの限界を感じるようになる。
そこで、カバー率をチェックできるツールがcoverage.pyとなる。少し前ならばdjango-noseというライブラリがあったらしいのだが、どうもdjango2系ではうまくカバー率を計測できないとかなんとか。
公式はこちら
インストール
pipenv install --dev coverage
pipenv installにしなくても、ましてや--devオプションにしなくても普通にpip installで済む
pip install coverage
Djangoを開発していて、herokuに準拠させるのならばpipenv経由でインストールするのもいいかとという事で。
使い方
Advanced testing topics | Django documentation | Django
pipenvを使っているのならpipenv shellしてから下記コマンドを実行する。
こうして
coverage run --source='.' manage.py test myapp
こう
coverage report
reportとやると以下のような画面が出てきてcoverageを確認できる。
Name Stmts Miss Cover ------------------------------------------------------------------ manage.py 9 2 78% mysite/__init__.py 0 0 100% mysite/formats/ja/formats.py 3 0 100% mysite/settings.py 23 0 100% mysite/urls.py 3 0 100% mysite/wsgi.py 4 4 0% myapp/__init__.py 0 0 100% myapp/admin.py 6 0 100% myapp/apps.py 3 3 0% myapp/models.p 10 4 60% myapp/forms.py 10 2 80% myapp/views.py 10 3 70%
model、form、viewのテストがそれぞれ甘いというのが確認できます。これは標準出力に出るのですが、HTMLファイルとして出力することもできる。
coverage html
htmlをつけることでhtmlconvディレクトリが作成されて結果がHTMLファイルとして作成される。htmlconvディレクトリにindex.htmlがあるのでWebブラウザでも確認ができる。
確認ができたら甘かった分のテストを追記や書きなおしをして、改めてcoverageを実行し、結果を100%に近づけていくといい。
linux系のシェルならば&&を使ってワンライナーで実行してもいいかと
coverage run --source='.' manage.py test myapp && coverage report && coverage html