プロジェクトに属さないアプリをテストする

普通のやり方

普通にDjangoでテストするなら、manage.pyを使って以下のようにすればよいです。

$ ./manage.py test myapp

しかし、このやり方には落とし穴があります。このコマンドでテストが実行されるのは、'myapp'ではなく'myproject.myapp'なのです。

つまり、部品として使うためのアプリを作っているときなど、アプリがプロジェクトの下にないときはこの方法は使えません。

 

調べてみた

見つからない。自分の調べ方が悪いのか、または一般常識レベルのことなのかわからないがググってみても普通にmanage.pyを使うやり方がほとんどだった。

仕方がないのでgithubで公開されているソースを読んでみると、どうやらruntest.pyなるものを作っている人が多いらしい。で、Alisueさんのruntest.pyの中に、参考にした記事のURLがあったのでそれを参考にしました。

 

結論

ざっくり説明すると、

  1. 環境変数に設定ファイルを追加する。
  2. テストランナーを作る。
  3. テストを実行する。

というような感じです。

コードとディレクトリ構成は以下の通り。少し独自に変更を入れています。

.

├── runtest.py

├── myapp

│   ├── __init__.py

│   ├── models.py

│   ├── tests.py

│   └── views.py

└── tests

├── __init__.py

├── settings.py

└── urls.py

runtests.py

#!/usr/bin/env python

import os, sys

def runtests():

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

test_dir = os.path.join(os.path.dirname(__file__), 'tests')

sys.path.insert(0, test_dir)

import django

if django.VERSION >= (1, 7):

django.setup()

from django.conf import settings

from django.test.utils import get_runner

TestRunner = get_runner(settings)

test_runner = TestRunner(verbosity=1, interactive=True)

failures = test_runner.run_tests(['myapp'])

sys.exit(bool(failures))

if __name__ == '__main__':

runtests()

 

参考