Дублирующая ключевая ошибка при запуске тестов с django-nose, но не с Django DiscoverRunner

Когда я запускаю свои тесты с помощью тестировщика Django по умолчанию (django.test.runner.DiscoverRunner), все работает нормально. Когда я запускаю их с помощью носа (для вывода XML), я получаю IntegrityErrors от тестов, которые не принадлежат мне.

Override this method to return an instance of your custom user model ... ERROR

Я понятия не имею, что это такое и почему его запускает только тестовый бегун django-nose.

Вот полная трассировка стека для ошибки

======================================================================
ERROR: Override this method to return an instance of your custom user model
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=([email protected]) already exists.


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/wagtail/tests/utils/wagtail_tests.py", line 24, in create_test_user
    return user_model.objects.create_superuser(**user_data)
  File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/models.py", line 162, in create_superuser
    return self._create_user(username, email, password, **extra_fields)
  File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/models.py", line 145, in _create_user
    user.save(using=self._db)
  File "/usr/local/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 66, in save
    super().save(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 741, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 779, in save_base
    force_update, using, update_fields,
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 870, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 908, in _do_insert
    using=using, raw=raw)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/query.py", line 1186, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1335, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: duplicate key value violates unique constraint "auth_user_username_key"
DETAIL:  Key (username)=([email protected]) already exists.

Нигде в своих тестах я не создаю тестового пользователя с адресом электронной почты «[email protected]», и я не вижу никакого своего кода нигде в этой трассировке стека, поэтому я понятия не имею, откуда он берется и почему он только появляется, когда я запускаю свои тесты с помощью django-nose.


person darth_mall    schedule 06.08.2019    source источник


Ответы (1)


Я думаю, что происходит то, что django-nose очень агрессивен в том, как он находит тесты. Один из моих наборов тестов использовал WagtailPageTests со статическим методом create_test_user. Я думаю, что Нос нашел этот метод и запустил его как тест, потому что он содержал слово «тест».

В итоге я переключился на unittest-xml-reporting, чтобы получить отчет XUnit XML, так как это единственная причина, по которой я все равно использовал django-nose, и теперь мои тесты работают нормально.

person darth_mall    schedule 06.08.2019
comment
Если вы наследуете от WagtailPageTests в своих тестах, то он будет вызов self.login при настройке, что, в свою очередь, вызывает create_test_user, так что это происходит по замыслу. - person gasman; 06.08.2019
comment
Верно, но в бегуне django-nose есть что-то, что (очевидно) заставляет create_test_user вызываться несколько раз, что приводит к тому, что ValidationError и django-nose интерпретируют его как тест с ошибкой. Я подозреваю, что наборы, наследующие от WagtailPageTests, не всегда ошибаются. И поскольку этого не происходит ни с django.test.runner.DiscoverRunner, ни с xmlrunner.extra.djangotestrunner.XMLTestRunner, я подозреваю, что есть проблема с объединением django-nose (с его конфигурацией по умолчанию) с WagtailPageTests. - person darth_mall; 06.08.2019