Нужно ли тестировать поля модели в Django?

class Author(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    date_of_birth = models.DateField(null=True, blank=True)
    date_of_death = models.DateField('Died', null=True, blank=True)

MDN говорит:

Вам не нужно явно проверять, что first_name и last_name были правильно сохранены как CharField в базе данных, потому что это определено Django ... Однако вы должны проверить текст, используемый для меток (Имя, Фамилия, Дата рождения, Умер), и размер поля, выделенного для текста (100 символов), потому что это часть вашего дизайна и то, что может быть нарушено/изменено в будущем.

Если бы я хотел последовать этому совету, я бы не стал писать тест, проверяющий, что поле принимает только 100 символов, поскольку это означало бы проверку поведения Django. Вместо этого я бы написал тест, проверяющий, что max_length действительно равно 100.
. Этот тест может выглядеть примерно так:

    def test_max_length(self):
        self.assertEqual(models.Author._meta.get_field('first_name').max_length, 100)

Мне кажется, что этот тест будет в основном таким же, как проверка того, что я написал то, что написал. Конечно, если неправильный max_length ломает какой-то другой кусок кода, это должно быть проверено, но проверено в этом другом куске кода. Каковы лучшие практики тестирования полей моделей Django? Кроме цитаты из MDN я смог найти только очень общие утверждения типа "Тестируйте как можно больше" или "Если это может сломаться, вы должны это проверить". В частности, мне были бы интересны ресурсы или мнения о тонкой грани между тестированием кода/поведения и конфигурации. Я также был бы признателен за ответы на вопрос о том, должно ли количество возможных вариантов использования параметра/настроек влиять на подход к тестированию этого параметра. Например, можно утверждать, что max_length имеет единственную цель - определять максимальную длину, поэтому он не будет случайно изменен разработчиком, преследующим другую цель и случайно также изменившим max_length - вы измените max_length только если захотите изменить max_length.

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

Программа, которая не тестируется строго, скорее всего, будет содержать ошибки. Программа, в которой нет тестов, мертва.

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

В модели Author максимальное значение max_length для Author.first_name установлено на 20 из-за нехватки места. Поле, имеющее такое максимальное значение, уже введено в базу данных, поэтому мы не можем опуститься ниже из-за этого поля.

def test_max_length(self):
    self.assertEqual(models.Author._meta.get_field('first_name').max_length, 20)

Приведенный выше простой тест будет полезен в следующих сценариях:

  • Другой разработчик увеличивает max_length из Author.first_name, чтобы позволить более длинные значения, но не учитывает ограничение пространства. Тест провалится, и если были добавлены какие-либо сообщения, то они будут знать, почему это требование является таковым.
  • Другой разработчик уменьшает max_length из Author.first_name, чтобы сэкономить место, но не знает об уже существующем значении в базе данных. Тест также провалится, и если какие-либо сообщения были добавлены, они будут знать, почему это требование так.

В конечном счете, автоматизированное тестирование - это то, что дает спокойствие, когда вокруг хаос. [1]


[1]Я немного преувеличил.

Вернуться на верх