"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

django3プロジェクトで自動テスト(unittest)ソースを置くフォルダとcoverage.pyの使い方

f:id:arakan_no_boku:20200419012754j:plain

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

目次

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

一般的らしいのは、例えば、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ドキュメントで説明されています。

docs.djangoproject.com

ではでは。