"BOKU"のITな日常

62歳・文系システムエンジニアの”BOKU”は日々勉強を楽しんでます

django3.0プロジェクトでunittestする時のフォルダ構成とcoverage.pyの使い方

django3.0プロジェクトで下請けファンクションをサブフォルダに分けて書いた時の、unittestとカバレッジ計測の基本的なやり方についてです。

f:id:arakan_no_boku:20200419012754j:plain

 

テストソースを置くフォルダ構成について

 

pythonで一般的らしい構成があります。

パッケージのディレクトリと同じ階層にテストディレクトリを作る方法です。

例えば。

djangoで「demos」プロジェクトを作って、demosフォルダ以下にあるソースのテストソースを置く「tests」フォルダを直下にこんな感じに作るパターンです。

f:id:arakan_no_boku:20200419013446p:plain

それで、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」プレフィックスがついたメソッドを探して、すべて実行してくれます。

docs.djangoproject.com

これは、フォルダ構造が深くても同じです。

例えば、以下のような構造になっていたとしても。 

f:id:arakan_no_boku:20200419014752p:plain

__init__.pyさえおいてあれば、tests_functionsやtests_modulesやtests_modelsなどのサブフォルダに分かれておいてあるテストソースから、testメソッドを拾い出して、すべて実行します。

 

カバレッジの計測

 

カバレッジの計測には、coverage.pyを使います。

インストールは以下のようにします。

pip install coverage

カバレッジの計測方法は以下です。

coverage run manage.py test

 こうやってテストを実行後に、レポート表示します。

coverage report

 こうすると以下のような結果(例です)が表示されます。

f:id:arakan_no_boku:20200419020830p:plain

具体的にソースコードのどのあたりがカバーできていないのか・・等、分析したい場合は以下のように実行すると、HTMLレポートが作成されます。

coverage html

 manage.pyのあるフォルダに「htmlcov」というフォルダができるので、その下にある「index.html」をダブルクリックで開きます。

すると、こんなレポートが表示されます。

f:id:arakan_no_boku:20200419021232p:plain

で、モジュールのところのリンクをクリックすると。

f:id:arakan_no_boku:20200419021401p:plain

こんな感じで、カバレッジできてないところにマーキングして教えてくれますので、それを見て修正が必要かどうか・・を判断すればよい・・って感じです。

 

設定ファイル(.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」でカバレッジの対象から除外するフォルダやファイルを指定します。

上記の例は以下のようなフォルダ構成で。

f:id:arakan_no_boku:20200419014752p:plain

  • 各フォルダの__init__.py
  • テストソース
  • djangoのsettings.pyやmanage.py

など、カバレッジ計測結果にでてほしくないフォルダやファイルを除外します。

環境にあわせてこまめに追記・変更したほうがよいです。 

 

djangoはunittestベース

 

python標準のunittestベースです。

テストの書き方等はこちらのDjangoドキュメントで説明されています。

docs.djangoproject.com

ではでは。