Очистка базы данных в django перед каждым методом тестирования

По умолчанию, когда 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.

Ответы

Ответ 1

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

Ответ 2

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

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)

Edit. Функция "reset on TestCase" дает вам полный контроль.

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

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

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

Ответ 3

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