django のテストに関するいくつかのプレゼンテーションを見た後、django のテストをスキップし、テスト用により優れたパッケージ構造を作成するために、独自の TestRunner をコーディングしたいと考えています。
問題は、プロジェクト構造を変更したため、テスト ランナーがテスト検出を行うための正しいパスを見つけられないことです。これは私のプロジェクトがどのように見えるかです:
project/
-src/
- project_name/
- apps/
- test/ # Not a good name, i know, will change it
- some_app/
- test_models.py
- manage.py
- development.db
さて、テストするために、test_models.py
これを行いたいです:
$ cd project/src/
$ python manage.py test some_app.test_models
some_app
問題は、テスト ランナーがそのパッケージ ( ) とモジュール ( ) を見つけられないことですtest_models.py
。テスト ランナーで名前をハードコードすると変更されますが、私はそうしたくありません。これを機能させるために私が行うことは次のとおりです。
test_labels = ["%s.%s" % ("project_name.test", l)
for l in test_labels
if not l.startswith("project_name.test")]
だから、あなたがするなら
$ python manage.py test some_app.test_models
次のように書き換えられます。
$ python manage.py test project_name.test.some_app.test_models
そして、それはうまくいきます。
やってみsys.path.append("(...)/project_name/test)
ましたが、どちらもうまくいきません。
これは私の TestRunner のコードです:
class DiscoveryDjangoTestSuiteRunner(DjangoTestSuiteRunner):
"""A test suite runner that uses unittest2 test discovery.
It's better than the default django test runner, becouse it
doesn't run Django tests and let you put your tests in different
packages, modules and classes.
To test everything in there:
$ ./manage.py test
To test a single package/module:
$ ./manage.py test package
$ ./manage.py test package.module
To test a single class:
$ ./manage.py test package.module.ClassName
"""
def build_suite(self, test_labels, extra_tests=None, **kwargs):
suite = None
discovery_root = settings.TEST_DISCOVERY_ROOT
if test_labels:
# This is where I append the path
suite = defaultTestLoader.loadTestsFromNames(test_labels)
# if single named module has no tests, do discovery within it
if not suite.countTestCases() and len(test_labels) == 1:
suite = None
discovery_root = import_module(test_labels[0]).__path__[0]
if suite is None:
suite = defaultTestLoader.discover(
discovery_root,
top_level_dir=settings.BASE_PATH,
)
if extra_tests:
for test in extra_tests:
suite.addTest(test)
return reorder_suite(suite, (TestCase,))