目次
django3.0プロジェクトでunittest
django3.0プロジェクトで下請けファンクションをサブフォルダに分けて書いた時の、unittestとカバレッジ計測の基本的なやり方についてです。
テストソースを置くフォルダ構成について
一般的らしいのは、例えば、djangoで「demos」プロジェクトを作った場合の、demosフォルダのソースのテストソースを置く「tests」フォルダを直下にこんな感じに作るパターンです。
unittestのソースの中では、対象を「from ..」で参照します。
例えば、dbUtil.pyをテストしたい場合なら。
import unittest from .. import dbutil class TestDbUtil(unittest.TestCase):
みたいにimportします。
djangoプロジェクトのunittestの実行
djangoプロジェクトの場合、manage.pyを使ってunittestの一括実行ができます。
manage.py のあるフォルダをカレントにして。
python manage.py test
を実行すると、test_xxxのように「test」プレフィックスがついたメソッドを探して、すべて実行してくれます。
これは、フォルダ構造が深くても同じです。
例えば、以下のような構造になっていたとしても。
__init__.pyさえおいてあれば、tests_functionsやtests_modulesやtests_modelsなどのサブフォルダに分かれておいてあるテストソースから、testメソッドを拾い出して、すべて実行します。
おまけ:テストの書き方資料リンク
テストの書き方等はこちらのDjangoドキュメントで説明されています。
django3プロジェクトでカバレッジの計測
カバレッジの計測には、coverage.pyを使います。
インストールは以下のようにします。
pip install coverage
カバレッジの計測方法は以下です。
coverage run manage.py test
こうやってテストを実行後に、レポート表示します。
coverage report
こうすると以下のような結果(例です)が表示されます。
具体的にソースコードのどのあたりがカバーできていないのか・・等、分析したい場合は以下のように実行すると、HTMLレポートが作成されます。
coverage html
manage.pyのあるフォルダに「htmlcov」というフォルダができるので、その下にある「index.html」をダブルクリックで開きます。
すると、こんなレポートが表示されます。
で、モジュールのところのリンクをクリックすると。
こんな感じで、カバレッジできてないところにマーキングして教えてくれますので、それを見て修正が必要かどうか・・を判断すればよい・・って感じです。
設定ファイル(.coveragerc)の作成
coverage.pyは、デフォルトのままでも使えます。
しかし、すべてのソースがカバレッジの対象になると、レポートが見づらくなります。
なので、設定ファイルを作って対象や動作をコントロールします。
設定ファイルは「.coveragerc」という名前で作ります。
置き場所は、manage.pyと同じフォルダにします。
内容の例です。
[run] source = . omit = demos/__init__.py demos/settings.py demos/urls.py demos/asgi.py demos/wsgi.py demos/functions/__init__.py demos/tests_etcdemo/* demos/functions/modules/__init__.py demos/functions/tests_functions/* demos/functions/modules/models/__init__.py demos/functions/modules/tests_modules/* demos/functions/modules/models/tests_models/* manage.py [report] show_missing = True skip_covered = True
補足します。
[run]
source = .
の部分は、このファイルのあるとことを基準(カレント)として扱うという決まり文句です。
こちらの部分
[report]
show_missing = True
skip_covered = True
でレポートへの出力方法を指定します。
上記の例の「skip_covered=True」だと、カバレッジ100%のソースを表示しません。
カバレッジが100%になったものも含めて確認したい場合は。
[report]
show_missing = True
skip_covered = False
とします。
あと「omit」でカバレッジの対象から除外するフォルダやファイルを指定します。
上記の例は以下のようなフォルダ構成で。
- 各フォルダの__init__.py
- テストソース
- djangoのsettings.pyやmanage.py
など、カバレッジ計測結果にでてほしくないフォルダやファイルを除外します。
環境にあわせてこまめに追記・変更したほうがよいです。
ではでは。