Python
Django
CircleCI
coverage
django-nose
More than 1 year has 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 に置かれたものが保存され、ビルド画面からリンクされます。

参考