Тесты Django Rest Framework не работают при использовании PostgreSQL
Я новичок в Django и недавно изменил базу данных с SQLite на PostgreSQL (впервые использую postgreSQL). Я обновил настройки следующим образом:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'DB_NAME',
'USER': 'DB_USER',
'PASSWORD': 'DB_PASSWORD',
'HOST': 'localhost'
}
}
Для пользователя я не использую пользователя postgress по умолчанию, вместо этого я создал нового пользователя (для которого в ОС есть учетная запись User) и добавил для него пароль. Затем я дал этому пользователю разрешение на createdb:
ALTER USER username CREATEDB;
Я также установил psycopg2.
При обычном использовании api база данных PostgreSQL обновляется просто отлично и работает как ожидалось. Первоначально при использовании SQLite все тесты тоже проходили. Но когда я перешел на PostgreSQL, используя вышеуказанное, 2 из 9 тестов не прошли.
Вот тесты, которые не работают. Все неудачные тесты относятся к одному классу. 6 тестов относятся к другому классу, и все они проходят нормально.
class APIDetailTest(APITestCase):
items_url = reverse('site')
item_url = reverse('site-item', args = [1])
def setUp(self):
# Creating an initial entry to be tested.
data = {
"Name": "data name",
"Description": "desc",
"Date": "2022-06-11",
"Time": "11:00:00",
"Tag": "",
}
self.client.post(self.items_url, data, format='json')
def test_Get(self):
# Testing that getting an item by id returns the correct data.
response = self.client.get(self.item_url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data["Name"], "data name")
def test_Update_Item(self):
# Testing that changing the data works correctly.
data = {
"Name": "data name",
"Description": "desc 2",
"Date": "2022-06-11",
"Time": "11:00:00",
"Tag": "Work",
}
response = self.client.put(self.item_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Checking that changed fields are changed correctly:
self.assertEqual(response.data["Description"], "desc 2")
self.assertEqual(response.data["Tag"], "Work")
# Checking that unchanged fields remained unchanged:
self.assertEqual(response.data["Name"], "data name")
def test_Delete_Item(self):
# Testing that deleting an item removes it fully.
response = self.client.delete(self.item_url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Testing that the item no longer exists after it has been deleted
response = self.client.get(self.item_url)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
Из вышесказанного следует, что test_Get и test_Update_Item оба не работают, если я запускаю тесты. Однако, когда я удаляю 2 из 3 тестов из класса, каждый из них всегда проходит. Но при запуске всех трех тестов вместе они по какой-то причине терпят неудачу.
Ниже приведено сообщение об ошибке:
Found 9 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.FF......
======================================================================
FAIL: test_Get (Calendar.Cal_API.tests.APIDetailTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/user/Documents/Calendar/Calendar/Calendar/Cal_API/tests.py", line 113, in test_Get
self.assertEqual(response.status_code, status.HTTP_200_OK)
AssertionError: 400 != 200
======================================================================
FAIL: test_Update_Item (Calendar.Cal_API.tests.APIDetailTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/user/Documents/Calendar/Calendar/Calendar/Cal_API/tests.py", line 126, in test_Update_Item
self.assertEqual(response.status_code, status.HTTP_200_OK)
AssertionError: 400 != 200
----------------------------------------------------------------------
Ran 9 tests in 0.324s
FAILED (failures=2)
Destroying test database for alias 'default'...
Кто-нибудь знает, почему это происходит?
Спасибо за любую помощь
Вы можете использовать sqlite3 вместо postgres. Добавьте этот код в ваш файл настроек.
import sys
if 'test' in sys.argv or 'test_coverage' in sys.argv: #Covers regular testing and django-coverage
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'