Django 5 для начинающих

Прогресс по курсу:  9/1004

2.8 Введение в тестирование приложений
2 из 2 шагов пройдено

Введение в тестирование приложений

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

Тестирование можно разделить на две основные категории: модульное и интеграционное.

Юнит-тесты проверяют часть функциональности в отдельности, в то время как интеграционные тесты проверяют несколько частей, связанных вместе. Юнит-тесты выполняются быстрее и их легче поддерживать, поскольку они фокусируются только на небольшом фрагменте кода.

Интеграционные тесты выполняются медленнее и их сложнее поддерживать, поскольку сбой не указывает на конкретную причину. Большинство разработчиков фокусируются на написании большого количества модульных тестов и небольшого количества интеграционных тестов.

Стандартная библиотека Python содержит встроенный механизм тестирования unittest, который использует экземпляры TestCase и длинный список методов assert для проверки и сообщения о сбоях.

Собственная структура тестирования Django предоставляет несколько расширений поверх базового класса Python unittest.TestCase. Они включают тестовый клиент для выполнения фиктивных запросов веб-браузера, ряд дополнительных утверждений, специфичных для Django, и четыре класса тестовых примеров: SimpleTestCase, TestCase, TransactionTestCase и LiveServerTestCase.

Вообще говоря, SimpleTestCase используется, когда база данных не нужна, в то время как TestCase используется, когда вы хотите протестировать базу данных. TransactionTestCase полезен, если вам нужно напрямую протестировать транзакции базы данных, а LiveServerTestCase запускает поток живого сервера, полезный для тестирования с помощью браузерных инструментов, таких как Selenium.

Небольшое замечание, прежде чем мы продолжим: вы можете заметить, что имена методов в unittest и django.test написаны в camelCase, а не в более питоническом стиле snake_case. Причина в том, что unittest основан на фреймворке тестирования jUnit из Java, который использует camelCase, поэтому, когда unittest был добавлен в Python, он получил именование в camelCase.

Если вы посмотрите на наше приложение blog, Django уже создал файл tests.py, который мы можем использовать. Поскольку в нашем проекте пока не задействована база данных, мы импортируем SimpleTestCase в верхней части файла.

Для наших первых тестов мы проверим, что два URL нашего сайта, домашняя страница и страница о сайте, оба возвращают HTTP код состояния 200, стандартный ответ для успешного HTTP запроса.

blog/tests.py:

from django.test import SimpleTestCase


class HomepageTests(SimpleTestCase):
    def test_url_exists_at_correct_location(self):
        response = self.client.get("/")
        self.assertEqual(response.status_code, 200)


class AboutpageTests(SimpleTestCase):
    def test_url_exists_at_correct_location(self):
        response = self.client.get("/about/")
        self.assertEqual(response.status_code, 200)


Для запуска тестов выйдите из сервера с помощью Ctrl+C и введите в командной строке для запуска тестов:

python manage.py test


Если вы видите ошибку типа AssertionError: 301 != 200, то, скорее всего, вы забыли добавить косую черту к /about выше. Веб-браузер знает, что автоматически добавляет слеш, если он не указан, но это приводит к 301-му перенаправлению, а не к 200-му успешному ответу!


  • Комментариев
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Комментарий закреплён

Понравилась задача, тест или урок? Поставьте лайк, поддержите курс. Ваша поддержка очень важна для нас.

имена методов в unittest и django.test написано (ы)

Наверное надо поправить, если я правильно понял)

@Нарбеков_Марсель, спасибо, исправил.

Возможно, стоит упомянуть, что названия методов test_url_exists_at_correct_location() являются произвольными - можно дать любое (желательно, "говорящее") имя.

Как я понимаю, выполнятся все объявленные методы (статические и методы класса использовать не получится)

@ilya_kutaev, Хорошо, думаю на днях сделаем чуть подробнее эти моменты.

@ilya_kutaev, не совсем верно.

Тест-раннеры (unittest, PyTest и др.) сами находят тестовые методы в указанных при запуске файлах, но для этого нужно следовать общепринятым правилам. Общее правило для всех фреймворков: название тестового метода должно начинаться со слова "test_".  Дальше может идти любой текст, который является уникальным названием для теста:

def test_name_for_your_test():

Источник: курс Автоматизация тестирования с помощью Selenium и Python

Изменен Anonymous 450292901

@Anonymous_450292901, Спасибо, про префикс test_ было неочевидно!

курс огонь

Вопрос про виртуальное окружение:

При написании проекта (создание и редактирование файлов и т.д.) мы всегда должны быть с подключенным виртуальным окружением? Или его подключаем только тогда, когда обновляем или устанавливаем дополнительные библиотеки?

Изменен Максим Михеев

@Максим_Михеев, всегда, ведь проект должен запускаться со своим набором библиотек.
При создании и редактировании файлов виртуальное окружение не нужно.

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, Спасибо за ответ. Думаю, об этом неплохо было бы упомянуть поподробнее в начальных главах курса, так как это совсем не очевидно. Ну и собственно о том как в него заходить/выходить (что нужно находится в папке с проектом и в терминале ввести - команда входа: venv\Scripts\activate.ps1, команда выхода: deactivate). А может даже добавить краткое описание навигации по командной строке в терминале (хотя бы переходы по папкам).

Изменен Максим Михеев

@Максим_Михеев, при использовании PyCharm, виртуальное окружение запускается автоматически. Если используется другой редактор, то виртуальное окружение можно запустить, выполнив в командной строке .\venv\Scripts\activate.bat (для Windows) или source venv/bin/activate (для Linux), предварительно перейдя в директорию проекта, выполнив команду cd путь до проекта. После запуска виртуального окружения можно устанавливать библиотеки или запускать проект. Для выхода используется команда deactivate. Для простейших проектов достаточно блокнота и командной строки, но в дальнейшем лучше не использовать блокнот, даже для простейших правок шаблонов, он добавляет байты BOM в начало файла, могут быть проблемы из-за этого.

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, Я использую PyCharm и у меня автоматически не запускается (может всё дело в бесплатной версии), именно поэтому и возник вопрос.

@Максим_Михеев, я то-же использую бесплатную версию, всегда автоматически запускается, только я использую командную строку в терминале.

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, Здравствуйте, пытался менять дефолтный powershell на командную строку windows как у вас (остальные настройки соответственно такие же) но автоматического входа в виртуальное окружение не происходит. Или я что то не так делаю или не понимаю в чем состоит автоматизация входа.

Заметил следующее поведение:

- в powershell из стартовой директории перехожу в папку со своим проектом, подключаю venv, выхожу из PyCharm, при следующем запуске PyCharm в терминале снова стартовая директория (без подключенного venv)  

- в cmd из стартовой директории перехожу в папку со своим проектом, подключаю venv, выхожу из PyCharm, при следующем запуске PyCharm в терминале уже не стартовая директория, а папка с моим проектом (но тоже без подключенного venv)  

В какой момент происходит автоматический вход в venv ?

@Максим_Михеев, после создания проекта PyCharm, виртуальное окружение активируется автоматически, без каких-либо команд с моей стороны. Затем я ставлю Django и создаю его проект. После повторного открытия этого проекта PyCharm, виртуальное окружение запускается сразу, без дополнительных действий.

Специально попробовал, создал новый проект, всё работает как и прежде.

@Максим_Михеев, посмотрите, есть ли эта галка в настройках терминала:

@Дмитрий_Селезнев, Большое Вам спасибо за помощь, наконец-то разобрался. Я тут сам немного затупил. Дело в том, что я постоянно выходил из папки проекта, на несколько уровней выше, так как там тоже есть файлы на python в которых решаю задания на другом курсе, ну и соответственно из вышестоящей директории (в Projects) вся ветка вниз видна, и проект можно открыть и произвести в нем изменения и даже запустить через терминал перейдя к нужной папке. Вот это и сбило с толку, думал что при переходе в папку проекта через командную строку в терминале, должно было venv подключаться, но нет. А как только я зашел через File --> Open --> "Папка проекта" - все стало нормально, venv подключается автоматически (работает для любой командной строки). 

Еще раз спасибо.

@Максим_Михеев, Запускайте несколько проектов в PyCharm Community, каждый в своем окне (она спрашивает при открытиии или создании проекта), и не придется бегать между папками

А почему может быть разница в ответах, у вас found 2 test,  у меня 0 ?

@Дмитрий_Чекмасов, у вас не найдены тесты, проверьте путь до файла тестов и его название.

вроде все верно

 

@Дмитрий_Чекмасов, загрузите архив проекта по ссылке https://mega.nz/filerequest/rANtUqzWHQ4, посмотрим почему не запускаются тесты.

@Дмитрий_Селезнев, загрузил

@Дмитрий_Чекмасов, В папке blog нет файла __init__.py.  Это пустой  файл,  который  сообщает  Python,  что  каталог blog нужно трактовать как модуль Python. PyCharm создает его автоматически, при создании проекта, как делает VSCode я незнаю, возможно работая в нем придется проверять такие моменты.

@Илья_Перминов, заработало, спасибо за помощь ! Папку blog создавал по колхозному, ручками, поэтому там и не мог быть файл init )

Получается init должен быть в каждой папке проекта ?

@Дмитрий_Чекмасов, да. Посмотрите тут для примера: https://github.com/Permin0ff/Cource_FirstProject.