Рубрики
Без рубрики

Django Testing Toolbox.

Каковы инструменты, которые я использую для проверки приложения Django? Давайте разберемся! Вы можете сказать, что я тест одержим … Помечено Python, Django, тестирование.

Каковы инструменты, которые я использую для проверки приложения Django? Давайте разберемся!

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

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

Должен иметь тестирование пакетов

Pytest-django.

Забудьте о приспособлениях. Многие люди рвет о pteest Из-за его системы приспособления для настройки данных. Система мощна, но я не очень забочусь об этом.

Вот почему я люблю питоист.

Мне нравится Pteest для Super Clean API, который он обеспечивает обработку утверждений. Это утверждать . Вот и все!

Наличие тестового стиля, который вращается вокруг одного ключевого слова и в сочетании со стандартным сравнением, является фантастическим. Давайте сравним.

import unittest

class TestWithUnittest(unittest.TestCase):
    def test_sample(self):
        none_variable = None

        self.assertEqual(3, 3)
        self.assertNotEqual(4, 5)
        self.assertTrue(True)
        self.assertNotIn(1, [2, 3, 4])
        self.assertIsNone(none_variable)

class TestWithPytest:
    def test_sample(self):
        none_variable = None

        assert 3 == 3
        assert 4 != 5
        assert True
        assert 1 not in [2, 3, 4]
        assert none_variable is None

Для меня это не мозги, что Утверждать Синтаксис стиля легче читать. Есть меньше API, чтобы учиться. Остальное применяет знание сравнения Python, которое вы, вероятно, уже имеете.

Вы можете слышать меня больше о PteSt на моем Python Testing 101 с Pteest Презентация, которую я дал Питону Фредерику.

factory_boy.

Django использует базу данных. Я определенно не тестовый пурист. Это совершенно нормально для модульных тестов для использования базы данных. Если вы не согласны и думаете, что это тест интеграции, отлично, я не буду держать это против вас. 😜

Нет лучшего способа сделать поддельные данные в вашей базе данных тестирования, чем использовать factory_boy Отказ Factory_boy имеет одно задание: создайте строки базы данных из ваших определений модели, которые достаточно реально, чтобы проверить.

Если у вас есть модель, вы создаете соответствующий завод. В вашем тесте вы используете завод для создания экземпляра модели. Как это лучше, чем Mymodel.Objects.reate ? Это лучше, потому что Facty_Boy обрабатывает необходимые поля по умолчанию.

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

def test_crazy_model_with_factory():
    crazy = MyCrazyModelFactory()

    # Make assertion about the crazy instance.

def test_crazy_model_without_factory():
    crazy = MyCrazyModel.objects.create(
        a=1,
        b=2,
        c=3,
        d=4,
        e=5,
        f=6,
        g=7,
        h=8,
        i=9,
        j=10,
        # ... and 40 more required fields
    )

    # Make assertion about the crazy instance.

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

factory_boy – удивительный инструмент!

django-test-plus

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

С некоторым умным издевательством и потянув в различных инструментах Django, можно проверить все эти виды общих тестовых сценариев Django. Или вы можете переключиться на легкий режим с помощью django-test-plus Отказ

Я обнаруживаю, что Django-Test-Plus делает простые вещи простыми, а тяжелые вещи выполняемые.

Проверь это:

from test_plus.test import TestCase

class TestHome(TestCase):
    def test_ok(self):
        self.get_check_200('home')

Это супер! Мне не нужно:

  • Беспорядок с обратный Чтобы получить URL для Главная Отказ
  • Используйте тест Клиент сделать HTTP-запрос.
  • Или даже Утверждать Чтобы проверить, что ответ был 200 ОК Действительно

Django-Test-Plus полон таких вкусностей, чтобы упростить количество тестового кода, который вам нужно написать, чтобы сделать работу.

Это самое последнее дополнение к моему инструментов для тестирования, и я стал большим вентилятором.

Супер полезные методы

Тестовые случаи в порядке!

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

Я редко использую функциональные тесты. Почему? Потому что Пространства имен – одна загадка отличной идеи Действительно А Testcase Класс дает вам пространство имен, чтобы поставить связанные тесты.

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

С Testcase У вас есть хороший дом, чтобы разместить свои тесты. Вы можете проверить все о виду или модели в одном классе тестирования. Ваш класс теста становится слишком большим? Может быть, это код кода, который ваш взгляд или модель слишком велики и слишком велики! Я нахожу это Testcase Классы помогают мне раньше выяснить такие проблемы.

Дайте тесты общей структуры

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

from test_plus.test import TestCase

class TestPetDetailView(TestCase):
    """I try to pick a class name that is the thing I want to test,
    prefixed by `Test`.
    """

    def test_some_meaningful_name(self):
        """Use a docstring.

        Future you or your teammate will appreciate the written context.
        It's tempting to write only a long method name. In my experience,
        a missing docstring will bite you in the end.

        I like blank lines between Arrange/Act/Assert to have clear separation.
        """
        # Arrange - Set up your test state.
        pet = PetFactory(name='Fido')

        # Act - Run the code that you want to test.
        self.get('pet:detail', pk=pet.id)

        # Assert - Check the code that the test acted on.
        self.assertResponseContains('Fido')

Используйте базу данных SQLite в памяти Если сможешь

Вы, вероятно, должны иметь отдельные файлы настроек для вашей конфигурации тестирования. Вот Пример от моего Строительство Саас проект.

Если вам не нужна определенная функциональность из определенной базы данных, использование базы данных Sqlite в памяти может предоставить некоторые очень быстрое тестирование без суеты очистки. Чтобы сделать эту работу, я установил мой Базы данных Настройка в моем файле настроек теста на:

DATABASES = {
    "default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}
}

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

Отключить бегущие миграции Во время тестирования

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

Ну, ты можешь! Этот маленький фрагмент настроек вызовет Django для пропустить миграцию при запуске тестового набора. Это может быть огромный Скорость Бона.

class DisableMigrations(object):
    def __contains__(self, item):
        return True

    def __getitem__(self, item):
        return None


MIGRATION_MODULES = DisableMigrations()

Используйте более быстрый пароль Hasther

Я присоединился к компании много лет назад, что управлял Django в своем технологическом стеке. В моей первой паре недель на работе я изучал (потому что работа была удивительной и дала мне пространство, чтобы учиться).

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

Тестовый люкс компании создал так много Пользователь Экземпляры, которые, когда я выключил пароль Hasther, время выполнения было более чем разрезанным пополам! Я говорю о том, чтобы идти от 25-минутного теста CI, проходит чуть более 10 минут!

Если вы создаете много пользователей в ваших тестах, то такое изменение является обязательным. Самый простой вариант – использовать одно из более быстрых (и менее безопасных) хэш-памяти Django, как Md5passwordhasher Отказ Или, если вам нравится еще больше скорости, вы можете использовать этот манекен (небезопасную!) Hasher.

class SimplePasswordHasher(BasePasswordHasher):
    """A simple hasher inspired by django-plainpasswordhasher"""

    algorithm = "dumb"  # This attribute is needed by the base class.

    def salt(self):
        return ""

    def encode(self, password, salt):
        return "dumb$$%s" % password

    def verify(self, password, encoded):
        algorithm, hash = encoded.split("$$", 1)
        assert algorithm == "dumb"
        return password == hash

    def safe_summary(self, encoded):
        """This is a decidedly unsafe version.

        The password is returned in the clear.
        """
        return {"algorithm": "dumb", "hash": encoded.split("$", 2)[2]}


PASSWORD_HASHERS = ("project.testing_settings.SimplePasswordHasher",)

Подряд Ваш текстовый редактор

Знаете ли вы, как запустить один тест Django из вашего текстового редактора с одним ярлыком клавиатуры? Если вы ответили «Нет», то вы должны себе менять, чтобы изменить этот ответ на «Да».

Многие редакторы имеют инструменты или плагины, которые могут сделать пробежные тесты чрезвычайно естественными. Для меня в Vim, я могу запустить тест, нажав <пробел> т (Вы можете узнать, как в этом Нагрудник Vim Статья моей). Результаты теста будут отображаться прямо в моем редакторе, чтобы я мог немедленно перейти назад, чтобы исправить все, что сломано.

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

В конце концов…

Все это просто, как, мой мнение, человек. Я надеюсь, что вы найдете некоторые из него, хотя. Удачи Тестирование!

Если у вас есть вопросы или наслаждались этой статьей, пожалуйста, не стесняйтесь сообщить мне в Twitter на @mblayman Или делиться, если вы думаете, что другие тоже могут быть заинтересованы.

Эта статья впервые появилась на mattlayman.com.

Оригинал: “https://dev.to/mblayman/django-testing-toolbox-n9l”