Недавно я начал работу над проектом Django. Для начала я прочитал book on TDD with Python и официальную документацию (для tests). И еще несколько блогов.Django - Написание блок-тестов с помощью mocks
Одна вещь, которую я замечаю, они пишут тесты, которые получают доступ к моделям баз данных. Рассмотрим следующий фрагмент кода here
def test_home_page_can_save_a_POST_request(self):
request = HttpRequest()
request.method = 'POST'
request.POST['item_text'] = 'A new list item'
response = home_page(request)
self.assertEqual(Item.objects.count(), 1)
new_item = Item.objects.first()
self.assertEqual(new_item.text, 'A new list item')
Испытание утверждающий ли число Item
объектов 1. Таким образом, тест на самом деле добавляет и извлекает данные из базы данных. Разве это не сделало бы тест медленным?
Если тесты распараллелены, этот тестовый пример может завершиться неудачно, если есть еще один тест, который добавляет объект Item
, верно?
Как насчет методов/объектов патчей? Выше фрагмент кода может быть переработан, как этот
@patch('my_app.views.Item')
def test_home_page_can_save_a_POST_request(self, mock_item):
request = HttpRequest()
request.method = POST
request.POST['item_text'] = 'A new list item'
response = home_page(request)
self.assertTrue(mock_item.objects.create.called)
Я новичок в Django, и я не знаком с практикой. В учебниках, которые я посетил, были написаны тесты, которые говорят с базой данных. Я хотел бы знать, является ли это конвенцией для тестирования в проектах Django. Является ли второй фрагмент (с использованием патчей и макетов) превосходным в экосистеме Django?
Редактировать: То же самое с формами также - Издевательский form.is_valid
метод для возврата True
или False
, при условии, что существуют отдельные модульные тесты для форм.
P.S. TDD с Python - потрясающая книга, которая очень помогла мне в посадке. Я определенно рекомендую это всем, кто изучает Django.
Испытания, выполняемые в их собственных транзакциях, не зависят друг от друга, насколько доступны данные/ожидаемые данные. (Спасибо за указатель на книгу - отлично!) –