Edited at

Django でのテスト

More than 3 years have passed since last update.

今 Python で Django を使うときにテストについてはこうすればいい、という自分なりの解をまとめました。


方針



  • manage.py test app1 app2 の形式でテストする (Django の仕組みに乗る)

  • app1/tests/test*.py をデフォルトで全部テストする (app1/tests.py ではなく)

  • coverage は html にして CIサーバーで見られるようにする

これらを満たすのは現在のところ django-nose です。

また CI は CircleCI を使うとします。

Django の準備は必要に応じて http://qiita.com/seizans/items/1dc744694c1072e2b8d3 などを参照ください。

CircleCI のアカウント作成などは https://circleci.com/ から、特に難しいこと無くできると思います。


手順

ディレクトリ構成は例として以下のようになっているとします。

- sandbox/

- manage.py
- app1/
- app2/
- requirements/
- _base.txt
- dev.txt
- circle.yml


ローカルでテストする

django-nose と coverage をインストールします。

$ pip install django-nose

$ pip install coverage

settings.py に設定を追加します。


settings.pyに追加する内容

INSTALLED_APPS += ('django_nose',)

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
NOSE_ARGS = [
'--with-coverage', # coverage を取る
'--cover-html', # coverage を html で cover/ に出力する
'--cover-package=app1,app2', # coverage を取得する対象アプリは app1 と app2
]

django の manage.py を使って test コマンドでテストします。

$ python manage.py test app1 app2

coverage 結果が cover/ 以下に作成されたことが確認できると思います。


CI サーバーでテストする


依存ライブラリを記述する


requirements/_base.txt

Django==1.6.2



requirements/dev.txt

coverage>=3.7.1

django-nose>=1.2
flake8>=2.1.0


CircleCI 用スクリプトを用意する


circle.yml

machine:

python:
version: 2.7.6

dependencies:
pre:
- pip install -r requirements/dev.txt

test:
pre:
- flake8 sandbox
override:
- python sandbox/manage.py test app1 app2
post:
- mv cover $CIRCLE_ARTIFACTS


ポイントは、coverage 出力結果を $CIRCLE_ARTIFACTS に配置することです。

CircleCI では、$CIRCLE_ARTIFACTS に置かれたものが保存され、ビルド画面からリンクされます。


参考