web-dev-qa-db-ja.com

Django=単体テストを複数のファイルに広げるには?

  • Python-Djangoアプリケーションがあります
  • 単体テストフレームワーク を使用しています
  • テストは、モジュールディレクトリの「tests.py」ファイルに配置されます。
  • ./manage.py test appを介してテストを実行しています

今..

  • tests.pyファイルはかなり大きく/複雑/乱雑になっています
  • tests.pyをテストの小さなコレクションに分割したい...

どうやって?

118
John Mee

Django 1.6で動作が変更されたため、パッケージを作成する必要がなくなりました。ファイルにtest*.py

Django 1.7ドキュメント から

テストを実行すると、テストユーティリティのデフォルトの動作では、名前がtestで始まるファイル内のすべてのテストケース(つまり、unittest.TestCaseのサブクラス)が検索され、それらのテストケースからテストスイートが自動的に構築されます。そのスイートを実行します。

Django 1.6ドキュメント から

テスト検出は、unittestモジュールの組み込みテスト検出に基づいています。デフォルトでは、現在の作業ディレクトリの下にある「test * .py」という名前のファイルでテストが検出されます。

以前の動作 from Django 1.5 documentation

テストを実行すると、テストユーティリティのデフォルトの動作では、models.pyおよびtests.pyですべてのテストケース(つまり、unittest.TestCaseのサブクラス)が検索され、それらのテストケースからテストスイートが自動的に構築されます。そのスイートを実行します。

モジュールのテストスイートを定義する2番目の方法があります。models.pyまたはtests.pyのいずれかでsuite()という関数を定義すると、Djangoテストランナーはその関数を使用しますこのモジュールのテストスイートを作成します。これは、単体テストの推奨構成に従います。複雑なテストスイートの作成方法の詳細については、Pythonドキュメントを参照してください。

43
osa

このアプローチは、Django 1.6、これを参照してください post

内部に___init___.pyを持つtestsフォルダーを作成できます(パッケージになるように)。次に、分割テストの.pyファイルをそこに追加し、___init___.pyにすべてインポートします。

つまり:test.pyファイルを、ファイルのように見えて動作するモジュールに置き換えます。

問題のアプリの下にtestsディレクトリを作成します

 app 
 app\models.py 
 app\views.py 
 app\tests 
 app\tests\__ init __。py 
 app\tests\bananas.py 
 app\tests\apples.py 

サブモジュールをapp\tests\__init__.pyにインポートします。

from bananas import *
from apples import *

これで、すべてが単一のファイルにあるかのように./manage.pyを使用できます。

./manage.py test app.some_test_in_bananas
116

トマスが述べた答えは正しい。ただし、__init__.pyのインポートがファイル構造と一致するようにするのは面倒です。

フォルダー内のすべてのテストを自動的に検出するにこれを__init__.pyに追加できます:

import unittest

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

これにより、./manage.py test appnameを実行できますが、特定のテストの実行は処理されません。これを行うには、次のコードを使用できます(__init__.pyでも):

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

これで、すべてのテストをmanage.py test app経由で、または特定のテストをmanage.py test app.TestApples経由で実行できます

26
Bryce Drennan

次のようなディレクトリ構造を作成します。

myapp/
    __init__.py
    tests/
        __init__.py
        test_one.py
        test_two.py
        ...
    ...

そしてpython manage.py test myappは期待どおりに機能します。

11
spiderlama

http://docs.python.org/library/unittest.html#organizing-tests は、ファイルをモジュールに分割することについて説明しています。そのすぐ上のセクションに例があります。

5
Jim Deville

より複雑な設定がある場合、またはfrom ... import *- typeステートメントを使用したくない場合は、tests.py(またはtests/__ init__.py)でsuiteという関数を定義できます。 unittest.TestSuiteのインスタンスを返します。

1
Joel Cross

Django 2.2を使用すると、アプリ内にtestフォルダーを作成して、関連するtest_...pyファイルに、追加するだけ__init__.pytestフォルダーに。

1
Gabor

Initで何もコーディングする必要はありません。アプリにサブディレクトリを作成するだけです。唯一の要件はtests *と呼ばないこと For exemple

app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py
1
MaxBlax360

おもう ./manage.py testは、単にすべてのテストトリックを実行します(Django> = 1.7))。

テストの整理が約グループ化およびcherrypickingそして、あなたはnoseのファンです Django nose

python manage.py test another.test:TestCase.test_method

鼻を知っているなら、あなたはあなたのすべてのファイルをはるかにうまく「ワイルドカード」する方法を知っています。

PS

それはちょうど良い習慣です。お役に立てば幸いです。答えはここから借りました: 特定のテストケースをDjangoで実行

0