#python #django #django-testing
#python #django #django-тестирование
Вопрос:
Я пытаюсь выполнить свои первые тесты на Django, и я не знаю, делать это или после прочтения документов (где объясняется очень простой тест) Я до сих пор не знаю, как это сделать.
Я пытаюсь выполнить тест, который переходит на URL-адрес «login» и выполняет вход в систему, а после успешного входа перенаправляется на авторизованную страницу.
from unittest import TestCase
from django.test.client import Client
class Test(TestCase):
def testLogin(self):
client = Client()
headers = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password', 'Content-Type': 'application/json'}
data = {}
response = client.post('/login/', headers=headers, data=data, secure=False)
assert(response.status_code == 200)
И тест прошел успешно, но я не знаю, связано ли это с 200 загрузкой «/ login /» или потому, что тест выполняет вход в систему и после перенаправления получает код 200.
Как я могу проверить в тесте, что после входа в систему URL перенаправлен правильно? Есть плагин или что-то, что помогает с тестированием? Или где я могу найти хороший учебник для проверки моих представлений и модели?
Спасибо и с уважением.
Комментарии:
1. Почему бы вам не следовать Django doct при тестировании ?
2. Я пытался следовать руководству документа, но получаю ошибки.
Ответ №1:
Чтобы правильно протестировать перенаправления, используйте параметр follow
Если вы установите для follow значение True, клиент будет выполнять любые перенаправления, а в объекте response будет установлен атрибут redirect_chain, содержащий кортежи промежуточных URL-адресов и кодов состояния.
Тогда ваш код так же прост, как
из django.test импортируйте тестовый кейс
class Test(TestCase):
def test_login(self):
client = Client()
headers = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password', 'Content-Type': 'application/json'}
data = {}
response = client.post('/login/', headers=headers, data=data, secure=False)
self.assertRedirects(response,'/destination/',302,200)
Обратите внимание, что это self.assertRedirects
, а не assert
или assertRedirects
Также обратите внимание, что приведенный выше тест, скорее всего, завершится неудачей, потому что вы отправляете пустой словарь в качестве данных формы. Представления формы Django не перенаправляются, когда форма недействительна, и пустая форма, вероятно, будет здесь недействительной.
Комментарии:
1. Ах, хорошо, спасибо. Я сейчас на работе, попробую позже! Я отправляю data={}, потому что я не вхожу в систему с помощью Django, я делегирую вход в IDP (OpenAM), и в коде я использую тот же формат и работает, поэтому в тесте он тоже должен работать :/
2. Работает, только еще один вопрос. Почему я получаю «AssertionError: ответ перенаправлен не так, как ожидалось: код ответа был 200 (ожидалось 302)» В коде, который я использую «return HttpResponseRedirect (‘/ loggedin’)». Это правильно?
3. Я не знаю почему, но при отладке я вижу, что «redirect_chain» пуст. Я пробую примеры документов, адаптированные к моему коду, но я получаю пустой список в «redirect_chain»….
4. извините за задержку, это означает, что ваше представление перенаправляется не так, как вы ожидали, возможно, ситуация, о которой я упоминал: форма не проверяется должным образом.
5. Нет проблем! Я проверю, не происходит ли сбой формы, но я не знаю, почему, если в коде и при использовании веб-сайта в обычном режиме он работает отлично. Может быть, мне следует что-то настроить или выполнить тест другим способом. Спасибо за ваш отзыв!
Ответ №2:
В Django есть множество инструментов для тестирования. Для этой задачи вам следует использовать, например, класс тестового примера из Django django.test.TestCase
. Затем вы можете использовать метод assertRedirects()
, и он проверит, куда вы были перенаправлены и с каким кодом. Вы можете найти любую необходимую вам информацию здесь. Я пытался написать код для вашей задачи:
from django.test import TestCase
class Test(TestCase):
def test_login(self):
data = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password'}
response = client.post('/login/', data=data, content_type='application/json', secure=false)
assertRedirects(response, '/expected_url/', 200)
Затем вы можете использовать python3 manage.py test
для запуска всех тестов.
Комментарии:
1. Привет, я пытался сделать это, прежде чем задать этот вопрос, но я все время получаю «в assertRedirects url = response.url AttributeError: объект ‘HttpResponse’ не имеет атрибута ‘url’ «.