Очистка базы данных в django перед каждым тестовым методом - PullRequest
19 голосов
/ 12 января 2009

По умолчанию, когда Django работает с бэкэндом sqlite, он создает новую базу данных в памяти для теста. Это означает, что для каждого класса, производного от unittest.TestCase, я получаю новую базу данных. Можно ли это изменить, чтобы он очищался перед запуском каждого метода тестирования?

Пример: я тестирую класс менеджера, который обеспечивает дополнительную абстракцию поверх постоянных объектов Django. Код выглядит более-менее так

class TestForManager(unittest.TestCase):
  def testAddingBlah(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlah(...)
    self.assertEquals(manager.getBlahs(), 1)

  def testAddingBlahInDifferentWay(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlahInDifferentWay(...)
    self.assertEquals(manager.getBlahs(), 1)

Теперь первое утверждение второго теста завершается ошибкой, поскольку состояние базы данных сохраняется между вызовами теста, и в базе уже есть экземпляр Blah.

Ответы [ 5 ]

44 голосов
/ 12 января 2009

Как всегда, решение тривиально: используйте django.test.TestCase, а не unittest.TestCase. И это работает во всех основных версиях Django!

1 голос
/ 14 декабря 2010

Вы можете использовать метод tearDown. Он будет вызван после запуска вашего теста. Вы можете удалить все Blahs там.

0 голосов
/ 21 февраля 2019

Сделайте их в двух разных функциях, обе не являются тестовой функцией. Наконец, вызовите зависимые функции из одной тестовой функции.

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

Для очистки баз данных не по умолчанию добавьте multi_db = True в класс

например

class MyTestCase(django.test.TestCase)
    multi_db = True

    def test_one(self):
        self.assertTrue(True)
0 голосов
/ 12 января 2009

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

class TestOneForManager(unittest.TestCase):
  def testAddingBlah(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlah(...)
    self.assertEquals(manager.getBlahs(), 1)

class TestTwoForManager(unittest.TestCase):
  def testAddingBlahInDifferentWay(self):
    manager = Manager()
    self.assertEquals(manager.getBlahs(), 0)
    manager.addBlahInDifferentWay(...)
    self.assertEquals(manager.getBlahs(), 1)

Редактировать . Функция «сброс на TestCase» дает вам полный контроль.

  • Многие методы тестирования в одном TestCase хороши, когда у вас есть тестовые случаи, которые не мешают друг другу.

  • Немного методов тестирования в одном TestCase хороши, когда у вас есть тестовые случаи, которые мешают друг другу.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...