代码之家  ›  专栏  ›  技术社区  ›  Lynoure

Django测试在添加一个测试用例后未能安装夹具

  •  0
  • Lynoure  · 技术社区  · 7 年前

    我的Django(v1.10.7)应用程序有4个fixture测试用例,运行良好。一旦我添加了第五个带有fixture的测试用例,就会运行测试

    蟒蛇3/管理。py测试myapp

    启动导致一个随机的旧测试用例失败:

    ERROR: setUpClass (myapp.tests.RandomOldTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/django/db/backends/base/base.py", line 206, in _cursor
        return self.create_cursor()
      File "/usr/lib/python3/dist-packages/django/db/backends/postgresql/base.py", line 211, in create_cursor
        cursor = self.connection.cursor()
    psycopg2.InterfaceError: connection already closed
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/django/test/testcases.py", line 1019, in setUpClass
        'database': db_name,
      File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 130, in call_command
        return command.execute(*args, **defaults)
      File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 345, in execute
        output = self.handle(*args, **options)
      File "/usr/lib/python3/dist-packages/django/core/management/commands/loaddata.py", line 64, in handle
        self.loaddata(fixture_labels)
      File "/usr/lib/python3/dist-packages/django/core/management/commands/loaddata.py", line 104, in loaddata
        self.load_label(fixture_label)
      File "/usr/lib/python3/dist-packages/django/core/management/commands/loaddata.py", line 167, in load_label
        obj.save(using=self.using)
      File "/usr/lib/python3/dist-packages/django/core/serializers/base.py", line 201, in save
        models.Model.save_base(self.object, using=using, raw=True, **kwargs)
      File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 824, in save_base
        updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
      File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 889, in _save_table
        forced_update)
      File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 939, in _do_update
        return filtered._update(values) > 0
      File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 654, in _update
        return query.get_compiler(self.db).execute_sql(CURSOR)
      File "/usr/lib/python3/dist-packages/django/db/models/sql/compiler.py", line 1148, in execute_sql
        cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
      File "/usr/lib/python3/dist-packages/django/db/models/sql/compiler.py", line 833, in execute_sql
        cursor = self.connection.cursor()
      File "/usr/lib/python3/dist-packages/django/db/backends/base/base.py", line 233, in cursor
        cursor = self.make_cursor(self._cursor())
      File "/usr/lib/python3/dist-packages/django/db/backends/base/base.py", line 206, in _cursor
        return self.create_cursor()
      File "/usr/lib/python3/dist-packages/django/db/utils.py", line 94, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/usr/lib/python3/dist-packages/django/utils/six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "/usr/lib/python3/dist-packages/django/db/backends/base/base.py", line 206, in _cursor
        return self.create_cursor()
      File "/usr/lib/python3/dist-packages/django/db/backends/postgresql/base.py", line 211, in create_cursor
        cursor = self.connection.cursor()
    django.db.utils.InterfaceError: Problem installing fixture '/home/lynoure/PycharmProjects/usertools2/useraccounts/fixtures/test-fixtures.json': connection already closed
    

    重要的是,这是在Debian Stable上实现的,postgresql的版本是9.6+181,python3-psycopg2是2.6.2-1。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Lynoure    7 年前

    事实证明,如果你有几个

    super().tearDownClass()
    

        2
  •  0
  •   Lynoure    7 年前

    from django.test import tag
    
    @tag('trouble')
    class TroubleTestCase(TestCase):
    ...
    

    要运行:

    python3 ./manage.py test myapp --exclude-tag=trouble
    

    之后必须单独运行这些测试:

    python3 ./manage.py test myapp --tag=trouble