PyDev で Django 1.9 のユニットテストが失敗する対策
1.PyDev + Django1.9 のユニットテストで、DjangoTestSuiteRunner がインポート出来ないエラー
お気に入りの、Eclipse + PyDev で、Django 1.9 の環境を構築。
ちょっと、ロジックを書き始めようと、テストケースの準備をしたららら、、、
DjangoTestSuiteRunner がインポート出来ない。むむ。
Finding files... done. Importing test modules ... done. Traceback (most recent call last): File "C:\Programs\eclipse_mars_pydev\plugins\org.python.pydev_4.5.4.201601292234\pysrc\runfiles.py", line 238, inmain() File "C:\Programs\eclipse_mars_pydev\plugins\org.python.pydev_4.5.4.201601292234\pysrc\runfiles.py", line 89, in main return pydev_runfiles.main(configuration) # Note: still doesn't return a proper value. File "C:\Programs\eclipse_mars_pydev\plugins\org.python.pydev_4.5.4.201601292234\pysrc\_pydev_runfiles\pydev_runfiles.py", line 835, in main PydevTestRunner(configuration).run_tests() File "C:\Programs\eclipse_mars_pydev\plugins\org.python.pydev_4.5.4.201601292234\pysrc\_pydev_runfiles\pydev_runfiles.py", line 793, in run_tests MyDjangoTestSuiteRunner(run_tests).run_tests([]) File "C:\Programs\eclipse_mars_pydev\plugins\org.python.pydev_4.5.4.201601292234\pysrc\_pydev_runfiles\pydev_runfiles.py", line 813, in run_tests raise AssertionError("Unable to run suite with DjangoTestSuiteRunner because it couldn't be imported.") AssertionError: Unable to run suite with DjangoTestSuiteRunner because it couldn't be imported.
単純に発生箇所を見ると、原因は、PyDev のプラグインのようだ。
File "C:\Programs\eclipse_mars_pydev\plugins\org.python.pydev_4.5.4.201601292234\pysrc\_pydev_runfiles\pydev_runfiles.py", line 813, in run_tests
実行する内容はテストケースのひな形にしようと思っている単純なもの。
# -*- encoding:utf-8 -*-
from django.conf import settings
from django.test import TestCase
import django
# DJANGO SETTING UP!
django.setup()
class TemplateTest(TestCase):
'''
'''
@staticmethod
def setUpClass():
pass
def test_template(self):
print 'template'
Django 1.7 の時は問題なく動いていた。
2.原因 Django 1.8 で、DjangoTestSuiteRunner は廃止された!
https://docs.djangoproject.com/en/1.9/internals/deprecation/
どうやら、django.test.simple.DjangoTestSuiteRunner は、Django 1.8 で廃止され、django.test.runner.DiscoverRunner に置き換わったのが原因、で、まだPyDevはおっついていないと。
大変困る!
ということで、上記スタックトレースの当該ファイルを直接編集し、クラスを django.test.runner.DiscoverRunner に置き換える。
具体的は、805 行目あたりから、以下の3カ所
:
try:
#from django.test.simple import DjangoTestSuiteRunner 次行に置き換え
from django.test.runner import DiscoverRunner
except:
class DjangoTestSuiteRunner:
def __init__(self):
pass
def run_tests(self, *args, **kwargs):
raise AssertionError("Unable to run suite with DjangoTestSuiteRunner because it couldn't be imported.")
#class MyDjangoTestSuiteRunner(DjangoTestSuiteRunner): 次行に置き換え
class MyDjangoTestSuiteRunner(DiscoverRunner):
def __init__(self, on_run_suite):
#DjangoTestSuiteRunner.__init__(self) 次行に置き換え
DiscoverRunner.__init__(self)
self.on_run_suite = on_run_suite
:
3.成功
実行してみたら、テスト出来ました。
よかったよかった。
