В настоящее время я пишу тесты, используя модульные тесты 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, я понял, что писать тесты для моделей, представлений, URL-адресов и т. д. — это хорошая практика, даже если кажется, что приложение работает правильно. Больше похоже на проверку здравомыслия.
Идеальный вопрос! Добро пожаловать в сообщество тестов качества!
Пример здесь:
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
и т. д.
Это выглядит намного лучше, и я собираюсь опробовать его, как только запущу свое приложение. Кстати, я только что посмотрел на фабричного парня. посмотрю, как пойдет
работает так, как ожидалось. Спасибо.
Можете ли вы пролить больше света на это с помощью self.subTest("неправильный пользовательский подтест", field=field,):'?
Мне кажется, пример нереалистичный — что вы здесь вообще тестируете? Похоже, вы проверяете, что Django ORM работает должным образом, что уже подтверждено собственными тестами Django. Вместо этого вам следует тестировать логику вашего собственного приложения.