DISTRICT 37

なにか

DjangoのCoverageテスト

前回のテストの続き

dragstar.hatenablog.com

Coverage.py

unittestを一通り書いたのならば、coverageを確かめる。テスト駆動開発ではないことが前提となるが、テストというものは書いたコードを余すことなく動作確認することが重要となる。プロジェクトが小さいうちはまぁ目視できるが、大きくなればなるほどにヒトの限界を感じるようになる。

そこで、カバー率をチェックできるツールがcoverage.pyとなる。少し前ならばdjango-noseというライブラリがあったらしいのだが、どうもdjango2系ではうまくカバー率を計測できないとかなんとか。

公式はこちら

pypi.org

インストール

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