Как выполнить тестирование в Django

#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’ «.