Более элегантный подход к написанию модульных тестов Django

В настоящее время я пишу тесты, используя модульные тесты Django (на основе модуля стандартной библиотеки Python: unittest). Я написал этот тест для своей модели контакта, который проходит:

class ContactTestCase(TestCase):
    def setUp(self):
        """Create model objects."""
        Contact.objects.create(
            name='Jane Doe',
            email='[email protected]',
            phone='+2348123940567',
            subject='Sample Subject',
            message='This is my test message for Contact object.'
        )


    def test_user_can_compose_message(self):
        """ Test whether a user can compose a messsage in the contact form."""
        test_user = Contact.objects.get(name='Jane Doe')
        self.assertEqual(test_user.email, '[email protected]')
        self.assertEqual(test_user.phone, '+2348123940567')
        self.assertEqual(test_user.subject, 'Sample Subject')
        self.assertEqual(test_user.message, 'This is my test message for Contact object.')
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.005s

OK
Destroying test database for alias 'default'...

Однако в этом тесте мне пришлось использовать метод assertEqual 4 раза (может быть и больше, если тестировать модели с большим количеством полей). Похоже, это не соответствует принципу DRY.

Из документации я знаю, что assertEqual(first, second, msg=None) тесты, в которых первое и второе равны. Если значения не сравниваются равными, тест завершится неудачно.

Есть ли обходной путь или более элегантный подход к написанию таких тестов?

Мне кажется, пример нереалистичный — что вы здесь вообще тестируете? Похоже, вы проверяете, что Django ORM работает должным образом, что уже подтверждено собственными тестами Django. Вместо этого вам следует тестировать логику вашего собственного приложения.

wim 07.08.2024 02:01

Я тоже так думал... создавая приложения django, я понял, что писать тесты для моделей, представлений, URL-адресов и т. д. — это хорошая практика, даже если кажется, что приложение работает правильно. Больше похоже на проверку здравомыслия.

16171413 07.08.2024 02:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Идеальный вопрос! Добро пожаловать в сообщество тестов качества!

  1. Создайте список/диктант с тестовыми примерами.
  2. Просмотрите список и вызовите Assert в контексте подтеста.
  3. Наслаждаться.

Пример здесь:

def test_user_can_compose_message(self):
    """ Test whether a user can compose a messsage in the contact form."""
    test_user = Contact.objects.get(name='Jane Doe')
    test_cases = {'email': '[email protected]', 'phone': '+2348123940567', 'subject': 'Sample Subject', 'message': 'This is my test message for Contact object.'}
    for field, value in test_cases.items():
        with self.subTest("wrong user subtest", field=field, ):
            self.assertEqual(getattr(test_user, field), value)

Кстати, не забудьте использовать Factory Boy и старайтесь избегать жестко запрограммированных констант. Вместо этого вы можете использовать django.utils.crypto.render_string и т. д.

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

16171413 07.08.2024 14:49

работает так, как ожидалось. Спасибо.

16171413 08.08.2024 01:29

Можете ли вы пролить больше света на это с помощью self.subTest("неправильный пользовательский подтест", field=field,):'?

16171413 08.08.2024 01:34

Другие вопросы по теме