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()
Также не нужно больше искать и удалять существующего пользователя, так как БД будет полностью пуста.