Общая тестовая БД для Django TestCase

Введение

Я пишу модульные тесты для проекта Django, где некоторые записи БД загружаются из файла. Разбирать файл и создавать все записи дорого.

Приложение имеет разные модули для тестов, поэтому я реализую один TestCase для каждого модуля.

Проблема

Модули полагаются на данные, извлеченные из файла (т.е. им нужна одна и та же БД), но я не могу позволить себе перенастраивать БД для всех разных TestCase, как здесь:

class TestBehavior_A(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

class TestBehavior_B(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

class TestBehavior_C(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

Я также не могу объединить все свои тестовые примеры в одном классе, иначе это будет беспорядок.

В идеале

Я хотел бы, чтобы одна установка была общей для всех моих тестовых случаев (т. е. вызывать setUpClass только один раз)

Имея нечто подобное:

class TestBase(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

   class TestBehavior_A(TestCase):
       pass

   class TestBehavior_B(TestCase):
       pass

   class TestBehavior_C(TestCase):
       pass

person Ultramoi    schedule 27.12.2019    source источник


Ответы (2)


Я не смог найти правильного способа настроить БД один раз для всех TestCase.

Вместо этого я просто проверяю expensive_db_init(), была ли БД уже инициализирована из файла (проверяя наличие определенных записей), если нет, то инициализирую.

person Ultramoi    schedule 27.12.2019

Библиотечный модуль: unittest

субаренду из django.test.TestCase, который является подклассом unittest.TestCase.

from django.test import TestCase

from myapp.models import Animal

class AnimalTestCase(TestCase):

    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")
        self.assertEqual(lion.speak(), 'The lion says "roar"')
        self.assertEqual(cat.speak(), 'The cat says "meow"')   

Запуск тестов:

запустите их с помощью тестовой команды утилиты manage.py вашего проекта:

 $ ./manage.py test

Запустите все тесты в модуле animals.tests

$ ./manage.py test animals.tests

Запустите все тесты, найденные в пакете «животные».

$ ./manage.py test animals

Запустите только один тестовый пример

$ ./manage.py test animals.tests.AnimalTestCase

Запустите только один метод тестирования

$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak
person sanket prajapati    schedule 31.12.2019