Юнит-тестирование Django: разделение юнит-тестов без многократного запроса к базе данных. - PullRequest
0 голосов
/ 17 января 2019

У меня есть пара таких тестов:

Убедитесь, что статус удаления задания инициализируется как Нет

def test_initial_task_deletion_status_is_none(self):
    unfinished_task = Task.objects.get(tasked_with="Unfinished Test")
    self.assertIsNone(unfinished_task.delete_status)

# Make sure a task's deletion status changes appropriately
def test_unfinished_task_deletion_status_updates_appropriately(self):
    unfinished_task = Task.objects.get(tasked_with="Unfinished Test")
    unfinished_task.timed_delete(delta=.1)
    self.assertIs(unfinished_task.delete_status, "Marked for Deletion")

Это будет продолжаться, но у меня будет unfinished_task = Task.objects.get(tasked_with="Unfinished Test") в начале каждого. Есть ли способ разделить эти типы вещей на отдельные тесты, но использовать один и тот же результат запроса?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

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

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

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

0 голосов
/ 17 января 2019

Если вы используете инфраструктуру тестирования Django , то вы можете сделать это, используя setUp(). Подробнее о unittest.TestCase.setUp() здесь

Итак, ваш обновленный фрагмент будет выглядеть так:

from django.test import TestCase

class MyTestCase(TestCase):
    def setUp(self):
        self.unfinished_task = Task.objects.get(tasked_with="Unfinished Test")

    def test_initial_task_deletion_status_is_none(self): 
        self.assertIsNone(self.unfinished_task.delete_status)

    # Make sure a task's deletion status changes appropriately
    def test_unfinished_task_deletion_status_updates_appropriately(self):
        self.unfinished_task.timed_delete(delta=.1)
        self.assertIs(self.unfinished_task.delete_status, "Marked for Deletion")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...