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

Что тестировать в Джанго: Моделей

Тестирование имеет много смысла. Но что вы должны проверить? Давайте посмотрим на тестирование моделей Django. Теги с Джанго, Питоном, тестированием.

Вступление

Программное тестирование – это дисциплина определения правильности программного обеспечения. Автоматизированные тесты, с другой стороны, это процесс написания программы, которую Тестирует программное обеспечение автоматически Отказ Вокруг Интернета есть целая множество дискуссий [1] О переворачивании автоматизированного тестовых люксов, поэтому я не собираюсь охватить вас своим собственным мнением по этому вопросу. Но если вы заботитесь о качестве программного обеспечения, который вы производите, и вы уже проверяете свои программы вручную, я могу уверенно убедиться, что наличие автоматизированного тестового набора будет повысить вашу производительность и уверенность в вашей кодовой базе.

Джанго Веб-каркас обеспечивает прочный набор Тестирующие объекты из коробки, придерживаясь Батареи включены Философия. С этими уже предоставленными, [2] Вы можете использовать коллекцию тестов – A Тестовый люкс – Решить или избежать, ряд проблем:

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

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

Анатомия модели Джанго

Давайте начнем с изучения того, как выглядит модель Django. Используя База данных аренды DVD Sakila Как ссылка ( ER Diagram [3] ), мы могли бы представлять Актер Таблица с этим кодом:

from django.db import models

# (1)
class Actor(models.Model):                             
    # (2)
    first_name = models.CharField(max_length=255)      
    last_name = models.CharField(max_length=255)
    last_update = models.DateTimeField(auto_now=True)

    # (3)
    film = models.ManyToManyToManyField(               
        "films.models.Film",
        related_name="actors",
        null=True,
        on_delete=models.SET_NULL,
    )

    # (4)
    def __str__(self):                                 
      return f"{self.first_name} {self.last_name}"

Этот код показывает как несколько вещей:

  1. Модель Django наследует от django.db.models. Модель Класс, позволяющий ему отображаться с определенной таблицей базы данных.
  2. Экземпляры django.db.models. Поле S затем можно прикрепить в качестве свойств к модели, позволяя им быть отображены в виде столбцов таблицы. Здесь мы определяем отношение многих ко многим между актером и фильмом. Обратите внимание, что null и on_delete Kwargs подразумевает, что актер не обязательно должен быть прилагается к нему фильма.
  3. Отношения являются неотъемлемой частью любых RDBMS, а Django позволяет нам удобно построить и получать доступ к этим отношениям в объектно-ориентированном способе.
  4. Наконец, модели – это просто классы Python под капотом, поэтому мы можем определить пользовательские (или Magic ) методы для бизнеса/презентации/мета-логики.

С этой информацией в уме мы можем теперь исследовать, как и то, что мы можем проверить модель Django.

Тестирование моделей полей

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

from datetime import datetime
from django.test import TestCase

from .models import Actor

# (1)
class ActorModelTest(TestCase):              
    # (2)
    @classmethod
    def setUpTestData(cls):                                     
        cls.actor = Actor.objects.create(
            first_name="John", 
            last_name="Doe"
        ) 

    # (3)
    def test_it_has_information_fields(self):                   
        self.assertIsInstance(self.actor.first_name, str)
        self.assertIsInstance(self.actor.last_name, str)

    # (4)
    def test_it_has_timestamps(self):                           
        self.assertIsInstance(self.actor.last_update, datetime)

Вот что делает этот код:

  1. Мы подкласс Джанго Testcase класс, который в свою очередь наследует от Неизвестный модуль Testcase Отказ Это позволяет нам использовать методы утверждения, такие как apserttrue () и Assertequals () , а также некоторые объекты доступа к базе данных, такие как SUTUPTESTATA () Отказ
  2. Используя вышеупомянутые SUTUPTESTATA () Способ класса, мы создаем один экземпляр актера, который будет использоваться остальными методами испытаний. Прочитайте Документация Поэтому мы используем это вместо Настройка () Метод от модульный тест. Testcase Отказ
  3. Затем мы проверяем, что первое и фамилия поля существуют в созданном экземпляре актера. Мы делаем это с помощью утверждений о конкретных свойствах, которые они имеют определенный тип, в этом случае ул ...| Отказ Точно так же мы проверяем, если
  4. last_update поле также существует, утверждая, что это datetime.dateTime тип.

Запуск вашего тестового набора, затем подтвердит, что в самом деле, модель актера имеет поля, которые вы ожидаете!

Тестирование модели отношений

Тестирование на модели отношений работает аналогично с моделей полями:

# ...

from films.models import Film

class ActorModelTest(TestCase):
    #  ...

    def it_can_be_attached_to_multiple_films(self):
        # (1)
        films = [Film.objects.create() for _ in range(3)]      
        # (2)
        for film in films:
            film.actors.add(self.actor)                         

        # (3)
        self.assertEquals(len(films), self.actor.films.count()) 
        for film in films:
            # (4)
            self.assertIn(film, self.actor.films)               

Новый метод испытаний должен быть самосознательным:

  1. Мы создаем кучу пленочных объектов для тестирования.
  2. Затем мы прикрепим экземпляр актера, который мы создали в SUTUPTESTATA () Метод для каждого из связанных актеров фильма.
  3. Наш экземпляр актера должен иметь такое же количество фильмов, как мы создали.
  4. И каждый из фильмов, который мы создали, должны быть в наборе актера связанных фильмов.

Теперь мы можем быть уверены, что наши модели подключены правильно.

Intermezzo: Что случилось с этими тестами?

Многие люди скажут, что эти методы тестируют Рамочный код и что мы не достигли много, написав эти тесты. Я говорю, что они тестируют Наша интеграция с рамками (I.e. Тестирование, которое мы используем правильные функции доступа к базе данных Django) вместо тестирования Как работает Рамочный код (то есть. Тестирование внутренней реализации integerfield ). И это прекрасно в моей книге.

По крайней мере, эти типы или тесты очень легко и быстро писать. И импульс очень важен в тестировании, вдвойне, так что если вы следите за TDD Отказ Если все еще сомневаюсь, такие тесты, как это Легко удалить по линии.

Учитывают их низкого риска, среднеоплачивающих инвестиций на ваш портфель тестовых люксов.

Тестирование методов модели

Наконец, давайте посмотрим, как можно написать тест для пользовательских методов модели:

# ...

class ActorModelTest(TestCase):
    #  ...

    # (1)
    def test_its_string_representation_is_its_first_and_last_name(self): 
        full_name = f"{self.first_name} {self.last_name}"
        # (2)
        self.assertEquals(str(self.actor), full_name)                    
  1. Быстрый совет: тесты предназначены для проверки, но они также идеальны в качестве добавленной документации. Не бойтесь писать чрезмерно описательные имена для ваших методов теста. Один должен быть в состоянии взглянуть на тест-тест и получить верхний вид на то, как работает специфический модуль или класс.
  2. Тестирование нашего __str __ () метод. Должен быть самоуверенным.

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

  1. Хороший – это check_ovailability (TimeDelta) Способ, который проверяет, может ли актер можно забронировать в течение определенного периода времени.
  2. Или Compute_Salary (фильм) Для расчета того, насколько актер должен быть оплачен для определенного фильма.
  3. Может быть, даже Уйти в отставку () Метод, который устанавливает некоторые поля базы данных для актера, означающие, что актер больше не принимает работу.

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

Заключение

В этой статье мы коснулись следующих моментов:

  • Какое программное тестирование есть, и то, что Django предоставляет в своих тестирующих объектах.
  • Из чего сделана модель Django.
  • Как проверить поля модели.
  • Как проверить отношения модели.
  • Как проверить пользовательские методы модели.

Я надеюсь, что вы получите что-то из этой статьи. Пусть ваши тесты будут зелеными и много. Оставайся в безопасности!

Сноски

Оригинал: “https://dev.to/alchermd/what-to-test-in-django-models-4loh”