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.成功
実行してみたら、テスト出来ました。
よかったよかった。