Help us understand the problem. What is going on with this article?

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 に置かれたものが保存され、ビルド画面からリンクされます。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした