Django использует 2 разные базы данных во время тестирования

Использование: Django 4.0.4 Python 3.9.13

Выполняется: python ../../manage.py test website.functional_tests.test_loggedOutUser.HomePageTest.test_user_email_registration

Файлы: settings.py

DATABASES = {
       'default': {
           'ENGINE': 'django.db.backends.sqlite3',
           'NAME': BASE_DIR / 'db.sqlite3',
           'ProdComment': 'This is the PROD DB.',
            'TEST': {
                'NAME': BASE_DIR / 'TEST_.db.sqlite3',
                'MIRROR': 'default',
                'COMMENT': "This is the TEST DB.",
            },
       }
    }

test_loggedOutUser.py content:

Тестовый вывод в терминале

(venv) Mac:functional_tests User$ python ../../manage.py test website.functional_tests.test_loggedOutUser.HomePageTest.test_user_email_registration
Logged out User: In HP test class.
Found 1 test(s).
System check identified no issues (0 silenced).
In setUp, logged out user tests.
REGO METHOD: Calling deltest.
DELTESTUSER, allUsersALLAUTH.objects.all():  <QuerySet [<User: adminuser>, <User: seconduser>, <User: me>, <User: testuser>, <User: TheTester>]>
DELTESTUSER, Testing if we can delete an account.

DELTESTUSER, usertodelete:  TheTester
DELTESTUSER - ELSE:  [...] db.sqlite3
DBC vendor in else:  <django.utils.connection.ConnectionProxy object at 0x10e501400>
DELTESTUSER, We found the user and can delete him.
DELTESTUSER, The user has now been deleted.
DELTESTUSER: allauthusers AFTER DELETION: <QuerySet [<User: adminuser>, <User: seconduser>, <User: me>, <User: testuser>]>
REGO METHOD: The test user existed, was deleted, and we can proceed with test!
REGO METHOD: waiting after potential del of user!
REGO METHOD DB USED:  [...]db.sqlite3
REGO METHOD: waiting 5 secs. after signup click.
REGO METHOD: We are now at URL:  http://localhost:8000/accounts/signup/
We now should have a new user in the DB:
########################################
Current content of DB after adding user:
REGO METHOD: printing allauth users:  <QuerySet [<User: adminuser>, <User: seconduser>, <User: me>, <User: testuser>]>
REGO METHOD: We could not create the test account, since it already exists!
Logged out User: Tearing down...
F
======================================================================
FAIL: test_user_email_registration (website.functional_tests.test_loggedOutUser.HomePageTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "[...] /website/functional_tests/test_loggedOutUser.py", line 323, in test_user_email_registration
    self.fail("REGO METHOD: We cannot create the test account, since it already exists.")
AssertionError: REGO METHOD: We cannot create the test account, since it already exists.

----------------------------------------------------------------------
Ran 1 test in 12.668s

FAILED (failures=1)

Вопросы. Как вы можете видеть, это очень примитивный тест. Однако, пользователь "TheTester" будет найден, удален, а затем мы не сможем создать пользователя через веб-интерфейс, потому что он все еще существует. Я пытался выяснить, какая БД используется, но безрезультатно. Не знаю, что я делаю не так, но похоже, что во время теста используются 2 разные БД.

После многих часов тестирования я обнаружил, что использование LiveServerTestCase делает то, что мне нужно. Возможно, часть моей проблемы заключалась в том, что я бил по реальному серверу, что, возможно, вынуждало использовать БД по умолчанию.

Модификации моего кода, чтобы заставить его работать:

from django.contrib.staticfiles.testing import StaticLiveServerTestCase as SLSTC


class HomePageTest(SLSTC):

      def test_user_email_registration(self):
          self.browser.get('%s%s' % (self.live_server_url, '/accounts/signup/'))

[...]

        targetURL = ('%s%s' % (self.live_server_url, '/accounts/confirm-email/'))

также измените:

if __name__ == '__main__':
    SLSTC.main()

Также не нужно больше искать и удалять существующего пользователя, так как БД будет полностью пуста.

Вернуться на верх